Skip to content

全新execute命令

本页面镜像自
BedrockWiki

根据原始项目协议授权。本文经过AI翻译处理,如有内容遗漏,可以提交PR进行补充。

引言

随着1.19.50版本的发布,/execute命令迎来了语法革新。虽然新语法需要书写更长的指令,但它能更精细地控制命令的上下文组件,并为命令添加了条件支持,从而取代了/testfor/testforblock/testforblocks等命令。

在深入解析语法细节之前,我们需要理解旧版/execute的工作原理及其演变逻辑,这将有助于更好地理解新语法中的概念。

理解执行上下文

无论是命令新手还是熟悉旧版/execute的开发者,都有必要重新审视命令的执行上下文概念。

简而言之,这些参数决定了命令的运行方式:命令的执行者(即由谁执行)、执行位置、所在维度以及执行时的视角旋转角度等。

每个命令都携带这样的上下文,且上下文会根据命令的运行方式动态变化。从命令方块触发的命令没有明确执行者,位置固定在命令方块处;通过聊天框执行的命令则以玩家为执行者,并在玩家当前位置运行。

Execute命令的演变逻辑

/execute命令允许通过一个或多个实体代理执行命令。旧版语法结构如下:

/execute <目标> <位置> <命令>
/execute <目标> <位置> detect <位置> <方块> <数据值> <命令>

旧语法指定目标后,命令的上下文将切换至该目标的位置执行。所有位置偏移都默认相对于该目标。

虽然这在多数情况下很实用,但也强制绑定了命令目标与执行位置(除非手动输入世界坐标)。同时,在构建条件语句时缺乏灵活性,因为每次都需要通过实体执行。

在2017年夏季水域更新的开发阶段,Minecraft Java版开发团队收集了社区反馈后,提出了全新设计理念:/execute可以串联无限个子命令来按序调整命令的不同上下文维度,最后通过"run"子命令触发实际命令。

这种设计大幅提升了/execute的上下文控制能力,实现了执行者与执行位置的分离。

新语法解析

现在让我们系统梳理新版/execute语法结构:

/execute as

更改命令执行者,即影响目标选择器@s的指向。

/execute as <origin: 目标> -> execute

此命令不会改变执行位置、视角或维度上下文。

若指定多个目标,则依次以每个目标为@s执行命令。

/execute at

更改命令执行位置,将命令的坐标、视角和维度同步至目标实体。

/execute at <origin: 目标> -> execute

此命令不会改变执行者身份,故@s仍指向最近一次指定的目标。

若指定多个目标,则依次在目标位置执行命令。

/execute in

设置命令执行的维度环境。

/execute in <dimension: 字符串> -> execute

当前可用维度标识符为overworldnetherthe_end

维度切换时会自动换算坐标比例(如主世界至下界应用x0.125缩放,反之则x8放大)。

/execute positioned

直接设定命令执行坐标。

/execute positioned <position: x y z> -> execute

将命令位置设为指定坐标。相对坐标与局部坐标基于当前命令位置计算。

/execute positioned as <origin: 目标> -> execute

将命令位置同步至目标坐标。功能类似/execute at,但仅改变位置不改变视角与维度。

若指定多个目标,则依次在目标位置执行命令。

/execute align

将当前命令位置对齐至方块网格。

/execute align <axes: 轴组合> -> execute

对齐操作将坐标向下取整。本子命令接受由"x"、"y"、"z"组成的非重复组合,对指定轴进行取整。

/execute anchored

设置命令的锚点位置(脚部或眼部),影响局部坐标基准。

/execute anchored (eyes|feet) -> execute

默认锚点为脚部。

当锚点设为eyes时,命令的局部坐标会根据执行者的"眼高"进行偏移。

注意:由于漏洞MCPE-162681,当前该设置会影响相对坐标。

/execute rotated

直接设定命令执行视角。

/execute rotated <yaw: 值> <pitch: 值> -> execute

设置具体视角参数。相对坐标与局部坐标基于当前视角计算,默认值为0(若未变更过视角)。

/execute rotated as <origin: 目标> -> execute

同步目标实体的视角参数。

若指定多个目标,则依次应用目标视角执行命令。

/execute facing

设置命令视角朝向特定坐标或实体部位。

/execute facing <position: x y z> -> execute

使命令视角朝向指定方块坐标,基于当前命令位置计算。

/execute facing entity <origin: 目标> (eyes|feet) -> execute

使命令视角朝向目标实体部位。选择feet锚点将瞄准脚部位置,eyes则瞄准眼部(参考/execute anchored)。

若指定多个目标,则依次应用目标朝向执行命令。

/execute (if|unless)

根据条件判断是否执行命令。if在条件为真时继续,unless则相反。

/execute if entity <target: 目标> -> execute

类似/testfor,检测目标是否存在。

/execute if block <position: x y z> <block: 字符串> -> execute

类似/testforblock,检测指定位置方块。

可附加数据值或方块状态参数,否则忽略状态(等效于-1)。

/execute if blocks <begin: x y z> <end: x y z> <destination: x y z> (all|masked) -> execute

类似/testforblocks,比对源区域与目标区域的方块布局。

all参数要求完全匹配,masked忽略空气方块。

/execute if score <target: 目标> <objective: 字符串> matches <range: 整数范围> -> execute

检测指定分数是否符合数值范围(使用整数区间语法)。

/execute if score <target: 目标> <objective: 字符串> (=|<|<=|>|>=) <source: 目标> <objective: 字符串> -> execute

比对两个分数的逻辑关系,支持等于(=)、大于(>)、大于等于(>=)、小于(<)、小于等于(<=)。

/execute run

/execute run <command: 命令>

应用所有上下文修改后执行指定命令。本子命令必须作为/execute链的末尾。

注意:当/execute链以ifunless结尾时,可不带run直接返回检测结果。

实例解析与旧指令升级

由于子命令可无限串联,实际组合方式近乎无限。以下列举典型应用场景:

旧版/execute功能可通过as <目标> at @s复现。如需相对位置偏移,添加positioned;如需方块检测,添加if block。示例如下:

mcfunction
/execute @p ~ ~1.62 ~ teleport @s ^ ^ ^3
mcfunction
/execute as @p at @s positioned ~ ~1.62 ~ run teleport @s ^ ^ ^3
mcfunction
/execute @e[type=sheep] ~ ~ ~ execute @e[type=item,r=5] ~ ~ ~ detect ~ ~-1 ~ stone 0 kill @s
mcfunction
/execute at @e[type=sheep] as @e[type=item,r=5] at @s if block ~ ~-1 ~ stone 0 run kill @s

(注意此处使用at @e[type=sheep]而非as,因为只需位置信息)

新版语法还支持许多旧版难以实现的功能:

mcfunction
/execute if score game_settings var matches 3.. run say [游戏] 难度已设为困难。

```mcfunction [分数比对]
/execute as @a if score @s x = @s y run say 我的X值等于Y值。

```mcfunction [非选中实体检测]
/execute as @a at @s if entity @e[type=armor_stand,r=10] run gamemode survival @s