Guides / Commands & Data

/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
  1. as @a — 每个玩家执行一次
  2. at @s — 移动到该玩家
  3. positioned ^ ^ ^3 — 位于他们看向方向的前方 3 格

交换步骤 2 和 3,则插入符号偏移量将根据你的旋转而不是他们的旋转来测量。

插入符号与波浪号

  • ~ ~ ~ — 相对于位置,与世界轴对齐
  • ^ ^ ^ — 相对于朝向:左、上、前

插入符号坐标是为什么 positioned ^ ^ ^3 表示“前方”,而 ~ ~ ~3 表示“南方 3 格”的原因。在同一个坐标三元组中混合两种表示法是语法错误。

store 是返回值,而不是变量

store 捕获命令的返回值 — 通常是成功计数或结果值:

execute store result score @s Count run data get entity @s Inventory

人们常犯的两个错误:

  • resultsuccess result 是命令产生的结果值;success 是命令是否运行的 1 或 0。计数实体需要 result
  • storerun 之前,并且它应用于 run 之后的命令,而不是子命令链。

if 与 unless 的短路

ifunless 用于过滤 — 当测试失败时,链条就会停止。多个 if 子句是 AND 关系。没有 OR 关系;这需要两个单独的命令或一个谓词。

execute as @a if entity @s[gamemode=survival] if score @s Lives matches 1.. run ...

高级命令构建器 中,一步一步地构建命令链,并在每一步显示上下文 — 它还涵盖了相同形式的数据、物品、战利品、计划、粒子和播放音效。

高级命令生成器 — Execute 与 Data →

More guides

Browse all →

还想找别的我的世界工具?

一整套在浏览器里运行的生成器、查看器和转换器,全部免费。