/execute: dlaczego kolejność as/at ma znaczenie i jak naprawdę działa store
Większość zepsutych łańcuchów execute wynika z mylenia tego, kto wykonuje komendę, z tym, gdzie jest wykonywana. Oto co zmienia każda podkomenda i jaka kolejność to naprawia.
/execute to jedna komenda udająca język skryptowy. Niemal każdy błąd sprowadza się do dwóch podkomend, które brzmią, jakby robiły to samo, a nie robią.
as zmienia KTO. at zmienia GDZIE.
as <target>— podmienia wykonawcę.@soznacza teraz ten byt. Pozycja się nie zmienia.at <target>— podmienia pozycję, obrót i wymiar. Wykonawca się nie zmienia.
Więc to nie robi nic pożytecznego:
execute as @e[type=zombie] run setblock ~ ~ ~ stone
Wykonuje się raz na zombie, ale zawsze u twoich stóp, więc stawia jeden blok w kółko. Poprawka to jedno i drugie:
execute as @e[type=zombie] at @s run setblock ~ ~ ~ stone
at @s zakotwicza się na nowo na zombie, które właśnie wybrało as. as … at @s to najczęstsza para w całej komendzie, a zapomnienie at @s to najczęstszy błąd.
Kolejność jest od lewej do prawej i się kumuluje
Podkomendy wykonują się po kolei, każda modyfikuje kontekst, który widzi następna:
execute as @a at @s positioned ^ ^ ^3 run particle flame
as @a— jedno przejście na graczaat @s— przejście do tego graczapositioned ^ ^ ^3— 3 bloki przed tym, na co patrzy
Zamień kroki 2 i 3, a positioned ^ ^ ^3 zostanie wyliczone z twojej pozycji i kierunku — potem at @s to wyrzuca, przeskakując z powrotem do gracza, więc przesunięcie przepada całkowicie.
Caret kontra tylda
~ ~ ~— względem pozycji, wyrównane do osi świata^ ^ ^— względem kierunku patrzenia: lewo, góra, przód
Współrzędne caret są powodem, dla którego positioned ^ ^ ^3 oznacza „z przodu”, a ~ ~ ~3 oznacza „3 bloki na południe”. Mieszanie obu notacji w jednej trójce współrzędnych to błąd składni.
store to wartość zwracana, nie zmienna
store przechwytuje to, co komenda zwraca — zwykle liczbę sukcesów lub wartość wyniku:
execute store result score @s Count run data get entity @s Inventory
Dwie rzeczy, które ludzie robią źle:
resultkontrasuccess.resultto liczba, którą produkuje komenda;successto 1 lub 0 w zależności od tego, czy się wykonała. Liczenie bytów wymagaresult.storeidzie przedruni dotyczy komendy porun, a nie łańcucha podkomend.
if kontra unless działają zwarciowo
if i unless filtrują — łańcuch zatrzymuje się tam, gdy test zawiedzie. Wiele klauzul if to AND. Nie ma OR; do tego potrzeba dwóch osobnych komend albo predykatu.
execute as @a if entity @s[gamemode=survival] if score @s Lives matches 1.. run ...
Buduj łańcuch podkomenda po podkomendzie, z kontekstem pokazywanym na każdym kroku, w Advanced Command Builder — obsługuje też data, item, loot, schedule, particle i playsound z tego samego formularza.