第四章 目标选择器
(本章写作时作者使用的是Java1.12.2、1.17.1和基岩1.17.0)
这里有一只牛。
我们要用指令锁定这头牛。
但怎么锁定呢?
你在命令方块界面可能见到过这段话:
用“@br /”来代表最近的玩家
用“@r”来代表随机玩家
用“@a”来代表全部玩家
用“@e”来代表全部实体
用“@s”来代表执行实体
(这段话在Java新版本被移除了)
这段话中所讲的东西,就是指令中常见的一个参数类型:目标选择器。
目标选择器,顾名思义就是选择目标,而目标就是Minecraft中的“实体”。不懂实体是什么?Minecraft Wiki对实体的定义是:『包括在Minecraft中所有动态的、移动中的对象』。简单且不严谨地来说,实体指的是非方块的东西,比如玩家、生物等都是,还有例如掉落的方块、点燃的TNT也是实体。
目标选择器的本质就是通过一系列的参数指定筛选的条件,然后游戏根据给出的条件对所有实体进行筛选,进而得到指令执行的作用目标。通过目标选择器,我们可以指定指令执行时所产生的效果会在哪些实体上奏效。比如我们一开始就提到的/kill指令,这条指令就可以使用目标选择器来选择哪些实体会被杀死。
实际上我们也可以不用目标选择器指定目标,反而使用玩家名称或实体UUID(UUID是一串很长且随机生成的字符串,每个Minecraft实体都有一个唯一的UUID以便游戏区分)。但这两个东西,一方面效率低下,另一方面不能自动化。下面就是一个例子:
假设此时有一名玩家,其名称叫做“JIE灬挥刀乱砍”(如有同名,纯属巧合),玩家UUID是“5409be4a-6333-4912-ab5b-58265ccbfe3c“。如果他想要用指令给自己一个钻石块,还不用目标选择器指定,就要这么写:
/give JIE灬挥刀乱砍 command_block
或者是这样写:
/give 5409be4a-6333-4912-ab5b-58265ccbfe3c command_block
使用目标选择器,只需要:
/give @s command_block
其中,@s就代指了执行该指令的实体。
命令方块中的介绍有点过于简单,还是得具体介绍一下:
@br /——代指距离执行地点最近的玩家,包括死亡玩家,如果没有执行地点,默认是主世界坐标(0,0,0)的地方,一般来说这种情况只会在服务器控制台执行指令时出现。关于坐标会在下一章讲到。
@s——代指执行指令者,不管执行指令者是否已经死亡。如果执行指令者不是个实体,比如是个命令方块,那么将会什么也不会发生。
@a——代指所有玩家,包括已经死亡的玩家
@r——随机选择一位玩家,包括已经死亡的玩家
@e——代指所有实体,不包括已死亡实体
@c——代指自己的吉祥物[仅教育版]
@v——代指所有吉祥物[仅教育版]
@initiator——代指正在与该NPC交互的玩家[仅基岩版],不管这名玩家是否在交互时被杀死
最后一个@initiator是一个比较新奇的东西,它无法用在除基岩版NPC以外的地方,关于基岩版的NPC以后的章节会讲到。