Руководства / Команды и данные
/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 отбросит его, привязываясь обратно к игроку, так что смещение потеряется полностью.
Caret против тильды
~ ~ ~— относительно позиции, выровнено по осям мира^ ^ ^— относительно направления взгляда: влево, вверх, вперёд
Координаты с caret — причина, по которой positioned ^ ^ ^3 означает «перед», а ~ ~ ~3 — «3 блока на юг». Смешивать обе нотации в одной тройке координат — синтаксическая ошибка.
store — это возвращаемое значение, а не переменная
store захватывает то, что команда возвращает — обычно счётчик успехов или значение результата:
execute store result score @s Count run data get entity @s Inventory
Две вещи, в которых люди ошибаются:
resultпротивsuccess.result— это число, которое выдаёт команда;success— это 1 или 0 в зависимости от того, выполнилась ли она. Для подсчёта сущностей нуженresult.storeставится передrun, и он применяется к команде послеrun, а не к цепочке подкоманд.
if против unless — короткое замыкание
if и unless фильтруют — цепочка останавливается на них, если проверка не прошла. Несколько условий if — это И. ИЛИ нет; для него нужны две отдельные команды или предикат.
execute as @a if entity @s[gamemode=survival] if score @s Lives matches 1.. run ...
Собирайте цепочку по одной подкоманде за раз, с отображением контекста на каждом шаге, в Advanced Command Builder — там же разбираются data, item, loot, schedule, particle и playsound в той же форме.