MC Toolkit

คู่มือ / คำสั่งและข้อมูล

/execute: ทำไมลำดับ as/at ถึงสำคัญ และ store ทำงานอย่างไรจริง ๆ

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

/execute เป็นคำสั่งเดียวที่แสร้งทำตัวเป็นภาษาสคริปต์ ความล้มเหลวเกือบทั้งหมดสืบย้อนไปถึงคำสั่งย่อยสองตัวที่ฟังดูเหมือนทำสิ่งเดียวกัน แต่ไม่ใช่

as เปลี่ยนว่าใคร at เปลี่ยนว่าที่ไหน

  • as <target> — สลับผู้รัน @s ตอนนี้หมายถึงเอนทิตี้นั้น ตำแหน่งไม่ขยับ
  • at <target> — สลับตำแหน่ง การหมุน และมิติ ผู้รันไม่เปลี่ยน

ดังนั้นคำสั่งนี้ไม่ได้ทำอะไรที่มีประโยชน์:

execute as @e[type=zombie] run setblock ~ ~ ~ stone

มันรันหนึ่งครั้งต่อซอมบี้หนึ่งตัว แต่รันที่เท้าของคุณเสมอ จึงวางบล็อกซ้ำที่เดิมเรื่อย ๆ วิธีแก้คือใช้ทั้งสองอย่าง:

execute as @e[type=zombie] at @s run setblock ~ ~ ~ stone

at @s ยึดกลับไปที่ซอมบี้ที่ as เพิ่งเลือก as … at @s คือคู่ที่พบบ่อยที่สุดในคำสั่งทั้งหมด และการลืม at @s คือบั๊กที่พบบ่อยที่สุด

ลำดับเป็นซ้ายไปขวา และมันทบกัน

คำสั่งย่อยรันตามลำดับ โดยแต่ละตัวปรับบริบทที่ตัวถัดไปเห็น:

execute as @a at @s positioned ^ ^ ^3 run particle flame
  1. as @a — หนึ่งรอบต่อผู้เล่นหนึ่งคน
  2. at @s — ย้ายไปที่ผู้เล่นคนนั้น
  3. positioned ^ ^ ^3 — 3 บล็อกข้างหน้าจุดที่พวกเขามองอยู่

สลับขั้นที่ 2 กับ 3 แล้ว positioned ^ ^ ^3 จะคำนวณจากตำแหน่งและทิศทางของคุณ — จากนั้น at @s จะทิ้งค่านั้นโดยดีดกลับไปที่ผู้เล่น ทำให้ออฟเซ็ตหายไปทั้งหมด

เครื่องหมาย ^ กับ ~

  • ~ ~ ~ — สัมพันธ์กับตำแหน่ง จัดแนวกับแกนของโลก
  • ^ ^ ^ — สัมพันธ์กับทิศทางที่หันหน้า: ซ้าย ขึ้น ไปข้างหน้า

พิกัดแบบ ^ คือเหตุผลที่ positioned ^ ^ ^3 หมายถึง "ข้างหน้า" และ ~ ~ ~3 หมายถึง "ไปทางใต้ 3 บล็อก" การผสมสองรูปแบบในชุดพิกัดเดียวเป็น syntax error

store คือค่าที่คืนกลับ ไม่ใช่ตัวแปร

store ดักจับสิ่งที่คำสั่งคืนกลับมา — ปกติคือจำนวนความสำเร็จหรือค่าผลลัพธ์:

execute store result score @s Count run data get entity @s Inventory

มีสองจุดที่คนมักเข้าใจผิด:

  • result เทียบกับ success result คือตัวเลขที่คำสั่งผลิตออกมา ส่วน success คือ 1 หรือ 0 ว่ามันรันหรือไม่ การนับเอนทิตีต้องใช้ result
  • store วางไว้ก่อน run และมันมีผลกับคำสั่งที่อยู่หลัง run ไม่ใช่กับสายคำสั่งย่อย

if กับ unless ตัดวงจร

if และ unless ทำหน้าที่กรอง — สายคำสั่งหยุดตรงนั้นเมื่อการทดสอบล้มเหลว หลายอนุประโยค if คือ AND ไม่มี OR ซึ่งต้องใช้สองคำสั่งแยกกันหรือเพรดิเคต

execute as @a if entity @s[gamemode=survival] if score @s Lives matches 1.. run ...

สร้างสายคำสั่งทีละคำสั่งย่อย โดยดูบริบทที่แสดงในแต่ละขั้น ใน Advanced Command Builder — ฟอร์มเดียวกันยังรองรับ data, item, loot, schedule, particle และ playsound ด้วย

ตัวสร้างคำสั่งขั้นสูง — Execute และ Data →

คู่มือเพิ่มเติม

ดูทั้งหมด →