คำสั่ง execute

execute ไม่ได้ทำอะไรด้วยตัวเอง หน้าที่ของมันคือเปลี่ยนบริบทให้คำสั่งอื่น ว่าใครเป็นคนสั่ง สั่งจากตรงไหน และจะสั่งก็ต่อเมื่อเงื่อนไขเป็นจริง

โครงของคำสั่ง

ทุกคำสั่ง execute จบด้วยคำว่า run แล้วตามด้วยคำสั่งจริงที่อยากให้ทำงาน ส่วนที่อยู่ระหว่าง execute กับ run คือตัวปรับบริบท ใส่กี่ตัวก็ได้

execute as @a at @s run say สวัสดี
  • as @a — เปลี่ยนว่า "ใคร" เป็นคนสั่ง คราวนี้คือผู้เล่นทุกคน ทีละคน
  • at @s — เปลี่ยนว่า "ที่ไหน" คือตำแหน่งของคนที่กำลังเป็นคนสั่งอยู่
  • run say สวัสดี — คำสั่งจริงที่จะทำงาน

as กับ at ต่างกันอย่างไร

นี่คือจุดที่คนสับสนมากที่สุด สองคำนี้ดูคล้ายกันแต่เปลี่ยนคนละอย่าง และแยกจากกันได้จริง

คำเปลี่ยนอะไรมีผลกับ
as ตัวตนของผู้สั่ง ค่าของ @s ในคำสั่งที่ตามมา
at ตำแหน่งและทิศทางที่อ้างอิง ค่าของ ~ และ ^ ในคำสั่งที่ตามมา

ใส่ as อย่างเดียวโดยไม่ใส่ at เป็นความผิดพลาดที่พบบ่อยที่สุด เพราะตัวตนเปลี่ยนแล้ว แต่ตำแหน่งยังเป็นของคอมมานด์บล็อกอยู่ ทำให้ ~ ~ ~ ไปโผล่ที่บล็อกแทนที่จะเป็นที่ผู้เล่น จำง่ายๆ ว่าถ้าใช้ as แล้วในคำสั่งมี ~ ให้ใส่ at @s ต่อท้ายเสมอ

ลำดับสำคัญ

ตัวปรับบริบทถูกอ่านจากซ้ายไปขวา แต่ละตัวทำงานบนบริบทที่ตัวก่อนหน้าสร้างไว้ สลับที่แล้วผลเปลี่ยนจริง

  • execute as @a at @s run ... — เลือกผู้เล่นทีละคน แล้วย้ายตำแหน่งไปที่คนนั้น ผลคือทำงานที่ตัวผู้เล่นแต่ละคน
  • execute at @a as @s run ... — ย้ายตำแหน่งไปที่ผู้เล่นทีละคน แต่ตัวตนยังเป็นตัวเดิม ผลจึงไม่เหมือนกัน

รูปแบบที่ถูกต้องเกือบทุกครั้งคือ as ก่อน at ทีหลัง

ตั้งเงื่อนไขด้วย if และ unless

if ทำงานเมื่อเงื่อนไขเป็นจริง ส่วน unless ทำงานเมื่อเงื่อนไขไม่เป็นจริง ใส่ต่อกันหลายเงื่อนไขได้ และทุกเงื่อนไขต้องผ่านหมดคำสั่งถึงจะทำงาน

เงื่อนไขตรวจอะไร
if blockบล็อกที่พิกัดหนึ่งเป็นชนิดที่ระบุหรือไม่
if entityมีเอนทิตีที่ตรงกับตัวเลือกเป้าหมายอยู่หรือไม่
if scoreคะแนนใน scoreboard ตรงตามที่กำหนดหรือไม่

ตัวอย่างที่ใช้บ่อยที่สุดคือ ตรวจว่าผู้เล่นยืนอยู่บนบล็อกอะไร ซึ่งเป็นวิธีทำแผ่นตรวจจับแบบมองไม่เห็น

execute as @a at @s if block ~ ~-1 ~ minecraft:gold_block run effect give @s minecraft:jump_boost 5 1

สังเกตว่า ~-1 คือหนึ่งบล็อกใต้เท้า ซึ่งคือบล็อกที่กำลังยืนอยู่ ไม่ใช่ ~ ~ ~ ที่เป็นตำแหน่งของตัวผู้เล่นเอง

positioned ใช้ตอนไหน

positioned ย้ายจุดอ้างอิงไปที่พิกัดที่ระบุ ต่างจาก at ตรงที่ at ย้ายไปหาเอนทิตี ส่วน positioned ย้ายไปหาพิกัดตรงๆ

  • ใช้ตอนอยากให้คำสั่งทำงานที่จุดหนึ่งโดยไม่ต้องมีเอนทิตีอยู่ตรงนั้น
  • ต่อกับ at ได้ เช่น at @s positioned ~ ~5 ~ คือเหนือหัวผู้เล่นห้าบล็อก

ปัญหาที่เจอบ่อย

อาการสาเหตุ
ทำงานแต่ไปเกิดผลที่คอมมานด์บล็อก ใส่ as แล้วลืมใส่ at @s
เงียบสนิท ไม่มี error เงื่อนไข if ไม่เป็นจริง ซึ่งไม่ถือว่าเป็นข้อผิดพลาด
ขึ้นสีแดงตรงท้ายคำสั่ง ลืมคำว่า run ก่อนคำสั่งจริง
@s ในคำสั่งท้ายไม่ตรงกับใคร ไม่ได้ใส่ as มาก่อน @s จึงยังเป็นคอมมานด์บล็อกซึ่งไม่ใช่ผู้เล่น

เครื่องมือที่เกี่ยวข้อง

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

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