第四章 目標選擇器
(本章寫作時作者使用的是Java1.12.2、1.17.1和基巖1.17.0)
這里有一只牛。
我們要用指令鎖定這頭牛。
但怎么鎖定呢?
你在命令方塊界面可能見到過這段話:
用“@p”來代表最近的玩家
用“@r”來代表隨機玩家
用“@a”來代表全部玩家
用“@e”來代表全部實體
用“@s”來代表執(zhí)行實體
(這段話在Java新版本被移除了)
這段話中所講的東西,就是指令中常見的一個參數(shù)類型:目標選擇器。
目標選擇器,顧名思義就是選擇目標,而目標就是Minecraft中的“實體”。不懂實體是什么?Minecraft Wiki對實體的定義是:『包括在Minecraft中所有動態(tài)的、移動中的對象』。簡單且不嚴謹?shù)貋碚f,實體指的是非方塊的東西,比如玩家、生物等都是,還有例如掉落的方塊、點燃的TNT也是實體。
目標選擇器的本質就是通過一系列的參數(shù)指定篩選的條件,然后游戲根據(jù)給出的條件對所有實體進行篩選,進而得到指令執(zhí)行的作用目標。通過目標選擇器,我們可以指定指令執(zhí)行時所產生的效果會在哪些實體上奏效。比如我們一開始就提到的/kill指令,這條指令就可以使用目標選擇器來選擇哪些實體會被殺死。
實際上我們也可以不用目標選擇器指定目標,反而使用玩家名稱或實體UUID(UUID是一串很長且隨機生成的字符串,每個Minecraft實體都有一個唯一的UUID以便游戲區(qū)分)。但這兩個東西,一方面效率低下,另一方面不能自動化。下面就是一個例子:
假設此時有一名玩家,其名稱叫做“JIE灬揮刀亂砍”(如有同名,純屬巧合),玩家UUID是“5409be4a-6333-4912-ab5b-58265ccbfe3c“。如果他想要用指令給自己一個鉆石塊,還不用目標選擇器指定,就要這么寫:
/give JIE灬揮刀亂砍 command_block
或者是這樣寫:
/give 5409be4a-6333-4912-ab5b-58265ccbfe3c command_block
使用目標選擇器,只需要:
/give @s command_block
其中,@s就代指了執(zhí)行該指令的實體。
命令方塊中的介紹有點過于簡單,還是得具體介紹一下:
@p——代指距離執(zhí)行地點最近的玩家,包括死亡玩家,如果沒有執(zhí)行地點,默認是主世界坐標(0,0,0)的地方,一般來說這種情況只會在服務器控制臺執(zhí)行指令時出現(xiàn)。關于坐標會在下一章講到。
@s——代指執(zhí)行指令者,不管執(zhí)行指令者是否已經死亡。如果執(zhí)行指令者不是個實體,比如是個命令方塊,那么將會什么也不會發(fā)生。
@a——代指所有玩家,包括已經死亡的玩家
@r——隨機選擇一位玩家,包括已經死亡的玩家
@e——代指所有實體,不包括已死亡實體
@c——代指自己的吉祥物[僅教育版]
@v——代指所有吉祥物[僅教育版]
@initiator——代指正在與該NPC交互的玩家[僅基巖版],不管這名玩家是否在交互時被殺死
最后一個@initiator是一個比較新奇的東西,它無法用在除基巖版NPC以外的地方,關于基巖版的NPC以后的章節(jié)會講到。