全新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当前可用维度标识符为overworld、nether和the_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链以if或unless结尾时,可不带run直接返回检测结果。
实例解析与旧指令升级
由于子命令可无限串联,实际组合方式近乎无限。以下列举典型应用场景:
旧版/execute功能可通过as <目标> at @s复现。如需相对位置偏移,添加positioned;如需方块检测,添加if block。示例如下:
/execute @p ~ ~1.62 ~ teleport @s ^ ^ ^3/execute as @p at @s positioned ~ ~1.62 ~ run teleport @s ^ ^ ^3/execute @e[type=sheep] ~ ~ ~ execute @e[type=item,r=5] ~ ~ ~ detect ~ ~-1 ~ stone 0 kill @s/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,因为只需位置信息)
新版语法还支持许多旧版难以实现的功能:
/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