/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
as @a— 每个玩家执行一次at @s— 移动到该玩家positioned ^ ^ ^3— 位于他们看向方向的前方 3 格
交换步骤 2 和 3,则插入符号偏移量将根据你的旋转而不是他们的旋转来测量。
插入符号与波浪号
~ ~ ~— 相对于位置,与世界轴对齐^ ^ ^— 相对于朝向:左、上、前
插入符号坐标是为什么 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 子句是 AND 关系。没有 OR 关系;这需要两个单独的命令或一个谓词。
execute as @a if entity @s[gamemode=survival] if score @s Lives matches 1.. run ...
在 高级命令构建器 中,一步一步地构建命令链,并在每一步显示上下文 — 它还涵盖了相同形式的数据、物品、战利品、计划、粒子和播放音效。