/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 означает "впереди", а ~ ~ ~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 ...
Создавайте цепочку по одной подкоманде, с контекстом, показанным на каждом шаге, в Расширенном конструкторе команд — он также охватывает данные, предметы, лут, расписание, частицы и звуки из той же формы.