MC Toolkit

Руководства / Команды и данные

/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
  1. as @a — по одному проходу на игрока
  2. at @s — переход к этому игроку
  3. 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 в той же форме.

Продвинутые команды — Execute и Data →

Другие руководства

Смотреть все →