第189章 ,/.

上面这条指令的意思是:将所有村民作为执行者,给villager_count在计分项an_objective上的分数加上1。而指令在运行过程中,会将每位村民都作为执行者运行一遍指令,因此最终指令将会运行『村民总数量』遍,我们也成功地将村民的总数量作为分数记到了计分板上。假设现在有两名村民,最终得到的分数将会是2,因为这两个村民都分别运行了一遍『scoreboard players add villager_count an_objective 1』。

为什么指令在运行过程中,会将每位村民都作为执行者运行一遍指令,而不是直接将所有村民作为执行者,仅仅运行一遍指令?

原因很简单:每条指令执行过程中,执行者、执行位置、执行朝向分别都只能有一个。

请你一定要记住这个知识点,因为接下来我们将会需要运用这个知识点来解决一些问题。

对了,既然新版本的execute有这个特性,那旧版本呢?

这章没有结束,请点击下一页继续阅读!

也是有的。

所以你能想到这有什么用处吗?

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都会在每一个实体和每个位置运行一遍指令。