/execute:为什么 as/at 的顺序很重要,以及 store 到底怎么工作
大多数出问题的 execute 命令链,都源于混淆了「谁执行命令」和「在哪里执行」。下面说明每个子命令改变了什么,以及能解决问题的正确顺序,as 搭配 at @s 是这条命令里最常用的组合,忘记加 at @s 也是最常见的错误写法。
/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 则是最常见的 bug。
顺序是从左到右,而且会层层叠加
子命令按顺序执行,每一个都会修改下一个子命令所看到的上下文:
execute as @a at @s positioned ^ ^ ^3 run particle flame
as @a—— 每个玩家执行一次at @s—— 移动到该玩家处positioned ^ ^ ^3—— 在他们视线前方 3 格
把第 2 步和第 3 步对调,positioned ^ ^ ^3 就会根据你的位置和朝向计算—— 随后 at @s 又把它丢弃,直接吸附回玩家身上,于是这个偏移完全丢失了。
脱字符与波浪号
~ ~ ~—— 相对于位置,与世界坐标轴对齐^ ^ ^—— 相对于朝向:左、上、前
脱字符坐标正是 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 ...
在高级命令生成器中,一次添加一个子命令来构建命令链,并查看每一步的上下文——它还能用同一个表单处理 data、item、loot、schedule、particle 和 playsound。