/execute: por que a ordem as/at importa e como o store realmente funciona
A maioria das cadeias de execute quebradas vem de confundir quem executa o comando com onde ele é executado. Veja o que cada subcomando altera e qual ordem resolve o problema.
/execute é um único comando fingindo ser uma linguagem de script. Quase toda falha vem de dois subcomandos que parecem fazer a mesma coisa, mas não fazem.
as muda QUEM. at muda ONDE.
as <target>— troca o executor.@sagora significa aquela entidade. A posição não se move.at <target>— troca a posição, a rotação e a dimensão. O executor não muda.
Então isto não faz nada de útil:
execute as @e[type=zombie] run setblock ~ ~ ~ stone
Ele roda uma vez por zumbi, mas sempre aos seus pés, então coloca um bloco em cima do outro repetidamente. A correção é usar os dois:
execute as @e[type=zombie] at @s run setblock ~ ~ ~ stone
at @s reancora no zumbi que as acabou de selecionar. as … at @s é a combinação mais comum em todo o comando, e esquecer at @s é o bug mais comum.
A ordem é da esquerda para a direita, e ela se acumula
Os subcomandos rodam em sequência, cada um modificando o contexto que o próximo enxerga:
execute as @a at @s positioned ^ ^ ^3 run particle flame
as @a— uma passagem por jogadorat @s— move até aquele jogadorpositioned ^ ^ ^3— 3 blocos à frente de onde ele está olhando
Inverta os passos 2 e 3 e positioned ^ ^ ^3 será calculado a partir da sua posição e direção — depois at @s joga isso fora ao voltar para o jogador, então o deslocamento se perde por completo.
Circunflexo versus til
~ ~ ~— relativo à posição, alinhado aos eixos do mundo^ ^ ^— relativo à direção: esquerda, cima, frente
As coordenadas com circunflexo são o motivo de positioned ^ ^ ^3 significar "à frente" e ~ ~ ~3 significar "3 blocos ao sul". Misturar as duas notações em uma mesma tripla de coordenadas é erro de sintaxe.
store é um valor de retorno, não uma variável
store captura o que o comando retorna — geralmente uma contagem de sucesso ou um valor de resultado:
execute store result score @s Count run data get entity @s Inventory
Duas coisas que as pessoas erram:
resultversussuccess.resulté o número que o comando produz;successé 1 ou 0 conforme ele tenha rodado ou não. Contar entidades exigeresult.storevem antes derun, e se aplica ao comando depois derun, não à cadeia de subcomandos.
if versus unless interrompem a cadeia
if e unless filtram — a cadeia para ali quando o teste falha. Várias cláusulas if funcionam como E. Não existe OU; para isso são necessários dois comandos separados ou um predicate.
execute as @a if entity @s[gamemode=survival] if score @s Lives matches 1.. run ...
Monte a cadeia um subcomando por vez, com o contexto exibido a cada passo, no Construtor de Comandos Avançados — ele também cobre data, item, loot, schedule, particle e playsound no mesmo formulário.