/execute: چرا ترتیب as/at مهم است و store چگونه کار میکند
بیشتر زنجیرههای execute خراب ناشی از اشتباه گرفتن اجراکننده دستور با مکان اجرای آن است. در اینجا آنچه هر زیردستور تغییر میدهد و ترتیبی که آن را اصلاح میکند آمده است.
/execute is one command pretending to be a scripting language. Almost every failure traces to two subcommands that sound like they do the same thing and do not.
as «چه کسی» را تغییر میدهد. at «کجا» را تغییر میدهد.
as <target>— اجراکننده را تغییر میدهد.@snow means that entity. **The position does
حرکت نمیکند.**
at <target>— موقعیت، زاویه چرخش و بعد را تغییر میدهد. **اجراکننده
تغییر نمیکند.**
بنابراین این کار مفیدی انجام نمیدهد:
execute as @e[type=zombie] run setblock ~ ~ ~ stone
به ازای هر زامبی یک بار اجرا میشود، اما همیشه در شما پای شما، بنابراین مدام یک بلوک را در همانجا میگذارد. راهحل هر دو است:
execute as @e[type=zombie] at @s run setblock ~ ~ ~ stone
at @s re-anchors to the zombie that as just selected. as … at @s is the single most common pairing in the whole command، و فراموش کردن at @s is the single most common bug.
ترتیب از چپ به راست است و اثر آن تجمیعی است
زیردستورها به ترتیب اجرا میشوند و هر کدام زمینهای را که زیردستور بعدی میبیند تغییر میدهند:
execute as @a at @s positioned ^ ^ ^3 run particle flame
as @a— one pass per playerat @s— move to that playerpositioned ^ ^ ^3— 3 blocks in front of where they are نگاه کردن
مراحل ۲ و ۳ را جابهجا کنید تا آفست caret به جای چرخش آنها، از زاویه چرخش شما اندازهگیری شود.
Caret در مقابل tilde
~ ~ ~— relative to موقعیت، تراز شده با محورهای جهان^ ^ ^— relative to جهت دید: چپ، بالا، جلو
مختصات Caret دلیل این است که چرا positioned ^ ^ ^3 means "in front of" and ~ ~ ~3 means "3 blocks south". Mixing the two notations in one coordinate triple is a syntax error.
store یک مقدار بازگشتی است، نه یک متغیر
store captures what the command برمیگرداند — معمولاً تعداد موفقیت یا مقدار نتیجه است:
execute store result score @s Count run data get entity @s Inventory
دو موردی که افراد اشتباه متوجه میشوند:
resultversussuccess.resultis the number the command produces;success
برای مشخص کردن اینکه اجرا شده یا نه 1 یا 0 است. شمارش موجودیتها نیاز دارد به result.
storegoes beforerun، و برای دستور بعد ازrun, not to the
زنجیره زیردستور اعمال میشود.
اتصال کوتاه if در مقابل unless
if and unless filter — the chain stops there when the test fails. Multiple if clauses are an AND. There is no OR; that needs two separate commands or a predicate.
execute as @a if entity @s[gamemode=survival] if score @s Lives matches 1.. run ...
زنجیره را زیردستور به زیردستور بسازید، در حالی که زمینه در هر مرحله نمایش داده میشود، در سازنده پیشرفته دستورات — همچنین data، item، loot، schedule، particle و playsound را از همان فرم پوشش میدهد.