也是有的。
所以你能想到这有什么用处吗?
testfor指令虽然可以用来探测指定实体是否存在,但想要将数量储存到计分板中还需要一个/stats指令,十分麻烦且容易出错。而execute如果这样用,直接吊打testfor啊!而且,这是可以用于基岩版的,做玩家人数检测或实体数量检测!
比如在基岩版,你可以这么干:
/execute @a[r=10,x=15,y=94,z=20,tag=游戏参与者]~~~ scoreboard players add player_count count 1
这将会计算出以(15,94,20)为中心,半径10米内带有『游戏参与者』标签的玩家数量,非常适合用于小游戏的人数判定。
回到正题啊,接下来我们来看看at子命令。
at子命令,可以更改执行位置中的维度位置、坐标以及执行朝向中的旋转角度为指定实体的维度位置、坐标和旋转角度。其格式也是十分滴简单:
... at <实体:目标选择器>...
举个例子:
/execute at @e[type=minecraft:arrow] run summon villager ~~~
这将会在每支箭的位置,分别运行一遍『summon villager ~~~』来召唤一只村民。
可以发现,虽然我们没有更改执行者,但相对坐标的基准点却被更改了,这说明相对坐标默认不是将执行者的位置作为基准点的,而是将指令执行位置作为基准点。其实这个我们在第五章就已经提到了,这里只不过再提一下而已。
另外,你有没有注意到『分别』两个字?也就是说,at子命令照样会使得指令在每个位置分别运行一遍。不要小看这一点,待会你就会知道小看这一点会导致什么严重的灾难。
in可以更改指令执行的维度位置,因此我们可以通过in指令来快速前往其他维度。其语法如下:
... in <维度ID>...
举个例子:
/execute in minecraft:the_nether run tp @s ~~~
这将会把你传送到地狱。需要注意的是,你的x和z坐标可能会被除以8。比如你原先的坐标是(16,80,16),传送到下界后估计就会变成(2,80,2)。
为什么呢?如果你有一点MC常识的话,你就会知道,在大多数Minecraft版本中,下界中的1米相当于主世界的8米,所以自然而然,你从主世界传送到下界,x和z轴就会除以8(可以通过添加其他子命令来避免这种情况)。
但在Java稍微旧一些的版本中,运行上述指令并不会改变你的坐标,也就是说不会除以8,还是会保留你原先的(16,80,16)。这是作者在1.14.4版本中发现的,但在最新的1.19版本中不会出现这种情况,因此应该是在1.14.4~1.19间的某个版本修复了这个BUG。作者猜测可能是1.16更新,只不过懒得去测试了。
另外还需要注意,在1.18及更高版本中,虽然主世界的Y坐标向下延伸到了-64,但其他维度并未变化,因此如果你从Y坐标小于0的地方直接传到地狱或其他维度,极有可能会掉进虚空!
现在我们来尝试一下结合上面的三个子命令+run子命令,看看当多条子命令结合起来时会有什么效果。
我们来试着将所有实体往上抬1米:
/execute as @e at @e run tp @s ~~1 ~
运行之后,你会惊喜的发现,所有实体都往上抬了1米,但也都传到了同一个地方,甚至有些实体还被挤死了。
这是怎么回事?
这就是为什么我在前面一直提醒着你说at和as都会在每一个实体和每个位置运行一遍指令。
让我们来逐步分析一下上面的指令出了什么bug,也就是模拟一下游戏运行这条指令的过程。
假设现在整个世界仅仅只有3个实体:一名玩家(最早生成),一位村民和一只羊(最晚生成)。
当这名玩家敲下回车键将指令发送给游戏时,游戏开始对这条指令进行解析并运行:
as子命令让游戏知道,接下来要改变执行者。而目标选择器@e选择了这三个实体,并使得它们按照生成时间的早晚排序,因此游戏根据as @e,先选择了这名玩家作为执行者,然后再选择村民,最后选择羊。
接下来游戏看到了at @e,由于之前已经选择好了执行者,所以游戏根据上文还有这里,得知这名玩家将会依次在玩家的位置、村民的位置和羊的位置分别运行一遍指令,村民和羊同理。
本小章还未完,请点击下一页继续阅读后面精彩内容!
喜欢Minecraft指令手册请大家收藏:(m.2yq.org)Minecraft指令手册爱言情更新速度全网最快。