/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 погляд
Поміняйте місцями кроки 2 і 3, і зміщення за каретом вимірюватиметься від вашого повороту замість їхнього.
Карет проти тильди
~ ~ ~— relative to позиція, вирівняна за осями світу^ ^ ^— relative to напрямок: ліворуч, угору, вперед
Ось чому координати з каретом 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 з тієї самої форми.