本書(shū)第一次大修新增章 ① 礦詞與標(biāo)簽
這一章原本是第六十四章的番外,但由于內(nèi)容感覺(jué)十分水就去掉了。
所以這里就變成了多出來(lái)一章,寫(xiě)什么呢?
這一章我們不妨來(lái)填一下一些之前挖的坑。
我們?cè)诘诙轮v到family參數(shù)時(shí),提到了這么一句話:
『記分板、NBT和標(biāo)簽可以很好的解決這個(gè)問(wèn)題。但在了解這三個(gè)東西之前,我們暫且沒(méi)有除多弄命令方塊以外的更好的辦法?!?p> 計(jì)分板我們已經(jīng)了解過(guò)了,NBT我們會(huì)在100章開(kāi)始進(jìn)入正式學(xué)習(xí)階段。
那么這個(gè)『標(biāo)簽』是什么東西?計(jì)分板標(biāo)簽嗎?
我們知道,Minecraft Java版可以裝上各種第三方的模組加載器(Mod Loader),其中最出名的就是Minecraft Forge。在Minecraft1.13版本更新之前,Minecraft Forge內(nèi)有一個(gè)重要的系統(tǒng):礦物詞典(OreDictionary)。
『礦物詞典』又是什么鬼?這跟『標(biāo)簽』有什么關(guān)系?
Minecraft Forge官方文檔中對(duì)『礦物詞典』的定義如下:
『礦物詞典(OreDictionary)主要是為了Mod間兼容而存在。
已注冊(cè)到礦物詞典的物品將能夠代替其它擁有相同礦物詞典名的物品。這樣就可以使用以上任一物品合成相同的結(jié)果。
雖然名字是“礦物(Ore)”詞典,但是它也可以使用在非礦物的物品上。只要一個(gè)物品與另一個(gè)物品(比如染料)相似,就都可以注冊(cè)進(jìn)礦物詞典,并通過(guò)礦物詞典調(diào)用?!?p> 舉個(gè)例子,在工業(yè)時(shí)代2(Industrial Craft 2)模組中添加了銅錠,沉浸工程(Immersive Engineering)模組中也添加了銅錠,這兩個(gè)銅錠由于是不同模組所添加的,所以是不同的物品,這就導(dǎo)致一個(gè)問(wèn)題:
假如我死活搞不到工業(yè)時(shí)代2的銅錠,只能搞到沉浸工程的銅錠,既然都是銅錠,為什么就不能通用?。。?!我還想造IC2的機(jī)器呢?。?!
于是,礦物詞典就來(lái)了。沉浸工程的開(kāi)發(fā)者只需要給自家的銅錠添加上一個(gè)銅錠的礦物詞典(ingotCopper),工業(yè)時(shí)代2的開(kāi)發(fā)者也只需要給自家的銅錠添加上一樣的礦物詞典(ingotCopper),然后你就會(huì)驚喜地發(fā)現(xiàn),兩邊的銅錠可以通用了!
當(dāng)然,實(shí)際情況肯定比這更加復(fù)雜,只不過(guò)我們又不開(kāi)發(fā)模組,干嘛要去管這些更深層次的東西。我們只需要知道:
不同模組類似的物品可以注冊(cè)到同一個(gè)礦物詞典中,來(lái)使得不同模組的類似物品能夠通用。
那么標(biāo)簽又是什么呢?
MC百科(mcmod.cn)中對(duì)標(biāo)簽的解釋如下:
『數(shù)據(jù)包中的標(biāo)簽(Tag)允許玩家使用JSON文件將物品、方塊、流體、實(shí)體類型和函數(shù)分組,標(biāo)簽在原版 1.13 及以上版本中替代了礦物詞典的功能?!?p> 需要注意,這里的原版指的是Minecraft Java版,基巖版并沒(méi)有什么礦物詞典和這種類型的標(biāo)簽。
看起來(lái)很高端的樣子?。康鋵?shí)這標(biāo)簽僅僅是一個(gè)官方逼死第三方的更高端的『礦物詞典』。
和礦物詞典一樣,不同的物品也可以注冊(cè)到同一個(gè)標(biāo)簽中,來(lái)使得不同模組的類似物品能夠通用。
但在之前,礦物詞典最多也僅僅能讓物品在工作臺(tái)中、熔爐中等特定功能性方塊中才能通用,官方的標(biāo)簽卻更上一層樓,使得類似物品幾乎能在任何地方通用!
比如你可以給你自己開(kāi)發(fā)的箭添加上arrows標(biāo)簽,你這個(gè)物品就可以被原版的弓和弩射出去;你可以給你自己的食物添加上fox_food標(biāo)簽,這個(gè)食物就可以被喂食給狐貍......
但官方的格局可不止僅僅限制在物品中,讓我們把格局打開(kāi)一點(diǎn),你就會(huì)發(fā)現(xiàn)官方讓Minecraft中的其他東西也能夠用上標(biāo)簽來(lái)使得其他東西也能夠通用。這些『其他東西』一共有十四類,加上物品就十五類了,包括:方塊、實(shí)體、流體、游戲事件、物品、貓、生物群系、超平坦模式生成器配置、結(jié)構(gòu)、世界預(yù)設(shè)、畫(huà)種類、旗幟圖案、樂(lè)器、興趣點(diǎn)和函數(shù)。
標(biāo)簽在這些其他東西上的運(yùn)作方式也一樣:具有同一個(gè)標(biāo)簽的東西,就可以具有同樣的功能或性質(zhì)。
比如擁有frog_food標(biāo)簽的實(shí)體,就會(huì)被青蛙當(dāng)成食物來(lái)吃;擁有l(wèi)ava標(biāo)簽的流體,就會(huì)具有巖漿的功能;擁有tick標(biāo)簽的函數(shù),會(huì)在每游戲刻開(kāi)始時(shí)運(yùn)行;擁有village標(biāo)簽的結(jié)構(gòu),會(huì)像村莊一樣生成......
講了那么多,那這跟指令有什么關(guān)系呢?
回到最開(kāi)始的那句話:『記分板、NBT和標(biāo)簽可以很好的解決這個(gè)問(wèn)題。但在了解這三個(gè)東西之前,我們暫且沒(méi)有除多弄命令方塊以外的更好的辦法。』
這個(gè)問(wèn)題是什么?就是你怎樣才能在目標(biāo)選擇器中一次性選取多個(gè)類型的實(shí)體。
在基巖版我們可以通過(guò)family參數(shù)來(lái)選擇,但在Java版呢?
Mojang在Minecraft Java1.14中開(kāi)始為實(shí)體添加標(biāo)簽,這就代表著我們?cè)贛inecraft Java1.14及以上版本可以通過(guò)標(biāo)簽來(lái)對(duì)實(shí)體進(jìn)行選擇。
怎么選擇呢?在目標(biāo)選擇器的type參數(shù)中,使用『#+命名空間+標(biāo)簽名稱』即可。
比如要選中所有骷髏類型的實(shí)體,你只需要:
@e[type=#minecraft:skeletons]
這樣子就可以選擇包括骷髏、凋零骷髏等骷髏類的實(shí)體。
而且由于一個(gè)實(shí)體可以具有多個(gè)標(biāo)簽,所以你可以使用多個(gè)type參數(shù)指定多個(gè)標(biāo)簽來(lái)篩選。
比如@e[type=#minecraft:skeletons,type=#minecraft:freeze_immune_entity_types],這就可以選擇同時(shí)具有freeze_immune_entity_types和skeletons標(biāo)簽的實(shí)體,即流浪者。
你還可以在#前面加上!來(lái)實(shí)現(xiàn)『不選擇具有指定標(biāo)簽實(shí)體』的功能。比如@e[type=#minecraft:skeletons,type=!#minecraft:freeze_immune_entity_types],這就將會(huì)排除流浪者,只會(huì)選擇普通骷髏和凋零骷髏。
只不過(guò)和family參數(shù)一樣,目前Mojang給原版實(shí)體添加的標(biāo)簽還太少了。但別擔(dān)心,因?yàn)槟悴粌H僅可以使用實(shí)體的標(biāo)簽,你還可以使用函數(shù)、方塊和物品的標(biāo)簽。
比如在指令clear中,你就可以這樣子:
/clear @a #minecraft:buttons
這將會(huì)清除所有玩家背包中的按鈕,不管是什么按鈕都行。
也比如在指令execute中,你就可以這樣子:
/execute at @a if block ~~-1 ~#minecraft:snow run kill @s
這將會(huì)使得所有腳下踩著雪的玩家死亡,不管這個(gè)雪是頂層雪還是雪塊還是什么其他類型的雪。
?。ㄟ@個(gè)execute指令的語(yǔ)法是第八卷,也就是下一卷的內(nèi)容,我們很快就會(huì)學(xué)習(xí)其具體的用法了)
只不過(guò)Mojang太懶了,導(dǎo)致在原版中,即使是方塊和物品,標(biāo)簽也是太少,發(fā)揮不了很大的作用。
那怎么辦?裝Forge??!
Forge為原版提供了許多有用的標(biāo)簽,雖然這些主要用途是像礦物詞典那樣幫助模組互通,但我們指令也是可以用的。
比如使用Forge提供的礦物錠標(biāo)簽,就可以實(shí)現(xiàn)檢測(cè)一個(gè)玩家背包內(nèi)所有類型錠的數(shù)量:
/execute as @a store result score @s ingot_count run clear @s #forge:ingots 0
這條指令將會(huì)將所有玩家背包內(nèi)任何類型錠的總數(shù)量以分?jǐn)?shù)的形式存儲(chǔ)在玩家自己的ingot_count計(jì)分板中。
所以這就是本章的全部?jī)?nèi)容了,Have you learned it?