本篇教程由作者设定未经允许禁止转载。

/execute是各不同功能的子命令的集合,用于改变命令执行上下文(修饰子命令),执行逻辑判断(条件子命令)和管理并存储命令返回值(存储子命令,并在此基础上执行任意目标命令。

——官方WIKI

前言

本教程篇幅很长,部分资料来自于WIKI,难度较高,不建议指令新手学习。

入手门槛:

  1. 至少可以分清执行坐标、执行者与执行方向;

  2. 会使用/tp等简单的指令;

  3. 会使用实体选择器。

概述

execute指令能说是MC原版中最为厉害的一条指令(没有之一),它帮助MC“命令党”玩家解决了不少的问题(比如踩方块获得效果等),同时也是当今解密地图中最常用的一条指令;在制作数据包时,我们也常常能看见它的身影...那这么厉害的一条指令,却有很多玩家不了解、不会使用它,那这里白鹤就先带大家先来认识认识它吧。

execute指令的用途

execute指令大部分用于检测实体是否进入特定的区域、是否踩到特定的方块等等,也有不少的玩家用execute指令来做坐标与方向之间的运算,还有部分玩家喜欢使用execute来做一些炫酷的特效之类的。比如说我

execute指令的发展与高潮

说到指令,我们不得不先了解一下它的历史与发展中的高潮,以便我们后面慢慢讲解。

在官方在2014年发出的1.8版本中,execute指令成功地被加入到游戏中,此后便有许多“技术党”玩家来研究这个指令,也正因为如此,我们可以直观的感受到1.8版本中地图的产量飞速提升,比如当时比较流行的地图《Look Up》三部曲,其中运用了大量的execute指令。

然后execute指令在1.8版本以后被搁置在了“箱底”。大悲

后来官方在2018年发布的1.13快照版本中,做出了一项重大的抉择——扁平化,这使得1.13之前的很多指令都无法“继承”到1.13及其以后了,这给很多“命令党”玩家来了个“致命的”打击,因为很多刚制作完成的地图都无法在新的版本中运行了但这恰恰给了execute指令很大的“进步空间”。

1.13的扁平化将testfor/testforblock/testforblocks等指令都合并到了execute中,这使不少的“技术党”玩家都以为testfor等指令被移除了包括我,但其实它们只是被藏在游戏指令一个不知名的小角落中等待被人发现而已了。

言归正传,在1.13中的扁平化当中,execute指令加入了很多的介词与连词,比如:as,at,if等。

玩家对这些介词的加入通常都会感到繁琐、枯燥,但这实际上大大提高了execute指令在后续版本中的使用频率,因为介词的加入,它们的语法被拆分了,execute指令现在可以变得更加多元化、全面化,现在可以说execute指令几乎是地图中使用频率最高、功能最为强大的一条指令了。


指令教学

1.13版本以下

execute在1.13版本以下的命令格式是这样的:

/execute <实体> <x> <y> <z> detect <x> <y> <z> <方块> <参数> <要执行的指令>
/execute <实体> <x> <y> <z> execute ...
/execute <实体> <x> <y> <z> <嵌套指令>

因为今天的重点不是1.13以下的execute指令,所以这里就不多做介绍,就简单举个例子吧:

/execute @p ~ ~ ~ detect ~ ~-1 ~ minecraft:wool 0 effect @p minecraft:speed 10 5

这条指令的用处就是当玩家踩到白色羊毛后给予一个强度为11,持续5秒的速度效果。

1.13版本及其以上

这里是重点,希望各位读者能做好笔记。

1.13中为execute指令加入了许多的修饰子命令(俗称介词)、条件子命令(俗称连词)、存储子命令与run子命令,截止到最近更新1.19.4统计下来一共有14个:

  • 修饰子命令:align,anchored,as,at,facing,on,in,positioned,rotated,summon;

  • 条件子命令:if,unless;

  • 存储子命令:store;

  • 执行子命令:run

execute命令允许将任意子命令串连在一起。除run子命令外的子命令可以随意排列或重复使用多次,而run子命令只能使用一次且只能位于命令最后位置。命令必须以条件子命令或run子命令结尾,否则没有实际效果。对于多个子命令,系统会按顺序从前向后依次处理,比如,以下命令是不同的:

  • 所有的实体向各自所朝的方向移动一格:

  • execute as @e at @s run tp ^ ^ ^1
  • 所有的实体移动到执行者的前方一格:

  • execute at @s as @e run tp ^ ^ ^1

游戏会在处理run子命令和存储子命令之前,先处理其他子命令,故run子命令和存储子命令无法影响其他子命令。run子命令和存储子命令也无法相互影响。在某些情况下,命令会中止执行。

命令执行后如果没有中途停止,就会返回成功次数和一个结果,这两个数值都来自于结尾的条件子命令或run子命令。注意命令的返回值必定为整数,若为小数会被向下取整。成功次数通常会是0或1。但如果此命令分开被执行多次(比如通过at @a)那么其成功次数可以大于1。当命令没有执行成功时,两个返回值均为0。当结尾的条件子命令或run子命令被执行了多次时,只返回最后一次执行的值。这两个值可以被储存子命令储存。

使用命令方块执行命令时将把它们返回到该命令方块上,这可以用条件制约的命令方块检测是否成功,也可以使用红石比较器读取成功次数。

修饰子命令

修饰子命令修改命令变量并改变命令执行的方式,从而以特定的执行者、执行位置、执行维度和执行朝向执行后续子命令。

align

用途:把执行位置转换为方块坐标(向下取整)

格式:align <坐标表达式字符串组合>

参数:<坐标表达式字符串组合>(比如字符串xy/yx/zxy,注意,这个xyz是指字母而不是坐标,它是字符串而不是变量!)

效果:改变命令的执行位置

报错:当参数不是x,y,z时报错

讲解:

/execute align xyz run tp @s ~ ~ ~

这条指令就是将自己传送到x坐标、y坐标、z坐标都为向下取整的地方,假定玩家的位置为x=2.2,y=5.6,z=10.5,在命令执行后玩家的位置就到了x=2,y=5,z=10。当然,还有更高级的用法,我们可以单独将某个坐标单独挑出来进行执行:

/execute align y run tp @s ~ ~ ~

那么如果此时玩家位置还在x=2.2,y=5.6,z=10.5,那么命令执行后位置就移到了x=2.2,y=5,z=10.5,以此类推,如果想向下取整z坐标,就在align后面写上z,当然也可以把xz坐标向下取整,将align后面写上xz就行了。

anchored

用途:使用此命令切换命令的基准点为实体脚或眼睛的位置,默认为脚(如在使用相对坐标或朝向时)

格式:anchored <eye/feet>

参数:基准是眼睛的位置(eyes)或是脚的位置(feet)

效果:^ ^ ^的定位被重新基准为眼睛或脚部

报错:参数不正确时报错

讲解:

可以使用/tp指令来直观的感受这个子命令的效果:

/execute anchored eyes run tp @s ^ ^ ^

执行后就会将命令执行者的腿部移到命令执行者的眼部位置,^之后还可以加数字:

/execute anchored eyes run tp @s ^ ^ ^2

执行后玩家的腿部就会传送到眼部前方2格的位置,如果玩家的视角朝向方块,那么也会直接将其传送到方块里面,如果要传送到眼睛上方(下方)或左边(右边),只需要在相应的位置加上数值就行了,这里举两个例子(前者是向眼睛上方2格位置传送,后者是往右方5格位置传送):

/execute anchored eyes run tp @s ^ ^2 ^
/execute anchored eyes run tp @s ^-5 ^ ^

这个^符号与~符号一定要区分的开,^是视角所对的坐标,~是玩家的位置,意思是说当你的屏幕是90度朝下方时,^ ^ ^2其实是你脚下的那个方块(腿部还占有1格方块);而~不管你面朝哪个方向,~ ~ ~2永远是你z轴加2的坐标位置。

as

用途:改变命令的执行者,但不改变执行位置或执行朝向等

格式:as <目标实体>

参数:<目标实体>(可以是多个实体,当目标实体被清除时,指令停止运行)

报错:参数不正确时报错

讲解:

这个子命令及其常见,尤其在一些对话当中的说话者等等,下面举个例子:

/execute as @e[name="重生是希望"] run say 大家好,我是喵呜机!

运行了这串指令后,你会在聊天栏中看到场上所有显示名称为“重生是希望”的实体(包括盔甲架、火球等非生物实体)都会说一句“大家好,我是喵呜机!”

当然as子命令不止只有对话这一个作用:实体选择器中有一个@s(命令执行实体),as子命令会在运行时将后面的执行实体全都变为<目标实体>参数提供的实体,意思是说在as子命令之后的@s全都指代着前面<目标实体>,举个例子:

/execute as @e[name="重生是希望"] run tp @s 0 0 0

运行这条指令,你会发现被传送的不是自己前提是你不叫重生是希望,而是所有名为“重生是希望”的实体被传送到x=0,y=0,z=0的位置,但其实上面只是一个例子,这条指令可以简化成:

/tp @e[name="重生是希望"] 0 0 0

as子命令不建议在没有完全了解execute指令的玩家去使用,因为它的执行坐标与执行方向都不会改变,意思是说如果玩家使用~或^去修饰坐标,那么往往就会出现一些问题,假定我们在命令方块中输入这串指令并执行(我们的想法是将所有名为“大轩”的实体原地向上传送3格):

/execute as @e[name="大轩"] run tp @s ~ ~3 ~

但是当命令执行后,“大轩”并没有原地传送到上方3格的位置,而是传送到了命令方块上方3格!这是为什么呢,这是因为as子命令并不改变命令的执行坐标,换句话说,这时的~ ~ ~代表的不是“大轩”的坐标,而是命令方块的坐标,下面我们就要讲讲这种问题的解决方法了:at子命令。

at

用途:改变命令的执行位置、执行朝向和执行维度为指定实体的坐标、朝向和维度,不改变命令执行者。

格式:at <目标实体>

参数:<目标实体>(可以是多个实体,当目标实体被清除,指令停止运行)

效果:位置、朝向和维度更新为目标实体的(影响~ ~ ~和^ ^ ^的定位)

报错:参数不正确时报错

讲解:

at子命令与as子命令有异曲同工之妙,我们不难看出,as是更改执行者,而at是更改执行时的位置,那这两个结合在一起,就可以达到既更改命令执行者,也可以更改命令执行位置的效果,还是上面的传送“大轩”的例子,我们稍微把它改一改:

/execute as @e[name="大轩"] at @s run tp @s ~ ~3 ~

运行过后我们就可以看到“大轩”被传原地送到了3格上方的位置,但这未免有些麻烦,因为在这条指令中,我们注重的是执行坐标而不是执行者,所以我们只需要保留at就行了:

/execute at @e[name="大轩"] run tp @e[name="大轩",limit=1,sort=nearest] ~ ~3 ~

这条指令后面的tp不能使用@s了,因为在前面没有声明命令执行者,所以这里要复写一遍@e[name="大轩"],而且为了防止“大轩”出现传送到其他“大轩”上,我们必须限制它的传送者,不是所有的“大轩”,而是距离这个“大轩”最近的“大轩”才可以被传送上去,这我不说大家应该都明白:距离这个“大轩”最近的“大轩”其实就是他自己。

很多指令新手很容易在as与at子命令上失误,因为他们不知道在什么情况下去使用as或at,也容易将目标实体选择器搞混,所以就会出现类似于下面的错误:

/execute as @e[name="大轩"] at @s run tp @e[name="大轩"] ~ ~3 ~

这个指令看似没有问题,但当执行者出现多个的时候就漏洞百出了,因为后面的tp指令中@e是将所有的“大轩”传送至这个“大轩”的位置上方3格,那“大轩”有那么多个,系统也不知道你到底要传送到哪个“大轩”上,所以此时指令会按照遍历顺序依次传送一遍,到最后所有的“大轩”都会被传送到第一个被遍历的“大轩”上方,而且由于每个“大轩”都执行了一次命令,所以其实“大轩”们被传送了场上“大轩”数量次,那么往上传送的长度就等于3ד大轩”数。

at子命令也会定位到维度,意思是说这条指令可以跨维度执行,举个例子,假设聪明熊在下界,我在主世界输入这串指令:

/execute at @e[name="聪明熊"] run tp @s ~ ~3 ~

命令执行过后,我就会被传送到下界中。

facing

用途:将命令的执行朝向改为面向指定的坐标或某个实体,不改变命令执行者和执行位置。

格式:facing <坐标>或facing entity <目标实体> <eyes/feet>

参数:<坐标>:需要朝向的坐标,格式为<x> <y> <z>,可以使用~和^,执行朝向将会是朝向该坐标;<目标实体>:需要朝向的实体,可以是玩家名、UUID或目标选择器,执行朝向将会是朝向该实体,<eyes/feet>:确定朝向实体眼睛(eyes)还是脚(feet)的位置

效果:将朝向改为面向指定的坐标或目标实体

报错:参数不正确时报错

讲解:

facing子命令较为复杂,它不仅容许坐标,也容许实体,但与at与as子命令有共同之处,由于这条子命令不常用,这里就举几个例子:

/execute as @e[name="聪明熊"] at @s facing 0 0 0 run tp @s ^ ^ ^1

执行过后,所有名为“聪明熊”的实体都会向x=0,y=0,z=0的位置移动一格,这个命令可用于推算勾股定理、制造吸引力等等。

/execute as @e[name="聪明熊"] at @s facing entity @e[name="小乐",sort=nearest,limit=1] feet run tp ^ ^ ^0.5

执行这条指令过后,所有的“聪明熊”都会向最近的“小乐”的腿部移动0.5格,这条指令通常用于自定义AI捕捉系统。

in

用途:将命令执行维度设为特定维度,命令将在指定的维度中执行

格式:in <维度>

参数:<维度>,填写维度的命名空间ID,原版中有overworld(主世界),the_nether(下界),the_end(末路之地);如果装载的其他模组含有维度时也会显示,比如暮色森林twilightforest

效果:更新执行维度

报错:维度错误或不存在时报错

讲解:

这个指令十分简单,举几个例子相信大家就明白了,将玩家传送到下界x=0,y=0,z=0的的位置:

/execute in minecraft:the_nether run tp @s 0 0 0

这个指令注重坐标,通常不会与as连用,如果使用facing子命令使执行方向面向不同的维度时会无效。

当执行子命令run后有相对坐标(~)或局部坐标(^)时,要注意其目标维度位置与当前维度位置的坐标映射比(如下界与主世界的映射比为1:8)。

on

on子命令是在1.19.4新增的子命令,功能强大,堪比as,at等。

用途:将执行者设置为与当前执行者有指定类型的关系的实体。

格式:on <关系动作>

参数:<关系动作>:

  • attacker:最近5秒内对当前执行者造成伤害的最后实体。

  • controller:控制当前执行者的实体。

  • leasher:用拴绳牵引当前执行者的实体。

  • origin:当前执行者的来源:

  • 若当前执行者为弹射物,则为其发射者。

  • 若当前执行者为物品,则为其掷出者。

  • 若当前执行者为区域效果云,则为其来源者。

  • 若当前执行者为被激活的TNT,则为其点燃者。

  • 若当前执行者为唤魔者尖牙或恼鬼,则为其召唤者。

  • owner:当前执行者为可驯服生物时,此实体的主人。

  • passengers:直接骑乘于当前执行者的实体。

  • target:当前执行者的攻击目标。若当前执行者为交互实体,则为最后与其交互的玩家。

  • vehicle:正在被当前执行者骑乘的实体。

效果:

  • 若指定的关系不适用于当前执行实体,或此关系下没有匹配实体,则返回0个元素。

  • 参数不正确时,视为语法错误。

  • 若此参数无法解析为一个或多个有效实体(指定玩家必须在线)时,命令终止执行。

讲解:这个子命令可以很好的控制与命令执行者发生动作关系的实体,要注意的是若想要操控的关系实体不是自己的,那么需要在前面加上as子命令以更改命令执行者,举例:

/execute as @e[name="白鹤"] on attacker run kill @s

杀死5秒内对附近可检测到的所有名为“白鹤”的实体发起攻击动作的所有最后一个实体。

positioned

用途:在指定的坐标执行命令,改变执行位置,但不改变执行者、执行朝向

格式:positioned <坐标> 或positioned as <目标实体> 

参数:<坐标>:指定命令执行的坐标,格式为<x> <y> <z>,可以使用相对坐标和局部坐标;<目标实体>:entity(仅在as模式可用)指定命令执行的位置为<targets>所处的坐标,可以是实体ID、UUID或目标选择器

效果:改变命令的执行位置

报错:参数不正确时报错

讲解:

positioned与at子命令有共同之处,它们的作用都是改变命令执行位置,但不同点在于at针对的是实体坐标,positioned侧重于坐标方块坐标,由于不常用这个子命令,这里简单举个例子:

/execute positioned 0 0 0 run give @p minecraft:diamond 5

执行命令之后,系统会给距离x=0,y=0,z=0最近的玩家给予5个钻石,同样实体也是如此:

/execute positioned as @e[name="小乐"] run give @p minecraft:dirt 64

执行命令之后,距离“小乐”最近的玩家会被给予64个泥土。

rotated

用途:将命令的执行朝向设为特定方向,或者设为指定实体的朝向,改变执行朝向,不改变执行者和执行位置

格式:rotated <角度> 或rotated as <目标实体> 

参数:<角度>:需要的旋转角度,yaw指定水平旋转角度(正北方为-180.0,正东为-90.0,正南为0.0,正西为90.0,正北以西为179.9,之后回到-180.0)。可使用波浪号指定基于当前旋转角度的相对偏移,pitch指定垂直旋转角度(竖直上方为-90.0,至竖直下方90.0),可使用波浪号指定基于当前旋转角度的相对偏移;<目标实体>:采用指定实体的朝向

效果:更改与检测方向角度

报错:参数不正确时报错

讲解:与facing子命令有相同之处,但这个侧重于实体的朝向,由于不常用,这里就举个例子:

/execute as @e[name="小乐"] at @s rotated as @p run tp @s ^ ^ ^1

让所有的“小乐”向其最近的玩家作为移动方向移动一格。

summon

用途:立刻生成一个指定实体,并将命令执行者设置为此实体

格式:summon <实体>

参数:<实体>必须为可召唤实体的命名空间ID

效果:召唤实体,并设置其为命令执行者(相当于/summon后使用/execute as)

报错:参数不正确时报错

讲解:summon子命令相当于/summon后使用as子命令,但不同于/summon后使用as子命令的是此子命令无法在生成时修改实体的nbt标签,但在设置生成位置时要比/summon指令灵活(你可以选择在summon子命令前使用at或positioned子命令以修改实体的生成位置),并且在制作数据包或编写命令方块指令时可以在不更改实体tag标签的情况下直接操控指定实体。

WIKI提供的例子:

/execute summon villager run damage @e[type=iron_golem,sort=nearest,limit=1] 1 generic by @s

在玩家位置上生成一名村民,并让它对距其最近的铁傀儡造成1点()普通伤害。

条件子命令

条件子命令if和unless用于限制命令只有在指定的条件下执行。if为如果......就,而unless为除非......否则。 除此之外两者都有相同的参数结构。

如果在不使用存储子命令和run子命令的情况下单独执行条件子命令,execute命令将会报告是否匹配成功作为命令的成功次数,成功匹配的数量作为返回值。

有以下几种不同类型的条件:

  • (if|unless) biome – 检测具体方块处的生物群系

  • (if|unless) block – 检测单个具体方块

  • (if|unless) blocks – 检测两个长方体区域内的方块匹配情况

  • (if|unless) data – 检测方块、实体或存储持有的数据

  • (if|unless) entity – 检测指定实体是否存在

  • (if|unless) predicate – 指定谓词是否通过

  • (if|unless) score - 检测目标的分数

效果:

  • 当处于execute命令结尾时:对于if,如果条件成立则命令成功,否则失败。对于unless,如果条件不成立则命令成功,否则失败。

  • 当位于execute命令中间时:对于if,如果条件成立继续执行后续子命令,否则终止执行。对于unless,如果条件不成立则继续执行后续子命令,否则终止执行。

biome

用于比较给定位置上的生物群系是否符合给定的生物群系ID或生物群系标签

格式:if/unless biome <坐标> <生物群系ID或标签>

讲解:

biome参数可用于检测特定的坐标是否是某个生物群系,但通常坐标不会是一个常量,而是与at参数等连用:

/execute as @e[name="凤梨"] at @s if biome ~ ~ ~ minecraft:forest run effect give @s minecraft:speed 0 1

这串指令会在运行时做出这件事:如果“凤梨”在生物群系“森林”中,会给予“凤梨”一个强度为1级,时间为1秒的速度效果。

block

用于比较给定的位置的方块是否为给定的方块ID

格式:if/unless block <坐标> <方块注册名或标签>

讲解:

block参数相当于1.13前testforblock指令的作用,可以检测特定坐标是否为某个方块(可附带NBT标签):

/execute as @a at @s if block ~ ~-1 ~ minecraft:glass run setblock ~ ~-1 ~ minecraft:air

指令运行时会做出:当玩家脚下为玻璃时,会让其替换为空气。

blocks

用于比较相同大小的两个长方体区域的方块

格式:if/unless blocks <长方体第一对角位置> <长方体第二对角位置> <对照区域的西北下角方块的坐标(即长方形区域内x y z坐标最小处)> <比较模式>

讲解:

blocks参数相当于1.13之前的testforblocks指令,可用于比较大范围内的方块是否相同(可附加NBT标签),比较模式中可以是all(比较全部方块)或masked(忽略空气方块),由于该参数较为灵活,这里就不写例子了。

data

用于检查目标方块、实体或存储NBT是否拥有给定的NBT标签

格式:if/unless data block <坐标> <nbt> ;if/unless data entity <目标实体> <nbt>;if/unless data storage <需要检测储存的命名空间> <nbt>

讲解:

用法较为复杂,建议熟悉NBT标签后自行研究,这里不做过多介绍了。

dimension

检测命令执行时所处维度是否为特定维度

格式:if/unless dimension <维度>

讲解:

dimension并没有什么难度,但需要注意的是检测维度时是检测执行坐标维度而不是执行者所处维度。

entity

检查一个或多个特定实体是否存在

格式:if/unless entity <目标实体>

讲解:

entity参数相当于1.13之前的testfor指令,通常不会单独拿出来用,会配合一些特定的标签进行使用,例子:

/execute if entity @e[name="凤梨",distance=..3] run give @a minecraft:diamond 2

如果在命令执行时“凤梨”距离命令执行者小于3格,那么就给所有玩家2个钻石。

loaded

检测某个坐标所处的区块是否已被加载

格式:if loaded <坐标>

用法:

坐标必须是方块坐标,这意味着此位置必须是整数坐标,你也可以使用相对坐标,若相对坐标在参与运算后是小数,则自动向下取整。

predicate

用于检查谓词是否通过(结果是否为正)

格式:if/unless predicate <谓词>

用法:

牵涉到JSON文本,这里不做介绍,想了解的读者可以查询一下谓词是什么。

score

用于检查指定目标的记分板中的记分项的分数是否与另一个(或同一个)目标的记分项的分数是否符合指定的关系,或者是否在给定的范围之内

格式:if/unless score <目标实体> <目标记分板> (<|<=|=|>=|>)<比较实体> <比较记分板>(检查<目标实体>的<目标记分板>的分数与<比较实体>的<比较记分板>的分数是否符合运算符的关系);if/unless score <目标实体> <目标记分板> matches <范围>(——检查<目标实体>的<目标记分板>的分数是否在指定<范围>内)

讲解:

score参数常用于冒泡排序与比赛中的胜负判定,举个例子(这里的目标分数用Scores):

/execute if score 裁判官 Scores > BADASS Scores run give 裁判官 minecraft:gold_block 1

这里就是如果“裁判官”的得分比“BADASS”的得分高,那么就给“裁判官”一个金块。

存储子命令

存储子命令可以让命令在执行之后将命令返回的结果或成功次数储存于记分板、NBT数据、或boss栏中,有store result和store success两种模式。注意命令的返回值必定为整数,若为小数会被向下取整。每种命令的返回值情况在对应的页面有表格或文字记载。本章节较为复杂,所以只说明用途。

有五种不同的存储模式:

  • store (result|success) block——存储在方块NBT中

  • store (result|success) bossbar——存储在boss栏的数据中

  • store (result|success) entity——存储在一个实体的NBT中

  • store (result|success) score——存储在目标的记分项的分数中

  • store (result|success) storage——存储在储存的NBT中

block

将命令的返回值存储为方块实体内的标签数据。可存储为字节、短整型、整型、长整型、浮点或双精度浮点的格式。如果返回值为小数,会先向下取整然后乘以一定的<scale>。

bossbar

将命令的返回值存储为boss栏的当前值或者最大值。

entity

将返回值或成功次数乘以<scale>后储存在<target>的NBT标签的<path>中,并储存为指定的NBT格式。若返回值为小数,则先向下取整再乘以<scale>。与/data一样,不能修改玩家的NBT。

score

使用储存中的<path>以将返回值或成功次数存储为指定的数据类型。如果返回的值是小数,则先取整再乘以一定的<scale>。如果存储不存在,则会创建。

storage

将返回值或成功次数存入指定存储容器的指定NBT标签内,若目标存储容器不存在,则创建。

执行成功时,将返回值向下取整并乘以<scale>后存储在<target>存储容器的<path>NBT标签处,并存储为指定的NBT格式。

执行子命令

只包含run子命令,其后面需跟着要被执行的命令。

格式:run <命令>

参数:<命令>:一条完整的命令,不可以用斜杠开头

结果:执行这个命令,指定的命令执行成功时成功,失败时失败

讲解:

run子命令在之前我们已经见过很多例子了,这里稍微强调一些事情:

  • run子命令后面还可以执行execute指令,只不过这没有任何意义,在execute指令中嵌套execute指令相当于子命令直接结合在一起

  • run子命令在执行时会重置command dispatcher的根节点

  • run子命令后面除非再次使用execute指令,否则不能再使用任何一条execute的子命令了,这意味着一条execute指令只能执行一条指令

常用execute子命令嵌套组合

用于在实体踩上特定方块时触发:

/execute as @a at @s if block ~ ~-1 ~ <block> run <command>

用于在实体的位置执行命令:

/execute at @a run <command>

用于在玩家的十字准心所对着2格的位置放置方块:

/execute as @a at @s run setblock ^ ^ ^2 <block>

用于检测玩家是否到了特定的位置:

/execute if entity @a[x=,y=,z=,distance=..1] run <command>

1.13以后execute指令有什么利与弊

execute指令在1.13以下的版本中没有子命令这一说法,这让很多事情都难以做成,因为当时的语法没有被拆分开,执行者、执行坐标与执行方向都是杂糅在一起的,想要单独控制某一个参数是非常棘手的,但在1.13以后execute指令被拆分成多个结构,让玩家可以更加容易地去控制单独的参数,这使命令方块的出场率在后面的版本中逐渐的发展了起来。但同时execute指令的改动也增加了execute指令的上手难度,很多新手指令玩家很难区分开执行者、执行位置、执行角度等,并且execute指令的改动也使很多1.13以下的地图无法快速移植到新的版本中,但是我们不得不承认execute指令的改动也确实为MC命令的发展起到了决定性作用,数据包、地图等往往都少不了execute指令。execute指令的改动将MC指令界截成两半,使MC地图与数据包变得更加多姿多彩,我也希望MC以后的指令能更上一层楼!