/execute: ทำไมลำดับของ as/at ถึงสำคัญ และ store ทำงานอย่างไร
execute chain ที่ผิดพลาดส่วนใหญ่มาจากการสับสนระหว่าง "ใคร" เป็นผู้รันคำสั่ง กับ "ที่ไหน" ที่คำสั่งรัน นี่คือสิ่งที่แต่ละ subcommand เปลี่ยนแปลง และลำดับที่ถูกต้อง
/execute เป็นคำสั่งเดียวที่แกล้งทำเป็นภาษาสคริปต์ ความล้มเหลวเกือบทั้งหมดเกิดจากสอง subcommand ที่ฟังดูเหมือนทำสิ่งเดียวกันแต่ไม่ใช่
as เปลี่ยน "ใคร" (WHO) at เปลี่ยน "ที่ไหน" (WHERE)
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 เป็นข้อผิดพลาดที่พบบ่อยที่สุด
ลำดับคือจากซ้ายไปขวา และมันจะสะสม
Subcommand จะทำงานตามลำดับ โดยแต่ละอันจะปรับเปลี่ยนบริบทที่อันถัดไปเห็น:
execute as @a at @s positioned ^ ^ ^3 run particle flame
as @a— หนึ่งรอบต่อผู้เล่นat @s— ย้ายไปยังผู้เล่นนั้นpositioned ^ ^ ^3— 3 บล็อกข้างหน้าจากตำแหน่งที่พวกเขากำลัง มองอยู่
สลับขั้นตอนที่ 2 และ 3 และการชดเชยด้วยเครื่องหมาย caret จะวัดจากการหมุนของคุณแทนที่จะเป็นการหมุนของพวกเขา
Caret เทียบกับ Tilde
~ ~ ~— สัมพันธ์กับ ตำแหน่ง จัดแนวตามแกนโลก^ ^ ^— สัมพันธ์กับ ทิศทางที่หันหน้า: ซ้าย, บน, หน้า
พิกัด Caret เป็นเหตุผลที่ positioned ^ ^ ^3 หมายถึง "ข้างหน้า" และ ~ ~ ~3 หมายถึง "3 บล็อกไปทางใต้" การผสมสัญลักษณ์ทั้งสองในพิกัดสามตัวเดียวกันเป็นข้อผิดพลาดทางไวยากรณ์
store คือค่าที่ส่งคืน ไม่ใช่ตัวแปร
store จับค่าที่คำสั่ง ส่งคืน — โดยปกติคือจำนวนความสำเร็จหรือค่าผลลัพธ์:
execute store result score @s Count run data get entity @s Inventory
สองสิ่งที่คนมักเข้าใจผิด:
resultเทียบกับsuccessresultคือตัวเลขที่คำสั่งสร้างขึ้น;successคือ 1 หรือ 0 ว่าคำสั่งรันหรือไม่ การนับเอนทิตีต้องใช้resultstoreมาก่อนrunและใช้กับคำสั่งหลังrunไม่ใช่กับ subcommand chain
if เทียบกับ unless short-circuits
if และ unless ทำหน้าที่กรอง — chain จะหยุดลงเมื่อการทดสอบล้มเหลว if หลาย clause คือ AND ไม่มี OR; ต้องใช้สองคำสั่งแยกกันหรือ predicate
execute as @a if entity @s[gamemode=survival] if score @s Lives matches 1.. run ...
สร้าง chain ทีละ subcommand โดยมีบริบทแสดงในแต่ละขั้นตอน ใน Advanced Command Builder — ซึ่งครอบคลุม data, item, loot, schedule, particle และ playsound จากฟอร์มเดียวกันด้วย