基岩版execute新格式
/execute
可以在改变执行者、执行位置和角度,添加限制条件的情况下执行另一条命令
基岩版
在基岩版1.19.50中,execute由多个子命令组成,共有14个子命令。子命令分为三类:修饰子命令、条件子命令和run子命令。
注:14个子命令包含facing、positioned、rotated的第2种格式,可以做视线追踪了,现在这个新格式已经正式实装正式版,不需要再开实验玩法就可以了。
—————————————————————————
修饰子命令修改命令变量并改变命令执行的方式,从而以特定的执行者、执行位置执行后续子命令。
条件子命令用于检测特定条件是否成立,并输出结果或限制命令执行的条件。
run子命令用于执行另一个命令。
/execute命令允许将任意子命令串连在一起。除run子命令外的子命令可以随意排列或重复使用多次,而run子命令只能使用一次且只能位于命令最后位置。命令必须以条件子命令或run子命令结尾,否则没有实际效果。对于多个子命令,游戏会按顺序从前向后依次处理,比如,以下命令是不同的:
所有的实体向各自所朝的方向移动一格:execute as @e at @s run tp ^ ^ ^1
所有的实体移动到执行者的前方一格:execute at @s as @e run tp ^ ^ ^1
游戏会在处理run子命令之前,先处理其他子命令,故run子命令无法影响其他子命令。run子命令无法相互影响。在某些情况下,命令会中止执行。
—————————————————————————
execute命令有11个子命令,每一个都有其自身的语法。
所有子命令构成的语法树如下:
/execute…
...align <axes> -> execute
...anchored <anchor> -> execute
…as <targets> -> execute
…at <targets> -> execute
...facing (<pos>|entity <targets> <anchor>) -> execute
...in <dimension> -> execute
…positioned (<pos> as <targets>) -> execute
…rotated (<rot> as <targets>) -> execute
...(if|unless)…
…block <pos> <block> -> [execute]
…blocks <start> <end> <destination> (all|masked) -> [execute]
…entity <entities> -> [execute]
…score <target> <target0bjective>
(<I==l=I>[>=) <source> <source0bjective> ->[execute]
…matches <range> -> [execute]
…run <command>
其中的-> execute代表另一个要执行的子命令的开始。
以下是所有子命令的详情介绍。
修饰子命令
align
把执行位置转换为方块坐标(向下取整)。
语法
align <axes> -> execute
参数
<axes>:swizzle
x、y、z中的不重复的任意组合。(例如x、xz、yz和zyx。)
效果
改变执行坐标。
参数不是字母x、y、z时视为语法错误。
示例
※x=-1.8, y=2.3, z=5.9时,<axes>为x将变为x=-2, y=2.3, z=5.9
※比如,execute positioned -1.8 2.3 5.9 align x run tp ~ ~ ~将把自己传送到(-2, 2.3, 5.9)
※x=2.4, y=-1.1, z=3.8时,<axes>为xyz将变为x=2, y=-2, z=3
※比如,execute positioned 2.4 -1.1 3.8 align yxz run tp ~ ~ ~将把自己传送到(2, -2, 3)
※将自己的y坐标微调向下取整:execute align y run tp ~ ~ ~
anchored
使用此命令切换命令的基准点为实体脚或眼睛的位置。默认为脚。(如在使用局部坐标或朝向时)
语法
anchored <anchor> -> execute
参数
<anchor>:entity_anchor(eyes或feet)
基准是眼睛的位置(eyes)或是脚的位置(feet)。
效果
^ ^ ^的定位被重新基准为眼睛或脚部。
参数不正确时,视为语法错误。
示例
/tp的效果是通过将脚部移动到指定的位置来移动实体。
execute anchored eyes run tp ^ ^ ^有效地将命令执行者的腿部移动到眼睛的位置(执行位置)。
execute anchored eyes run tp ^5 ^ ^意味着“将命令执行者的腿部移动到眼部位置5格左边的位置”。
as
改变命令的执行者(executor),但不改变执行位置或执行朝向等。
语法
as <targets> -> execute
参数
<targets>:实体
指定后续内容的执行者。可以是玩家ID或目标选择器。
效果
将执行者改为目标实体(改变@s的含义)
参数不正确时,视为语法错误。
当目标实体不存在时命令终止执行。
当选择到多个实体时,以各个实体为执行者分
别执行一次后续子命令。
at
改变命令的执行位置、执行朝向和执行维度为指定实体的坐标、朝向和维度,不改变命令执行者。
语法
at <targets> -> execute
参数
<targets>:entity
指定目标实体,可以是玩家ID或目标选择器。
结果
位置和朝向更新为目标实体的(影响~ ~ ~和^ ^ ^的定位)
参数不正确时,视为语法错误。
当目标实体不存在时命令终止执行。
如果选择多个实体,则以多个实体的执行位置、执行朝向和执行维度,分别执行一次后续子命令。
示例
※在一名随机玩家头上放置一颗石头:execute at @r run setblock ~ ~ ~ stone
※所有的绵羊向上移动1格:execute as @e[type=sheep] at @s run tp ~ ~1 ~
※注意execute at @e[type=sheep] run kill @s会清除执行者而对绵羊没有影响,因为at子命令不修改执行者。
—————————————————————————
facing
将命令的执行朝向改为面向指定的坐标或某个实体,不改变命令执行者和执行位置。
语法
facing <pos> -> execute
facing entity <targets> <anchor> -> execute
参数
<pos>:vec3
需要朝向的坐标,格式为<x> <y> <z>,可以使用波浪号和插入符。执行朝向将会是朝向该坐标。
<targets>:entity
需要朝向的实体,可以是玩家名、UUID或目标选择器。执行朝向将会是朝向该实体。
<anchor>:entity_anchor(eyes或feet)
确定朝向实体眼睛(eyes)还是脚(feet)的位置。
效果
将朝向改为面向指定的坐标或目标实体
参数不正确时,视为语法错误
当目标实体不存在时命令终止执行。
当选择到多个实体时,则以多个执行朝向分别执行一次后续子命令。
示例
所有的实体都朝着(0, 64, 0)的方向移动一格(不改变自身的朝向):execute as @e at @s facing 0 64 0 run tp ^ ^ ^1
所有非玩家实体朝着各自距离最近的玩家的方向移动一格(不改变自身的朝向):execute as @e[type=!player] at @s facing entity @p feet run tp ^ ^ ^1
in
将命令执行维度设为特定维度。命令将在指定的维度中执行。
语法
in <dimension> -> execute
参数
<dimension>:dimension
新的执行维度的命名空间ID。minecraft命名空间下的维度默认有overworld、the_end和the_nether。
效果
更新执行维度。
参数不正确时,视为语法错误。
示例
在下界的世界中心(0,0,0)放置一块泥土:execute in minecraft:the_nether run setblock 0 0 0 dirt
寻找末地中的末地城:execute in the_end run locate endcity
注意不同的维度有不同的坐标尺度:从主世界传送到下界时,执行位置(仅X/Z轴部分)会除以8,从下界传送到主世界则会乘以8。如:
主世界(16,64,16)位置的玩家运行execute in minecraft:the_nether positioned as @s run tp ~ ~ ~,会传送到下界的(16,64,16)。
主世界(16,64,16)位置的玩家运行execute in minecraft:the_nether run tp ~ ~ ~,会传送到下界的(2,64,2)。
主世界(80,64,80)位置的玩家运行execute in minecraft:the_nether run tp ~ ~ ~5,会传送到下界的(10,64,15)。
positioned
在指定的坐标执行命令。改变执行位置,但不改变执行者、执行朝向。
语法
positioned <pos> -> execute
positioned as <targets> -> execute
参数
<pos>:vec3
指定命令执行的坐标,格式为<x> <y> <z>,可以使用相对坐标和局部坐标。
<targets>:entity(仅在as模式可用)
指定命令执行的位置为<targets>所处的坐标,可以是玩家ID或目标选择器。
效果
改变命令的执行位置。
参数不正确时,视为语法错误。
当目标实体不存在时命令终止执行。
如果选择多个实体,则以各个执行位置,分别执行一次后续子命令。
示例
※给予离坐标(7,-90,7)最近的玩家一颗钻石:execute positioned 7 -90 7 run give @p diamond
※假设执行者处于主世界时,寻找(0, 64, 0)附近的村庄:execute positioned 0 64 0 run locate Village
※假设执行者处于其他维度时,寻找主世界(0, 64, 0)附近的村庄:execute in overworld positioned 0 64 0 run locate Village
※让所有的绵羊向着玩家(执行者)的朝向移动一格(比如,玩家看着东边时,绵羊向东移动一格;玩家看着上方时,绵羊向上移动一格):execute as @e[type=sheep] positioned as @s rotated as @p run tp @s ^ ^ ^1
rotated
将命令的执行朝向设为特定方向,或者设为指定实体的朝向。改变执行朝向,不改变执行者和执行位置。
语法
rotated <rot> -> execute
rotated as <targets> -> execute
参数
<rot>:rotation(<yaw> <pitch>)
需要的旋转角度
yaw指定水平旋转角度(正北方为-180.0,正东为-90.0,正南为0.0,正西为90.0,正北以西为179.9,之后回到-180.0)。可使用波浪号指定基于当前旋转角度的相对偏移。
pitch指定垂直旋转角度(竖直上方为-90.0,至竖直下方90.0)。可使用波浪号指定基于当前旋转角度的相对偏移。
<targets>:entity
采用指定实体的朝向。
效果
参数不正确时,视为语法错误。
当<targets>实体不存在时命令终止执行。
如果选择多个实体,则以各个执行朝向,分别执行一次后续子命令。
示例
※让所有的绵羊以各自距离最近玩家的朝向作为方向移动1格:execute as @e[type=sheep] at @s rotated as @p run tp @s ^ ^ ^1
条件子命令
条件子命令if和unless用于限制命令只有在指定的条件下执行。if为如果......就,而unless为除非......否则。 除此之外两者都有相同的参数结构。
如果在不使用存储子命令和run子命令的情况下单独执行条件子命令,execute命令将会报告是否匹配成功作为命令的成功次数,成功匹配的数量作为返回值。
—————————————————————————
有4种不同类型的条件:
(if|unless) block – 检测单个具体方块
(if|unless) blocks – 检测两个长方体区域内的方块匹配情况
(if|unless) entity – 检测指定实体是否存在
(if|unless) score - 检测目标的分数
(if|unless) block
比较给定的位置的方块是否为给定的方块ID
语法
(if|unless) block <pos> <block> -> [execute]
参数
<pos>:block_pos
需要检测的方块的坐标。格式为x y z,可以使用相对坐标和局部坐标。
<block>:block_name
指定一个方块ID。
(if|unless) blocks
比较相同大小的两个长方体区域的方块
语法
(if|unless) blocks <start> <end> <destination> <scan mode> -> [execute]
参数
<start>、<end>:block_pos
源区域(比较时参照的区域)的两个对角方块位置
<destination>:block_pos
对照区域的西北下角方块的坐标(即长方形区域内x y z坐标最小处)。
格式均为<x> <y> <z>,可以使用相对坐标和局部坐标。参见clone。
<scan mode>:可以是all或masked
选择all将探测区域内的全部方块,选择masked将忽略源区域内空气方块所在的位置。
(if|unless) entity
检查一个或多个特定实体是否存在。
语法
(if|unless) entity <targets> -> [execute]
参数
<targets>
要检查的目标实体。可以为玩家ID或选择器。
(if|unless) score
检查指定目标的记分板中的记分项的分数是否与另一个(或同一个)目标的记分项的分数是否符合指定的关系,或者是否在给定的范围之内。
语法
(if|unless) score <target> <targetObjective> (<|<=|=|>=|>) <source> <sourceObjective> -> [execute]
——检查<target>的<targetObjective>的分数与<source>的<sourceObjective>的分数是否符合运算符的关系。
(if|unless) score <target> <targetObjective> matches <range> -> [execute]
——检查<target>的<targetObjective>的分数是否在指定<range>内。
参数
<target>:score_holder
单个分数持有者。可以为玩家ID、UUID、目标选择器或自定义目标。
可以执行*但判定失败。
<targetObjective>:objective
检查的记分项。
选项:(<|<=|=|>=|>) <source> <sourceObjective>
<source>:score_holder
被比较的单个分数持有者。可以为玩家ID、UUID、目标选择器或自定义目标。
可以执行*但判定失败。
<sourceObjective>:objective
记分项。
选项:matches <range>
<range>:int_range
检查分数是否在某个范围之内。可以使用数字..数字来指定范围。缺省一侧可指定大于等于或小于等于。
效果
当处于execute命令结尾时:对于if,如果条件成立则命令成功,否则失败。对于unless,如果条件不成立则命令成功,否则失败。
当位于execute命令中间时:对于if,如果条件成立继续执行后续子命令,否则终止执行。对于unless,如果条件不成立则继续执行后续子命令,否则终止执行。
示例
击杀踩在白色羊毛上的玩家:execute as @a at @s if block ~ ~-1 ~ white_wool run kill @s
若世界中有绵羊就执行函数bar:execute if entity @e[type=sheep] run function bar
检测自己的a分数与b分数是否相等:execute if score @s a = @s b
击杀所有在3格范围内没有豹猫的苦力怕:execute as @e[type=creeper] at @s unless entity @e[type=ocelot,r=3] run kill @s
run子命令
要被执行的命令。
语法
run <command>
参数
<command>
任何一个完整的命令,不可以以斜线开头。
MC基岩版未来指令更新计划:
储存子命令
存储子命令可以让命令在执行之后将命令返回的结果或成功次数储存于记分板中,有store result和store success两种模式。注意命令的返回值必定为整数,若为小数会被向下取整。每种命令的返回值情况在对应的页面有表格或文字记载。
可能会加一种储存模式:
store (result|success) score——存储在目标的记分项的分数中
store (result|success) score
将给定的<objective>中<targets>持有的分数修改为命令的返回值或成功次数。
语法
store (result|success) score <targets> <objective> -> execute
参数
<targets>:score_holder
修改此分数持有者(可以是实体、选择器甚至不存在的玩家)的分数
<objective>:objective
记分项。
结果
参数不正确时,视为语法错误。
执行成功时,返回值或成功次数会被储存为<target>的<objective>分数。