ผู้เริ่มต้น35 นาทีบทที่ 5

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 เป็นมอด framework ที่ให้เราแก้ข้อมูล รูปภาพ และแผนที่ของเกมด้วยไฟล์ JSON โดยไม่ต้องเขียนหรือคอมไพล์โค้ด มอดที่เปลี่ยนหน้าตาตัวละคร เพิ่มบทสนทนา หรือปรับสมดุลของไอเท็มจำนวนมากสร้างด้วยวิธีนี้

Content Patcher ทำงานอย่างไร

  1. เกมเก็บข้อมูลไว้เป็น asset เช่น Data/Objects (ข้อมูลไอเท็ม) หรือ Portraits/Abigail (รูปตัวละคร)
  2. content pack ของเราระบุว่าจะแก้ asset ไหน แก้อย่างไร ในไฟล์ content.json
  3. ขณะเล่น 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

Stardew Valley/Mods/
  • 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 guide
  • Changes คือรายการ 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: ทดสอบในเกม

  1. เปิดเกมผ่าน SMAPI แล้วดูว่ามีชื่อ content pack ในรายการ Loaded N content packs
  2. พิมพ์คำสั่งนี้ในหน้าต่าง SMAPI console
patch summary

คำสั่งนี้แสดงทุก patch และสถานะว่าทำงานแล้วหรือไม่ ถ้า patch ไม่ทำงานจะบอกเหตุผล เช่น เงื่อนไข When ไม่ตรง

  1. ระหว่างแก้ไฟล์ ใช้คำสั่งนี้โหลด 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

ขั้นต่อไป

เอกสารอ้างอิง

ค้นหาใน SVMT

กรองตามประเภท

พิมพ์คำที่ต้องการค้นหา (ภาษาไทยหรืออังกฤษ)