新版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命令摒弃了旧版一行到底的写法,改为将子命令分为三类、可链式组合的结构:
整条命令的最末尾必须以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]或更高版本:
若在纯原版世界中(不含附加包)使用命令方块,则命令版本由游戏当前版本决定,1.19.50及以后的版本自动使用新版语法。