/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
as @a— หนึ่งรอบต่อผู้เล่นหนึ่งคนat @s— ย้ายไปที่ผู้เล่นคนนั้น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เทียบกับsuccessresultคือตัวเลขที่คำสั่งผลิตออกมา ส่วนsuccessคือ 1 หรือ 0 ว่ามันรันหรือไม่ การนับเอนทิตีต้องใช้resultstoreวางไว้ก่อน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 ด้วย