อ้างอิง
อ้างอิง manifest.json ภาษาไทย
อธิบายทุก field ใน manifest.json ของมอด Stardew Valley ตามรูปแบบของ SMAPI ทั้ง field ที่จำเป็น กฎของ UniqueID, EntryDll, ContentPackFor, Dependencies และ UpdateKeys
อัปเดต
สถานะการตรวจสอบ: ตรวจกับเอกสารทางการแล้ว
เนื้อหาตรวจสอบกับเอกสารทางการแล้ว แต่ยังไม่ได้ทดสอบในเกมจริงทุกขั้นตอน (ตรวจล่าสุด )
ตรวจกับ: ManifestValidator.cs ของ SMAPI (สาขา develop), เอกสาร Manifest บน Stardew Valley Wiki
manifest.json คือไฟล์ที่ SMAPI อ่านเป็นอย่างแรกของทุกมอด ถ้าไฟล์นี้ผิด มอดจะไม่ถูกโหลดเลย หน้านี้รวมทุก field พร้อมกฎที่ SMAPI ใช้ตรวจจริง ตรวจไฟล์ของคุณได้ทันทีด้วย Manifest Validator
ตัวอย่างเต็ม
มอด C# (SMAPI mod)
{
"Name": "My First Mod",
"Author": "YourName",
"Version": "1.0.0",
"Description": "My first SMAPI mod.",
"UniqueID": "YourName.MyFirstMod",
"EntryDll": "MyFirstMod.dll",
"MinimumApiVersion": "4.0.0",
"Dependencies": [
{ "UniqueID": "spacechase0.SpaceCore", "MinimumVersion": "1.20.0", "IsRequired": false }
],
"UpdateKeys": ["Nexus:12345"]
}
Content pack (Content Patcher)
{
"Name": "My First Content Pack",
"Author": "YourName",
"Version": "1.0.0",
"Description": "My first Content Patcher content pack.",
"UniqueID": "YourName.MyFirstContentPack",
"UpdateKeys": [],
"ContentPackFor": {
"UniqueID": "Pathoschild.ContentPatcher"
}
}
Field ทั้งหมด
| Field | จำเป็น | ชนิด | ความหมาย |
|---|---|---|---|
Name |
ใช่ | ข้อความ | ชื่อมอดที่ผู้เล่นเห็น ใช้ภาษาไทยได้ |
Version |
ใช่ | ข้อความ | เวอร์ชันแบบ semantic version ห้ามเป็น 0.0.0 |
UniqueID |
ใช่ | ข้อความ | รหัสไม่ซ้ำของมอด |
Author |
ไม่ | ข้อความ | ชื่อผู้สร้าง |
Description |
ไม่ | ข้อความ | คำอธิบายสั้นของมอด |
EntryDll |
อย่างใดอย่างหนึ่ง | ข้อความ | ชื่อไฟล์ .dll ของมอด C# |
ContentPackFor |
อย่างใดอย่างหนึ่ง | object | มอดที่จะอ่าน content pack นี้ |
MinimumApiVersion |
ไม่ | ข้อความ | SMAPI เวอร์ชันต่ำสุดที่มอดต้องการ |
MinimumGameVersion |
ไม่ | ข้อความ | เวอร์ชันเกมต่ำสุดที่มอดต้องการ |
Dependencies |
ไม่ | array | มอดอื่นที่มอดนี้ต้องใช้ |
UpdateKeys |
ไม่ | array | ใช้ให้ SMAPI ตรวจหาเวอร์ชันใหม่ |
กฎที่ SMAPI ตรวจ
กฎเหล่านี้ทำให้มอด ไม่ถูกโหลด ถ้าผิด
- ต้องมี
Name,VersionและUniqueIDถ้าVersionเป็น0.0.0จะนับว่าไม่มี - ต้องมี
EntryDllหรือContentPackForอย่างใดอย่างหนึ่งเท่านั้น EntryDllต้องเป็นชื่อไฟล์ ไม่ใช่ path (ใส่/หรือ\ไม่ได้)- ถ้ามี
ContentPackForต้องมีUniqueIDอยู่ข้างใน UniqueIDใช้ได้เฉพาะตัวอักษรภาษาอังกฤษ ตัวเลข_.และ-- ทุกรายการใน
Dependenciesต้องมีUniqueIDที่ถูกต้องตามกฎข้อ 5
flowchart TD
Q{"มอดมีโค้ด C# ไหม?"}
Q -- มี --> D["ใส่ EntryDll: ชื่อไฟล์ .dll"]
Q -- ไม่มี --> C["ใส่ ContentPackFor: UniqueID ของ framework"]
D --> X["ห้ามใส่ ContentPackFor"]
C --> Y["ห้ามใส่ EntryDll"]
Dependencies
"Dependencies": [
{ "UniqueID": "Pathoschild.ContentPatcher" },
{ "UniqueID": "spacechase0.SpaceCore", "MinimumVersion": "1.20.0" },
{ "UniqueID": "Example.OptionalMod", "IsRequired": false }
]
| Field | ความหมาย |
|---|---|
UniqueID |
UniqueID ของมอดที่ต้องใช้ (จำเป็น) |
MinimumVersion |
เวอร์ชันต่ำสุดที่ยอมรับ ไม่ใส่ก็ได้ |
IsRequired |
true (ค่าเริ่มต้น) คือขาดไม่ได้ false คือใช้ถ้ามี |
ถ้า dependency ที่จำเป็นไม่ได้ติดตั้ง SMAPI จะข้ามมอดพร้อมข้อความ it requires mods which aren't installed ดูความหมายข้อความอื่นที่ ข้อความ error ของ SMAPI
UpdateKeys
รูปแบบคือ เว็บไซต์:ID เว็บไซต์ที่ SMAPI รองรับได้แก่ Nexus, GitHub, ModDrop, CurseForge และ Chucklefish
"UpdateKeys": ["Nexus:12345", "GitHub:YourName/YourRepo"]
ใส่ได้หลังอัปโหลดมอดแล้วเท่านั้น ระหว่างพัฒนาให้เว้นเป็น array ว่าง []
เรื่องรูปแบบ JSON ที่ควรรู้
SMAPI อ่าน JSON ด้วย Json.NET ซึ่งยืดหยุ่นกว่า JSON มาตรฐาน
- เขียนคอมเมนต์
//และ/* */ได้ - มีเครื่องหมายจุลภาคเกินท้ายรายการได้
- ชื่อ field ไม่สนตัวพิมพ์เล็กใหญ่ (
uniqueidก็อ่านได้) แต่ควรเขียนตามรูปแบบมาตรฐานเพื่อให้อ่านง่าย - field ที่ SMAPI ไม่รู้จักจะถูกเก็บไว้เฉย ไม่ทำให้เกิด error จึงต้องระวังการสะกดผิด เพราะ SMAPI จะไม่เตือน
ข้อผิดพลาดที่พบบ่อย
| สิ่งที่เขียน | ปัญหา | ที่ถูก |
|---|---|---|
"UniqueID": "my mod" |
มีช่องว่าง | "UniqueID": "YourName.MyMod" |
"Version": "v1.0" |
มีตัว v นำหน้า |
"Version": "1.0.0" |
"EntryDll": "bin/MyMod.dll" |
เป็น path | "EntryDll": "MyMod.dll" |
มีทั้ง EntryDll และ ContentPackFor |
ใช้พร้อมกันไม่ได้ | เลือกอย่างใดอย่างหนึ่ง |
"IsRequired": "false" |
เป็นข้อความ | "IsRequired": false |