--- title: 全新execute命令 category: 命令 tags: - 简单 mentions: - JaylyDev - Sprunkles137 - Hatchibombotar - TheItsNameless - SmokeyStack - zheaEvyline --- # 全新execute命令 ## 引言 随着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 -> execute ``` 此命令不会改变执行位置、视角或维度上下文。 若指定多个目标,则依次以每个目标为`@s`执行命令。 ### `/execute at` 更改命令执行位置,将命令的坐标、视角和维度同步至目标实体。 ``` /execute at -> execute ``` 此命令不会改变执行者身份,故`@s`仍指向最近一次指定的目标。 若指定多个目标,则依次在目标位置执行命令。 ### `/execute in` 设置命令执行的维度环境。 ``` /execute in -> execute ``` 当前可用维度标识符为`overworld`、`nether`和`the_end`。 维度切换时会自动换算坐标比例(如主世界至下界应用x0.125缩放,反之则x8放大)。 ### `/execute positioned` 直接设定命令执行坐标。 ``` /execute positioned -> execute ``` 将命令位置设为指定坐标。[相对坐标与局部坐标](/wiki/commands/relative-coordinates)基于当前命令位置计算。 ``` /execute positioned as -> execute ``` 将命令位置同步至目标坐标。功能类似`/execute at`,但仅改变位置不改变视角与维度。 若指定多个目标,则依次在目标位置执行命令。 ### `/execute align` 将当前命令位置对齐至方块网格。 ``` /execute align -> execute ``` 对齐操作将坐标向下取整。本子命令接受由"x"、"y"、"z"组成的非重复组合,对指定轴进行取整。 ### `/execute anchored` 设置命令的锚点位置(脚部或眼部),影响局部坐标基准。 ``` /execute anchored (eyes|feet) -> execute ``` 默认锚点为脚部。 当锚点设为`eyes`时,命令的局部坐标会根据执行者的"眼高"进行偏移。 注意:由于漏洞[MCPE-162681](https://bugs.mojang.com/browse/MCPE-162681),当前该设置会影响相对坐标。 ### `/execute rotated` 直接设定命令执行视角。 ``` /execute rotated -> execute ``` 设置具体视角参数。相对坐标与局部坐标基于当前视角计算,默认值为0(若未变更过视角)。 ``` /execute rotated as -> execute ``` 同步目标实体的视角参数。 若指定多个目标,则依次应用目标视角执行命令。 ### `/execute facing` 设置命令视角朝向特定坐标或实体部位。 ``` /execute facing -> execute ``` 使命令视角朝向指定方块坐标,基于当前命令位置计算。 ``` /execute facing entity (eyes|feet) -> execute ``` 使命令视角朝向目标实体部位。选择`feet`锚点将瞄准脚部位置,`eyes`则瞄准眼部(参考[`/execute anchored`](/wiki/commands/new-execute#execute-anchored))。 若指定多个目标,则依次应用目标朝向执行命令。 ### `/execute (if|unless)` 根据条件判断是否执行命令。`if`在条件为真时继续,`unless`则相反。 ``` /execute if entity -> execute ``` 类似`/testfor`,检测目标是否存在。 ``` /execute if block -> execute ``` 类似`/testforblock`,检测指定位置方块。 可附加数据值或方块状态参数,否则忽略状态(等效于`-1`)。 ``` /execute if blocks (all|masked) -> execute ``` 类似`/testforblocks`,比对源区域与目标区域的方块布局。 `all`参数要求完全匹配,`masked`忽略空气方块。 ``` /execute if score matches -> execute ``` 检测指定分数是否符合数值范围(使用整数区间语法)。 ``` /execute if score (=|<|<=|>|>=) -> execute ``` 比对两个分数的逻辑关系,支持等于(`=`)、大于(`>`)、大于等于(`>=`)、小于(`<`)、小于等于(`<=`)。 ### `/execute run` ``` /execute run ``` 应用所有上下文修改后执行指定命令。本子命令必须作为`/execute`链的末尾。 注意:当`/execute`链以`if`或`unless`结尾时,可不带`run`直接返回检测结果。 ## 实例解析与旧指令升级 由于子命令可无限串联,实际组合方式近乎无限。以下列举典型应用场景: 旧版`/execute`功能可通过`as <目标> at @s`复现。如需相对位置偏移,添加`positioned`;如需方块检测,添加`if block`。示例如下: ::: code-group ```mcfunction [旧版偏移传送] /execute @p ~ ~1.62 ~ teleport @s ^ ^ ^3 ``` ```mcfunction [新版等效] /execute as @p at @s positioned ~ ~1.62 ~ run teleport @s ^ ^ ^3 ``` ::: ::: code-group ```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`,因为只需位置信息) 新版语法还支持许多旧版难以实现的功能: ::: code-group ```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 ``` :::