/execute: vì sao thứ tự as/at lại quan trọng và cách store thực sự hoạt động
Hầu hết các chuỗi execute bị hỏng đều bắt nguồn từ việc nhầm lẫn giữa ai chạy lệnh và lệnh chạy ở đâu. Đây là những gì mỗi lệnh con thay đổi, và thứ tự giúp khắc phục điều đó.
/execute là một lệnh đội lốt ngôn ngữ kịch bản. Gần như mọi lỗi đều bắt nguồn từ hai lệnh con nghe có vẻ giống nhau nhưng thực chất không hề giống.
as thay đổi AI. at thay đổi Ở ĐÂU.
as <target>— hoán đổi người thực thi.@sgiờ đây nghĩa là thực thể đó. Vị trí không thay đổi.at <target>— hoán đổi vị trí, góc xoay và chiều không gian. Người thực thi không thay đổi.
Vậy nên lệnh này chẳng làm được gì hữu ích:
execute as @e[type=zombie] run setblock ~ ~ ~ stone
Nó chạy một lần cho mỗi thây ma, nhưng luôn tại chân của bạn, nên nó đặt mãi một khối ở cùng một chỗ. Cách sửa là dùng cả hai:
execute as @e[type=zombie] at @s run setblock ~ ~ ~ stone
at @s neo lại vào thây ma mà as vừa chọn. as … at @s là cặp lệnh phổ biến nhất trong toàn bộ lệnh, và quên at @s là lỗi phổ biến nhất.
Thứ tự chạy từ trái sang phải, và nó cộng dồn
Các lệnh con chạy tuần tự, mỗi lệnh sửa đổi ngữ cảnh mà lệnh kế tiếp nhìn thấy:
execute as @a at @s positioned ^ ^ ^3 run particle flame
as @a— một lượt cho mỗi người chơiat @s— di chuyển đến người chơi đópositioned ^ ^ ^3— 3 khối về phía trước nơi họ đang nhìn
Đổi chỗ bước 2 và 3 thì positioned ^ ^ ^3 được tính từ vị trí và hướng nhìn của bạn — rồi at @s vứt bỏ nó bằng cách bật ngược về người chơi, nên phần dịch chuyển bị mất hoàn toàn.
Dấu mũ so với dấu ngã
~ ~ ~— tương đối theo vị trí, căn theo các trục của thế giới^ ^ ^— tương đối theo hướng nhìn: trái, lên, tới trước
Tọa độ dấu mũ là lý do positioned ^ ^ ^3 nghĩa là "phía trước" còn ~ ~ ~3 nghĩa là "3 khối về phía nam". Trộn hai ký hiệu này trong cùng một bộ ba tọa độ là lỗi cú pháp.
store là giá trị trả về, không phải biến
store ghi lại những gì lệnh trả về — thường là số lần thành công hoặc một giá trị kết quả:
execute store result score @s Count run data get entity @s Inventory
Hai điều người ta hay làm sai:
resultso vớisuccess.resultlà con số mà lệnh tạo ra;successlà 1 hoặc 0 cho biết lệnh có chạy hay không. Đếm thực thể cầnresult.stoređứng trướcrun, và nó áp dụng cho lệnh saurun, chứ không phải cho chuỗi lệnh con.
if so với unless ngắt mạch
if và unless lọc — chuỗi dừng ngay đó khi phép kiểm tra thất bại. Nhiều mệnh đề if là một phép AND. Không có OR; muốn vậy cần hai lệnh riêng biệt hoặc một predicate.
execute as @a if entity @s[gamemode=survival] if score @s Lives matches 1.. run ...
Hãy dựng chuỗi lệnh từng lệnh con một, với ngữ cảnh hiển thị ở mỗi bước, trong Trình tạo lệnh nâng cao — công cụ này cũng hỗ trợ data, item, loot, schedule, particle và playsound từ cùng một biểu mẫu.