跳转至

新版execute命令

基岩版在1.19.50引入了全面重写的execute命令语法,提供了更强大、更清晰的条件判断与执行控制能力。然而,由于基岩版的命令版本机制,新语法是否生效取决于附加包的引擎版本声明,你可能在某些旧包中仍会遇到传统语法。本文介绍命令版本机制及新版execute语法的要点。

命令版本

基岩版的行为包与世界模板清单文件中的min_engine_version字段(详见清单文件)不仅决定了附加包加载时的功能集,还影响命令解析版本。引擎会根据min_engine_version映射到一个命令版本号,然后按该版本号的语法解析附加包内函数(.mcfunction)中的命令,以及命令方块在存档创建时所保存的版本。

下表列出了从基岩版1.8.0至1.19.80的命令版本映射关系,以供排查兼容性问题时参考:

命令版本 引擎版本
8 1.8.0
9 1.9.0
10 1.10.0
11 1.11.0
12 1.12.0
13 1.13.0
14 1.14.0
15 1.15.0
16 1.16.0
17 1.16.100
18 1.17.0
19 1.17.10
20 1.17.30
21 1.17.40
22 1.18.0
23 1.18.10
24 1.18.30
25 1.19.50
26 1.19.60
27 1.19.63
28 1.19.70
29 1.19.73
30 1.19.80

命令版本25(引擎版本1.19.50)是新版execute语法启用的分水岭。当min_engine_version低于1.19.50时,execute命令使用旧语法;从1.19.50起,新语法生效。

命令方块中的命令版本

命令方块保存的是写入时的命令版本,而不是当前世界的命令版本。如果一个命令方块是在旧版本的世界中创建并保存的,即使在更新后的世界打开,该命令方块中的execute命令也会按旧语法解析。重新进入编辑并保存一次命令方块,才能使其升级到当前命令版本。

新版execute语法

新版execute命令摒弃了旧版一行到底的写法,改为将子命令分为三类、可链式组合的结构:

execute <子命令> [<子命令> ...] run <命令>

整条命令的最末尾必须以run <实际命令>结尾,前面可以叠加任意数量的条件子命令和修饰子命令。

条件子命令

条件子命令用if(满足则继续)或unless(不满足则继续)开头,用于对执行进行条件过滤:

if block <位置> <方块> [<方块状态>]
if entity <目标选择器>
if score <分数持有者> <记分项> <比较运算符> <分数持有者> <记分项>
if score <分数持有者> <记分项> matches <范围>

相应地,将if替换为unless即为"不满足该条件时继续"的语义。可以在一条命令中连续使用多个条件子命令,它们之间是逻辑"与"关系——所有条件都满足,命令才会执行。

修饰子命令

修饰子命令用于改变后续命令的执行上下文(执行者、位置、朝向、维度等):

as <目标选择器>        // 切换执行者
at <目标选择器>        // 切换执行位置与朝向至目标
positioned <位置>      // 切换执行位置
rotated <朝向>         // 切换执行朝向
facing <位置|实体>     // 朝向指定位置或实体
align <轴>             // 对齐执行位置至整数块坐标
anchored <eyes|feet>   // 将偏移基准切换至眼睛或脚部
in <维度>              // 切换维度

run子命令

run后面紧跟要实际执行的命令,且run只能出现一次并位于最末尾。

示例

# 对所有拥有速度效果的玩家播放音效
execute as @a[hasitem={item=speed_potion}] at @s run playsound random.orb @s

# 当(0,64,0)处是石头且该位置有骷髅时才执行
execute if block 0 64 0 stone if entity @e[type=skeleton,r=3] run say 条件满足!

# 将命令执行者切换为最近的苦力怕,并以它的位置和朝向执行命令
execute as @e[type=creeper,c=1] at @s run summon tnt

链式as与at的区别

as <目标>只切换执行者(@s),但执行位置不变;at <目标>只切换执行位置和朝向,但执行者不变。两者可以组合使用:execute as @a at @s ...表示"对每个玩家,以该玩家的位置执行后续命令",这是移植旧版execute @a ~ ~ ~ ...写法的最直接方式。

启用新版语法

要让附加包中的函数使用新版execute语法,只需在行为包的manifest.json中将header.min_engine_version设置为[1, 19, 50]或更高版本:

BP/manifest.json(节选)
{
  "header": {
    "min_engine_version": [1, 19, 50]
  }
}

若在纯原版世界中(不含附加包)使用命令方块,则命令版本由游戏当前版本决定,1.19.50及以后的版本自动使用新版语法。