本篇教程由作者设定未经允许禁止转载。
/execute是各不同功能的子命令的集合,用于改变命令执行上下文(修饰子命令),执行逻辑判断(条件子命令)和管理并存储命令返回值(存储子命令),并在此基础上执行任意目标命令。
——官方WIKI
前言
本教程篇幅很长,部分资料来自于WIKI,难度较高,不建议指令新手学习。
入手门槛:
至少可以分清执行坐标、执行者与执行方向;
会使用/tp等简单的指令;
会使用目标选择器;
可以熟练运用绝对坐标、相对坐标和局部坐标。
概述
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 detect /execute execute .../execute因为今天的重点不是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
参数:基准是眼睛的位置(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 0as子命令不建议在没有完全了解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了,因为在前面没有