ทำไมคำสั่ง 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 ของเราในทุกช่วงเวอร์ชัน ไม่ได้พิมพ์ขึ้นมาเอง
/give @p minecraft:diamond_sword[custom_name={text:"ดาบผู้พิทักษ์"},lore=[{text:"ตีแรงกว่าปกติ"},{text:"ของหายาก"}],enchantments={sharpness:5,unbreaking:3},unbreakable={}] 1
/give @p minecraft:diamond_sword[minecraft:custom_name='{"text":"ดาบผู้พิทักษ์"}',minecraft:lore=['{"text":"ตีแรงกว่าปกติ"}','{"text":"ของหายาก"}'],minecraft:enchantments={"minecraft:sharpness":5,"minecraft:unbreaking":3},minecraft:unbreakable={}] 1
/give @p minecraft:diamond_sword{display:{Name:'"ดาบผู้พิทักษ์"',Lore:['"ตีแรงกว่าปกติ"','"ของหายาก"']},Enchantments:[{id:sharpness,lvl:5s},{id:unbreaking,lvl:3s}],Unbreakable:1b} 1
/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 จุดนี้ทำให้หลายคนสับสน
แล้วจะแปลงคำสั่งเก่ายังไง
คำตอบที่ตรงไปตรงมาที่สุดคืออย่าแปลงเอง เพราะการแปลงด้วยมือคือการไล่แก้ทีละวงเล็บ และพลาดง่ายกว่าที่คิด
- ดูจากคำสั่งเก่าว่าตั้งใจจะได้อะไร เช่น ไอเทมอะไร ชื่อว่าอะไร มนตร์อะไรบ้าง
- เปิดเครื่องมือ give แล้วเลือกช่วงเวอร์ชันที่ใช้อยู่จริง
- กรอกสิ่งที่ต้องการลงในฟอร์ม แล้วคัดลอกคำสั่งที่ได้ไปใช้
เครื่องมือจะเลือกไวยากรณ์ตามเวอร์ชันให้เอง และถ้าตัวเลือกไหนใช้ไม่ได้ในเวอร์ชันนั้น มันจะบอกว่าตัดอะไรออกไป แทนที่จะเงียบแล้วให้คำสั่งที่ดูเหมือนถูก
รู้ได้ยังไงว่าเล่นเวอร์ชันไหนอยู่
- Java Edition — ดูที่มุมของหน้าจอเริ่มเกม หรือในตัวเรียกเกมตรงโปรไฟล์ที่เลือกไว้
- Bedrock Edition — ดูที่มุมล่างของหน้าจอเริ่มเกม
- เล่นบนเซิร์ฟเวอร์ของคนอื่น — เวอร์ชันที่สำคัญคือเวอร์ชันของเซิร์ฟเวอร์ ไม่ใช่ของเครื่องเรา ลองถามผู้ดูแล
คู่มืออื่นที่น่าอ่านต่อ
- พื้นฐานคำสั่ง Minecraft — เริ่มจากศูนย์: เปิด cheats ยังไง พิมพ์คำสั่งที่ไหนได้บ้าง และรู้จักตัวเลือกเป้าหมายกับพิกัดแบบพอใช้งานได้
- ตัวเลือกเป้าหมายแบบละเอียด — เจาะลึกเงื่อนไขในวงเล็บเหลี่ยม ตั้งแต่ type และ distance ไปจนถึง limit กับ sort และวิธีเช็คว่าทำไมคำสั่งไม่โดนใครเลย
- พิกัด: ตัวเลข, ~ และ ^ — ทำไม ~ กับ ^ ถึงผสมกันไม่ได้ ทำไมบล็อกไปโผล่ผิดที่ และวิธีเลือกใช้พิกัดแต่ละแบบให้ถูกงาน
- คอมมานด์บล็อก — เอาคำสั่งที่สร้างไว้ไปรันอัตโนมัติ ทั้งแบบกดครั้งเดียว แบบวนซ้ำ และแบบต่อกันเป็นลูกโซ่
- ระบบคะแนน scoreboard เบื้องต้น — สร้าง objective ให้เกมนับคะแนนเอง หรือนับเองจากคอมมานด์บล็อก แล้วเอาคะแนนไปใช้เป็นเงื่อนไขของคำสั่งอื่น
- คำสั่ง execute — คำสั่งที่ทรงพลังที่สุดใน Minecraft อธิบายทีละส่วน ว่า as กับ at ต่างกันยังไง และทำไมสลับลำดับแล้วผลเปลี่ยน
- คำสั่งไม่ทำงาน แก้ยังไง — ไล่หาสาเหตุทีละขั้นจากข้อความ error ที่เกมขึ้นให้ พร้อมสาเหตุที่เจอบ่อยของแต่ละแบบ