/execute: dlaczego kolejność as/at ma znaczenie i jak działa store
Większość błędów w łańcuchach execute wynika z mylenia tego, kto wykonuje polecenie, z tym, gdzie jest ono wykonywane. Oto, co zmienia każde podpolecenie i kolejność, która to naprawia.
/execute to jedno polecenie udające język skryptowy. Prawie każda awaria wynika z dwóch podpoleceń, które brzmią, jakby robiły to samo, a tak nie jest.
as zmienia KTO. at zmienia GDZIE.
as <target>— zamienia wykonawcę.@soznacza teraz ten byt. **Pozycja
nie zmienia się.**
at <target>— zamienia pozycję, rotację i wymiar. **Wykonawca nie
zmienia się.**
Więc to nie robi nic użytecznego:
execute as @e[type=zombie] run setblock ~ ~ ~ stone
Wykonuje się raz na każdego zombie, ale zawsze u twoich stóp, więc umieszcza jeden blok w kółko. Rozwiązaniem jest użycie obu:
execute as @e[type=zombie] at @s run setblock ~ ~ ~ stone
at @s ponownie zakotwicza się do zombie, którego as właśnie wybrało. as … at @s to najczęstsza para w całym poleceniu, a zapomnienie o at @s to najczęstszy błąd.
Kolejność jest od lewej do prawej i kumuluje się
Podpolecenia wykonują się sekwencyjnie, każde modyfikując kontekst, który widzi następne:
execute as @a at @s positioned ^ ^ ^3 run particle flame
as @a— jedno przejście na każdego Graczaat @s— przesuń się do tego Graczapositioned ^ ^ ^3— 3 bloki przed tym, w co patrzą
Zamień kroki 2 i 3, a przesunięcie karetki będzie mierzone od twojej rotacji zamiast od ich.
Karetka kontra tylda
~ ~ ~— względem pozycji, wyrównane do osi świata^ ^ ^— względem kierunku patrzenia: lewo, góra, przód
Współrzędne karetki są powodem, dla którego positioned ^ ^ ^3 oznacza „przed”, a ~ ~ ~3 oznacza „3 bloki na południe”. Mieszanie obu notacji w jednej trójce współrzędnych jest błędem składniowym.
store to wartość zwracana, a nie zmienna
store przechwytuje to, co polecenie zwraca — zazwyczaj liczbę sukcesów lub wartość wyniku:
execute store result score @s Count run data get entity @s Inventory
Dwie rzeczy, które ludzie źle rozumieją:
resultkontrasuccess.resultto liczba, którą polecenie produkuje;success
to 1 lub 0 w zależności od tego, czy się wykonało. Liczenie bytów wymaga result.
storeidzie przedrun, i dotyczy polecenia porun, a nie łańcucha
podpoleceń.
if kontra unless — krótkie spięcia
if i unless filtrują — łańcuch zatrzymuje się tam, gdy test się nie powiedzie. Wiele klauzul if to AND. Nie ma OR; to wymaga dwóch oddzielnych poleceń lub predykatu.
execute as @a if entity @s[gamemode=survival] if score @s Lives matches 1.. run ...
Buduj łańcuch podpolecenie po podpoleceniu, z kontekstem pokazanym na każdym kroku, w Zaawansowanym Kreatorze Poleceń — obejmuje on również dane, przedmioty, łupy, harmonogram, cząstki i dźwięki z tego samego formularza.