ทำไมคำสั่ง give ของเวอร์ชันเก่าใช้ไม่ได้

ก็อปคำสั่งจากคลิปเมื่อสองปีก่อนมาแล้วขึ้นสีแดง ทั้งที่สะกดถูกทุกตัว สาเหตุคือไวยากรณ์ของไอเทมถูกเปลี่ยนไปสองครั้งใหญ่ และคำสั่งเก่าไม่ได้แค่ล้าสมัย แต่ใช้ไม่ได้เลย

สามยุคของไวยากรณ์ไอเทม

ช่วงเวอร์ชัน เรียกว่าอะไร หน้าตาโดยรวม
1.13 – 1.20.4 NBT แบบเก่า ข้อมูลอยู่ในปีกกา ต่อท้ายชื่อไอเทม ชื่อกับ Lore ซ้อนอยู่ใน display
1.20.5 – 1.21.4 Component รุ่นแรก ข้อมูลอยู่ในวงเล็บเหลี่ยม แต่ละส่วนมีชื่อของตัวเอง ข้อความยังเป็นสตริง JSON ในเครื่องหมายคำพูด
1.21.5 ขึ้นไป Component รุ่นปัจจุบัน วงเล็บเหลี่ยมเหมือนเดิม แต่ข้อความกลายเป็น NBT ตรงๆ ไม่ใช่สตริง JSON อีกต่อไป

การเปลี่ยนรอบที่สองเป็นจุดที่คนพลาดกันมากที่สุด เพราะทั้งสองแบบใช้วงเล็บเหลี่ยมเหมือนกัน มองผ่านๆ เหมือนใช้ได้ แต่ส่วนที่เป็นข้อความเขียนคนละแบบ

เทียบจากคำสั่งจริง

ด้านล่างคือดาบเพชรติดมนตร์ ตั้งชื่อ ใส่ Lore และไม่แตกหัก ชุดเดียวกันเป๊ะ ที่ถูกสร้างผ่านตัวสร้างคำสั่ง give ของเราในทุกช่วงเวอร์ชัน ไม่ได้พิมพ์ขึ้นมาเอง

Java Edition 1.21.5 ขึ้นไป
/give @p minecraft:diamond_sword[custom_name={text:"ดาบผู้พิทักษ์"},lore=[{text:"ตีแรงกว่าปกติ"},{text:"ของหายาก"}],enchantments={sharpness:5,unbreaking:3},unbreakable={}] 1
Java Edition 1.20.5 - 1.21.4
/give @p minecraft:diamond_sword[minecraft:custom_name='{"text":"ดาบผู้พิทักษ์"}',minecraft:lore=['{"text":"ตีแรงกว่าปกติ"}','{"text":"ของหายาก"}'],minecraft:enchantments={"minecraft:sharpness":5,"minecraft:unbreaking":3},minecraft:unbreakable={}] 1
Java Edition 1.13 - 1.20.4 (NBT แบบเก่า)
/give @p minecraft:diamond_sword{display:{Name:'"ดาบผู้พิทักษ์"',Lore:['"ตีแรงกว่าปกติ"','"ของหายาก"']},Enchantments:[{id:sharpness,lvl:5s},{id:unbreaking,lvl:3s}],Unbreakable:1b} 1
Bedrock Edition (เสถียร)
/give @p minecraft:diamond_sword 1
  • รหัสไอเทมของ Bedrock ไม่ตรงกับ Java เสมอไป กรุณาตรวจสอบว่าไอเทมนี้มีอยู่จริงบน Bedrock
  • ชื่อที่กำหนดเองไม่รองรับในเอดิชัน/เวอร์ชันที่เลือก จึงไม่ได้รวมไว้ในคำสั่ง
  • Lore ไม่รองรับในเอดิชัน/เวอร์ชันที่เลือก จึงไม่ได้รวมไว้ในคำสั่ง
  • การร่ายมนตร์ไม่รองรับในเอดิชัน/เวอร์ชันที่เลือก จึงไม่ได้รวมไว้ในคำสั่ง

จุดที่ต่างกันจริงๆ

เรื่อง 1.13 – 1.20.4 1.20.5 – 1.21.4 1.21.5+
ตัวครอบ { } [ ] [ ]
ชื่อไอเทม display:{Name:...} custom_name='...' custom_name={...}
การร่ายมนตร์ Enchantments:[{id:...,lvl:...}] enchantments={...} enchantments={...}
ข้อความเขียนเป็น สตริงในเครื่องหมายคำพูด สตริง JSON ในเครื่องหมายคำพูด NBT ตรงๆ ไม่มีเครื่องหมายคำพูดครอบ

บรรทัดสุดท้ายคือหัวใจของการเปลี่ยนที่ 1.21.5 ถ้าใส่ผิดแบบ เกมจะไม่ฟ้อง error แต่จะตั้งชื่อไอเทมเป็นข้อความดิบทั้งก้อนแทน กลายเป็นไอเทมที่ชื่อว่า {"text":"..."} จริงๆ

ใช้กับ /summon ด้วยหรือไม่

ใช้ กฎเรื่องข้อความเป็น NBT ตรงๆ ตั้งแต่ 1.21.5 มีผลกับทุกที่ที่ข้อความอยู่ข้างใน NBT ซึ่งรวมถึงชื่อของเอนทิตีในคำสั่ง summon ด้วย

แต่ไม่มีผลกับคำสั่งที่รับข้อความเป็นพารามิเตอร์โดยตรง — อย่าง /tellraw, /title, /bossbar add และ /team modify prefix ยังคงรับเป็น JSON เหมือนเดิม เพราะข้อความไม่ได้อยู่ใน NBT จุดนี้ทำให้หลายคนสับสน

แล้วจะแปลงคำสั่งเก่ายังไง

คำตอบที่ตรงไปตรงมาที่สุดคืออย่าแปลงเอง เพราะการแปลงด้วยมือคือการไล่แก้ทีละวงเล็บ และพลาดง่ายกว่าที่คิด

  1. ดูจากคำสั่งเก่าว่าตั้งใจจะได้อะไร เช่น ไอเทมอะไร ชื่อว่าอะไร มนตร์อะไรบ้าง
  2. เปิดเครื่องมือ give แล้วเลือกช่วงเวอร์ชันที่ใช้อยู่จริง
  3. กรอกสิ่งที่ต้องการลงในฟอร์ม แล้วคัดลอกคำสั่งที่ได้ไปใช้

เครื่องมือจะเลือกไวยากรณ์ตามเวอร์ชันให้เอง และถ้าตัวเลือกไหนใช้ไม่ได้ในเวอร์ชันนั้น มันจะบอกว่าตัดอะไรออกไป แทนที่จะเงียบแล้วให้คำสั่งที่ดูเหมือนถูก

รู้ได้ยังไงว่าเล่นเวอร์ชันไหนอยู่

  • Java Edition — ดูที่มุมของหน้าจอเริ่มเกม หรือในตัวเรียกเกมตรงโปรไฟล์ที่เลือกไว้
  • Bedrock Edition — ดูที่มุมล่างของหน้าจอเริ่มเกม
  • เล่นบนเซิร์ฟเวอร์ของคนอื่น — เวอร์ชันที่สำคัญคือเวอร์ชันของเซิร์ฟเวอร์ ไม่ใช่ของเครื่องเรา ลองถามผู้ดูแล

คู่มืออื่นที่น่าอ่านต่อ

  • พื้นฐานคำสั่ง Minecraft — เริ่มจากศูนย์: เปิด cheats ยังไง พิมพ์คำสั่งที่ไหนได้บ้าง และรู้จักตัวเลือกเป้าหมายกับพิกัดแบบพอใช้งานได้
  • ตัวเลือกเป้าหมายแบบละเอียด — เจาะลึกเงื่อนไขในวงเล็บเหลี่ยม ตั้งแต่ type และ distance ไปจนถึง limit กับ sort และวิธีเช็คว่าทำไมคำสั่งไม่โดนใครเลย
  • พิกัด: ตัวเลข, ~ และ ^ — ทำไม ~ กับ ^ ถึงผสมกันไม่ได้ ทำไมบล็อกไปโผล่ผิดที่ และวิธีเลือกใช้พิกัดแต่ละแบบให้ถูกงาน
  • คอมมานด์บล็อก — เอาคำสั่งที่สร้างไว้ไปรันอัตโนมัติ ทั้งแบบกดครั้งเดียว แบบวนซ้ำ และแบบต่อกันเป็นลูกโซ่
  • ระบบคะแนน scoreboard เบื้องต้น — สร้าง objective ให้เกมนับคะแนนเอง หรือนับเองจากคอมมานด์บล็อก แล้วเอาคะแนนไปใช้เป็นเงื่อนไขของคำสั่งอื่น
  • คำสั่ง execute — คำสั่งที่ทรงพลังที่สุดใน Minecraft อธิบายทีละส่วน ว่า as กับ at ต่างกันยังไง และทำไมสลับลำดับแล้วผลเปลี่ยน
  • คำสั่งไม่ทำงาน แก้ยังไง — ไล่หาสาเหตุทีละขั้นจากข้อความ error ที่เกมขึ้นให้ พร้อมสาเหตุที่เจอบ่อยของแต่ละแบบ