Content Patcher คืออะไร และเริ่มสร้างมอดอย่างไร
เรียนรู้ Content Patcher สำหรับสร้างมอด Stardew Valley โดยไม่ต้องเขียน C# ทั้งโครงสร้างโฟลเดอร์ manifest.json, content.json, EditData, ConfigSchema และคำสั่งทดสอบใน SMAPI
เขียนโดย Pokpong Limpaphan · อัปเดต
สถานะการตรวจสอบ: ตรวจกับเอกสารทางการแล้ว
เนื้อหาตรวจสอบกับเอกสารทางการแล้ว แต่ยังไม่ได้ทดสอบในเกมจริงทุกขั้นตอน (ตรวจล่าสุด )
ตรวจกับ: Content Patcher author guide (Format 2.9.0), SMAPI manifest documentation
ตัวอย่าง EditData ของ Moss Soup มาจากเอกสารทางการของ Content Patcher ยังไม่ได้ทดสอบในเกมจริงในระบบที่ใช้เขียนบทความ
สิ่งที่จะได้เรียนรู้
- เข้าใจหน้าที่ของ Content Patcher และ content pack
- สร้าง content pack ที่มี manifest.json และ content.json ถูกต้อง
- ใช้ EditData แก้ข้อมูลในเกม และใช้ ConfigSchema ให้ผู้เล่นเปิดปิดได้
- ทดสอบ patch ด้วยคำสั่ง patch summary
สิ่งที่ต้องมีก่อนเริ่ม
- ติดตั้ง SMAPI แล้ว (ดูบท "ติดตั้งเครื่องมือบน PC")
- ติดตั้งมอด Content Patcher ในโฟลเดอร์ Mods
- โปรแกรมแก้ไขข้อความ เช่น Visual Studio Code
สารบัญ
- Content Patcher ทำงานอย่างไร
- ขั้นที่ 1: สร้างโฟลเดอร์
- ขั้นที่ 2: manifest.json
- ขั้นที่ 3: content.json
- Action ที่ใช้บ่อย
- ขั้นที่ 4: ให้ผู้เล่นเปิดปิดได้ด้วย ConfigSchema
- ขั้นที่ 5: ทดสอบในเกม
- เรื่องลิขสิทธิ์ของ asset
- แก้ปัญหาที่พบบ่อย
- content pack ไม่ขึ้นในรายการที่โหลด
- Content Patcher เตือนว่า Format ไม่รองรับ
- patch ไม่ทำงาน
- JSON ผิดรูปแบบ
- ขั้นต่อไป
Content Patcher เป็นมอด framework ที่ให้เราแก้ข้อมูล รูปภาพ และแผนที่ของเกมด้วยไฟล์ JSON โดยไม่ต้องเขียนหรือคอมไพล์โค้ด มอดที่เปลี่ยนหน้าตาตัวละคร เพิ่มบทสนทนา หรือปรับสมดุลของไอเท็มจำนวนมากสร้างด้วยวิธีนี้
Content Patcher ทำงานอย่างไร
- เกมเก็บข้อมูลไว้เป็น asset เช่น
Data/Objects(ข้อมูลไอเท็ม) หรือPortraits/Abigail(รูปตัวละคร) - content pack ของเราระบุว่าจะแก้ asset ไหน แก้อย่างไร ในไฟล์
content.json - ขณะเล่น Content Patcher อ่านไฟล์ของเรา แล้วแก้ asset ให้ตอนที่เกมโหลดข้อมูล
ไฟล์ของเกมจริงไม่ถูกแก้เลย ถ้าลบมอดออก เกมก็กลับเป็นเหมือนเดิม
flowchart LR
G["เกมขอ asset เช่น Data/Objects"] --> CP["Content Patcher"]
CP --> W{"เงื่อนไข When ตรง?"}
W -- ใช่ --> P["ใช้ patch จาก content.json"]
W -- ไม่ --> O["ใช้ข้อมูลเดิม"]
P --> R["เกมได้ asset ที่แก้แล้ว"]
O --> R
ขั้นที่ 1: สร้างโฟลเดอร์
สร้างโฟลเดอร์ใหม่ใน Stardew Valley/Mods ชุมชนนิยมขึ้นต้นชื่อด้วย [CP] เพื่อบอกว่าเป็น content pack ของ Content Patcher
- Mods/
- [CP] My First Content Pack/
- content.json
- manifest.json
- ContentPatcher/
ขั้นที่ 2: manifest.json
{
"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"
}
}
ความต่างจากมอด C# คือใช้ ContentPackFor แทน EntryDll และ UniqueID ใน ContentPackFor ต้องเป็น Pathoschild.ContentPatcher เสมอ
ขั้นที่ 3: content.json
{
"Format": "2.9.0",
"Changes": [
{
"Action": "EditData",
"Target": "Data/Objects",
"Fields": {
"MossSoup": {
"Price": 80
}
}
}
]
}
Formatบอกว่าไฟล์นี้เขียนตามรูปแบบของ Content Patcher เวอร์ชันไหน ให้ใช้เวอร์ชันล่าสุดที่เอกสารแนะนำ (ขณะเขียนคือ2.9.0) และอย่าเปลี่ยนเลขนี้ภายหลังโดยไม่ได้อ่าน migration guideChangesคือรายการ patch แต่ละ patch มีActionบอกประเภทการแก้Targetคือ asset ที่จะแก้Fieldsแก้เฉพาะบาง field ของรายการที่มีอยู่แล้ว ในตัวอย่างคือเปลี่ยนPriceของไอเท็มMossSoupเป็น 80
ตัวอย่างนี้มาจากเอกสารทางการของ Content Patcher
Action ที่ใช้บ่อย
| Action | ใช้ทำอะไร |
|---|---|
Load |
แทนที่ asset ทั้งไฟล์ด้วยไฟล์ของเรา |
EditData |
เพิ่มหรือแก้รายการในข้อมูล (ใช้ Entries เพิ่มหรือแทนรายการ, Fields แก้บาง field) |
EditImage |
แก้บางส่วนของรูป หรือวางรูปทับ |
EditMap |
แก้แผนที่ เช่น tile หรือ property |
Include |
ดึง patch จากไฟล์ JSON อื่นมารวม ช่วยแบ่งไฟล์ให้อ่านง่าย |
ขั้นที่ 4: ให้ผู้เล่นเปิดปิดได้ด้วย ConfigSchema
{
"Format": "2.9.0",
"ConfigSchema": {
"EnablePriceChange": {
"AllowValues": "true, false",
"Default": "true"
}
},
"Changes": [
{
"LogName": "Change Moss Soup price",
"Action": "EditData",
"Target": "Data/Objects",
"Fields": {
"MossSoup": { "Price": 80 }
},
"When": {
"EnablePriceChange": "true"
}
}
]
}
ConfigSchemaประกาศตัวเลือกให้ผู้เล่นตั้งค่า เมื่อเปิดเกมครั้งแรก Content Patcher จะสร้างไฟล์config.jsonในโฟลเดอร์มอดให้เองWhenกำหนดเงื่อนไขว่า patch นี้จะทำงานเมื่อไรLogNameเป็นชื่อที่แสดงใน log ช่วยให้หา patch ที่มีปัญหาได้ง่าย
ไฟล์นี้เหมือนกับที่ Content Patcher Starter และ Mod Generator สร้างให้
ขั้นที่ 5: ทดสอบในเกม
- เปิดเกมผ่าน SMAPI แล้วดูว่ามีชื่อ content pack ในรายการ
Loaded N content packs - พิมพ์คำสั่งนี้ในหน้าต่าง SMAPI console
patch summary
คำสั่งนี้แสดงทุก patch และสถานะว่าทำงานแล้วหรือไม่ ถ้า patch ไม่ทำงานจะบอกเหตุผล เช่น เงื่อนไข When ไม่ตรง
- ระหว่างแก้ไฟล์ ใช้คำสั่งนี้โหลด content pack ใหม่โดยไม่ต้องปิดเกม
patch reload YourName.MyFirstContentPack
เรื่องลิขสิทธิ์ของ asset
ถ้าจะใช้ Load หรือ EditImage กับรูปภาพ ให้ใช้รูปที่วาดเองหรือมีสิทธิ์ใช้ อย่าแจกไฟล์ภาพที่ดึงออกมาจากเกมตรง ตัวอย่างของ SVMT จึงใช้ EditData ซึ่งไม่ต้องแนบไฟล์ของเกม
แก้ปัญหาที่พบบ่อย
content pack ไม่ขึ้นในรายการที่โหลด
- ตรวจว่าติดตั้ง Content Patcher แล้ว ถ้าไม่ได้ติดตั้ง SMAPI จะข้าม content pack พร้อมบอกว่า
requires mods which aren't installed - ตรวจว่า
manifest.jsonอยู่ในโฟลเดอร์ระดับแรกของมอด ไม่ได้ซ้อนอยู่ในโฟลเดอร์ย่อยอีกชั้น
Content Patcher เตือนว่า Format ไม่รองรับ
แปลว่า Content Patcher ที่ติดตั้งเก่ากว่าเลข Format ให้อัปเดต Content Patcher เป็นเวอร์ชันล่าสุด
patch ไม่ทำงาน
ใช้ patch summary ดูเหตุผล สาเหตุที่พบบ่อยคือสะกด Target หรือ ID ผิด (ตัวพิมพ์เล็กใหญ่มีผล) และเงื่อนไข When ไม่ตรง
JSON ผิดรูปแบบ
ข้อผิดพลาดที่เจอบ่อยคือขาดเครื่องหมายจุลภาค มีวงเล็บเกิน หรือใช้เครื่องหมายคำพูดแบบโค้ง (“ ”) แทน " ตรวจ manifest.json ได้ด้วย Manifest Validator และดูตำแหน่งบรรทัดที่ผิดจาก log ของ SMAPI
ขั้นต่อไป
- อ่าน author guide ทางการ เพื่อดู token และ action ทั้งหมด
- อยากทำสิ่งที่ Content Patcher ทำไม่ได้ ให้เริ่มเรียน พื้นฐาน C#
- มีปัญหา ใช้ Log Analyzer ตรวจ log
เอกสารอ้างอิง
- Content Patcher author guide(เอกสารทางการ)
- Action EditData(เอกสารทางการ)
- Content Patcher tokens(เอกสารทางการ)
- Content Patcher บน Nexus Mods(เอกสารทางการ)