Execute
引言
随着 1.19.50 版本的发布,/execute 命令经历了语法重构。虽然新语法更加冗长,但它能更精细地控制命令的上下文组件,并支持条件判断,从而取代了 /testfor、/testforblock 和 /testforblocks 等命令。
在深入探讨语法细节之前,我们需要理解旧版 /execute 的工作原理、变更内容及其原因。这将有助于更好地解释新语法中的概念。
理解执行上下文
无论是命令初学者还是熟悉旧版 /execute 的玩家,都有必要回顾命令的执行上下文概念。
简而言之,执行上下文是影响命令运行的参数集合。包括:命令的执行者(即运行命令的实体)、命令运行的位置和维度,以及命令应用的旋转角度等。
每个命令都带有这样的上下文,且上下文会根据命令的运行方式而变化。从命令方块触发的命令没有执行者,其位置设为该命令方块的位置;通过聊天栏输入的命令则以玩家为执行者,并在玩家所在位置运行。
Execute 命令及其变更原因
/execute 命令代表一个或多个实体执行另一条命令。旧版语法如下:
/execute <目标> <位置> <命令>
/execute <目标> <位置> detect <位置> <方块> <数据值> <命令>旧语法中,你需要指定一个目标来执行命令,随后命令的上下文会切换为该目标,并在该目标的位置运行。任何位置偏移都相对于该目标。
虽然这在多数情况下很有用,但它强制将命令的目标和位置绑定在一起(除非手动输入世界坐标作为 <位置>)。此外,由于每次都必须以实体身份执行,这种语法在构建条件判断时显得不够灵活。
在 2017 年夏季的「水域更新」开发期间,Minecraft: Java 版的开发者们收集了社区关于如何改进 /execute 语法的反馈,最终形成了以下核心理念:/execute 可以接受无限数量的子命令,这些子命令按指定顺序逐步修改命令的上下文,最后通过 run 子命令触发实际命令。
这种设计大幅提升了 /execute 的灵活性,并允许将执行者和命令位置分离。
语法详解
现在,让我们详细解析 /execute 的新语法:
/execute as
修改命令的执行者,即目标选择器 @s 所指向的实体。
/execute as <origin: target> -> execute此子命令不会改变命令的位置、旋转或维度上下文。
如果指定了多个目标,则命令会为每个目标分别运行一次,@s 依次指向每个实体。
/execute at
修改命令的运行位置,将命令的位置、旋转和维度上下文设为指定实体的值。
/execute at <origin: target> -> execute此子命令不会改变命令的执行者,因此 @s 仍指向最近一次通过 as 指定的目标。
如果指定了多个目标,则命令会为每个目标分别运行一次,并更新上下文为各目标的位置、旋转和维度。
/execute in
设置命令运行的维度。
/execute in <dimension: string> -> execute当前支持的维度参数为 overworld(主世界)、nether(下界)和 the_end(末地)。
例如,要在末地维度执行命令:
/execute in the_end positioned 0 -100 0 as @a[rm=1] run say 我位于末地维度注意:维度切换时会自动应用维度比例尺。从主世界进入下界时,位置坐标会乘以 0.125;反之则乘以 8。
/execute positioned
直接设置命令的位置上下文。
/execute positioned <position: x y z> -> execute将命令的位置设为指定坐标。相对坐标和局部坐标基于命令当前位置计算。
/execute positioned as <origin: target> -> execute将命令的位置设为指定目标的位置。功能类似于 /execute at,但仅修改位置,不改变旋转或维度。
如果指定了多个目标,则命令会为每个目标分别运行一次,并更新位置上下文。
/execute align
将命令的当前位置对齐到方块网格。
/execute align <axes: swizzle> -> execute对齐操作会对坐标取整。该子命令接受 "x"、"y"、"z" 的非重复组合,并在指定轴上对位置取整。
要将目标对齐到方块中心:
/execute as <target> at @s align xyz run tp @s ~0.5 ~0.5 ~0.5/execute anchored
设置命令的锚点为执行者的脚部或眼部。修改锚点会影响局部坐标的计算基准。
/execute anchored (eyes|feet) -> execute默认锚点为目标的脚部。
当锚点设为 eyes 时,命令的局部坐标会基于执行者的"眼睛高度"进行偏移。
由于漏洞 MCPE-162681,当前该偏移也会影响相对坐标。
此外,同一 /execute 命令中只能使用一次 anchored 子命令,后续设置将无效。这是由漏洞 MCPE-165051 导致的。
/execute rotated
直接设置命令的旋转上下文。
/execute rotated <yaw: value> <pitch: value> -> execute将命令的旋转设为指定角度值。相对坐标和局部坐标基于当前旋转计算。默认旋转为 0(俯仰角和偏航角均为 0),除非先前已被修改。
/execute rotated as <origin: target> -> execute将命令的旋转设为指定目标的旋转角度。
如果指定了多个目标,则命令会为每个目标分别运行一次,并更新旋转上下文。
/execute facing
设置命令的旋转角度使其朝向某个位置。旋转计算基于命令当前位置。
/execute facing <position: x y z> -> execute设置命令朝向指定方块位置。相对坐标和局部坐标基于当前位置计算。
/execute facing entity <origin: target> (eyes|feet) -> execute设置命令朝向指定目标的位置。锚点设为 feet 时朝向目标的站立位置,设为 eyes 时则朝向目标的眼部位置(参见 /execute anchored)。
如果指定了多个目标,则命令会为每个目标分别运行一次,并更新旋转上下文。
/execute (if|unless)
根据条件判断是否执行命令。if 在条件为真时继续执行,unless 则相反。
/execute if entity <target: target> -> execute功能类似 /testfor。当目标存在时返回真。
/execute if block <position: x y z> <block: string> -> 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: target> <objective: string> matches <range: integer range> -> execute检测指定分数是否在给定范围内。使用整数范围语法。
/execute if score <target: target> <objective: string> (=|<|<=|>|>=) <source: target> <objective: string> -> execute检测两个分数是否符合逻辑比较。支持等于(=)、大于(>)、大于等于(>=)、小于(<)和小于等于(<=)。
/execute run
/execute run <command: command>使用当前所有上下文修改运行指定命令。该子命令必须位于 /execute 命令的末尾。
不过该子命令并非必需——以 if 或 unless 结尾的 /execute 命令同样有效,此时会返回条件测试的结果。
示例与旧命令升级
由于子命令可以无限组合,/execute 的参数组合几乎无穷无尽。这里仅展示一些常见用例。
旧版 /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 kill @s
# 新语法:
/execute at @e[type=sheep] as @e[type=item,r=5] at @s if block ~ ~-1 ~ stone run kill @s(注意此处不使用 as @e[type=sheep] at @s,因为只需羊的位置而非执行身份。)
以下是旧语法难以实现或无法单命令完成的新功能示例:
# 检测虚拟玩家分数:
/execute if score game_settings var matches 3.. run say [游戏] 难度已设为困难。
# 比较两个分数是否相等:
/execute as @a if score @s wiki:cash = @s wiki:bank run say 我的现金余额与银行存款相等。
# 检测实体存在而不选择它:
/execute as @a at @s if entity @e[type=armor_stand,r=10] run gamemode survival @s(推荐阅读下一篇)逻辑门实现




