第五十四章 初識(shí)NBT
?。ù苏鹿?jié)已于2022年8月1日再次修改)
你肯定很好奇為什么多人游戲指令講著講著就突然講到NBT了。實(shí)際上原本這一章講的是『解封玩家』,但在本書(shū)第一次大修過(guò)程中這一章的內(nèi)容被合并到了第五十二章,因此這一章就空了出來(lái)。
還有一個(gè)原因是,第一次大修過(guò)程中,我也去參考了許多其他制作得比較優(yōu)良的Minecraft命令教程,發(fā)現(xiàn)他們大多數(shù)講NBT比較早,這樣子以后深入時(shí)就好展開(kāi)講。而本書(shū)在第一次大修前,NBT的內(nèi)容在第100章才匆忙開(kāi)始。
因此,為了讓各位讀者能夠更好地掌握NBT的相關(guān)知識(shí),我們就先在這里初步認(rèn)識(shí)一下NBT。
————————————
在第一次聽(tīng)到NBT這個(gè)詞時(shí),你腦海里肯定會(huì)浮現(xiàn)出三個(gè)問(wèn)題:
『什么是NBT?NBT能干什么?我該如何使用NBT?』
NBT,全稱Named Binary Tag,中文翻譯為二進(jìn)制命名標(biāo)簽。它在Minecraft中你雖然見(jiàn)不到,但它無(wú)處不在:在雞里面、在計(jì)分板里面、在玩家里面、在區(qū)塊里面......
所以NBT到底是啥?
.........
『看,那里有一個(gè)東西!』
單純這樣描述,你估計(jì)想不出來(lái)也不了解這個(gè)『東西』是什么。但如果我這樣描述呢:
這個(gè)東西的『種類(lèi)』是『生物』
『生物種類(lèi)』是『狗』
『毛發(fā)顏色』是『黃色』
『品種』是『哈士奇』
『質(zhì)量』是『33kg』
『主人』是『旁邊的那個(gè)人』
『年齡』是『5歲』
當(dāng)我像上面這樣描述時(shí),你對(duì)這個(gè)東西也越發(fā)的變得了解。NBT也是個(gè)類(lèi)似的玩意兒,只不過(guò)它不光是給你看的,它還是給游戲看的。
在Minecraft中,NBT就像上面我描述那個(gè)東西所用的方法一樣,它也用于『描述』游戲內(nèi)部的事物:
『命名空間ID』是『minecraft:command_block』
『限制』是『無(wú)條件限制』
『坐標(biāo)』是『45,12,32』
『自動(dòng)激活』是『關(guān)閉』
『內(nèi)部指令』是『say hello!』
通過(guò)上面的描述,你和游戲應(yīng)該都清楚了,這是一個(gè)脈沖型、沒(méi)有條件限制、處于坐標(biāo)(45,12,32)、需要紅石、寫(xiě)有指令『say hello!』的命令方塊。
仔細(xì)觀察上面的內(nèi)容,你應(yīng)該會(huì)發(fā)現(xiàn),我們都是使用類(lèi)似于下面的格式來(lái)進(jìn)行描述:
『一個(gè)描述』是『多少』
像上面這樣子的一對(duì)『描述』和『值』,在NBT中就叫做『標(biāo)簽』。
一個(gè)標(biāo)簽具有標(biāo)簽名稱和值,標(biāo)簽名稱規(guī)定了這個(gè)標(biāo)簽具體是干啥用的,值則描述了這個(gè)標(biāo)簽具體是怎么干的。標(biāo)簽名稱和值使用英文半角冒號(hào)分開(kāi),標(biāo)簽名在左,值在右。比如:
Health:20.0f
這個(gè)標(biāo)簽的名稱是『Health』,代表著這個(gè)標(biāo)簽用來(lái)記錄著這個(gè)東西的生命值。值是『20.0f』,代表著這個(gè)東西當(dāng)前的生命值為20.0(你先不用管f是啥)。
標(biāo)簽和標(biāo)簽之間使用英文半角逗號(hào)區(qū)分,比如:
Health:20.0f,CustomName:“What?“
一堆像這樣的標(biāo)簽,就組成了一個(gè)NBT標(biāo)簽:
{Health:20.0f,CustomName:“What?“}
一個(gè)NBT標(biāo)簽內(nèi)有一個(gè)或多個(gè)標(biāo)簽,外面被花括號(hào)所包圍。NBT標(biāo)簽其實(shí)還可以嵌套作為值成為『復(fù)合標(biāo)簽』,下面會(huì)具體講到這個(gè)東西。
和JSON文本一樣,標(biāo)簽的值也有許多類(lèi)型,具體的我們到以后再詳細(xì)了解,這里就先簡(jiǎn)單介紹一下。
值的數(shù)據(jù)類(lèi)型可以粗略分為五種:數(shù)組、數(shù)值、文本、復(fù)合標(biāo)簽和列表。數(shù)組以后再講,現(xiàn)在我們只需要來(lái)認(rèn)識(shí)一下剩下的四種。
數(shù)值類(lèi)型,也就是一串?dāng)?shù)字。一般這一串?dāng)?shù)字為整型數(shù),比如:
{Dimension:10}
但有些標(biāo)簽的值也可以是浮點(diǎn)數(shù),如:
{Health:7.8f}
(f在這邊代表值類(lèi)型為單精度浮點(diǎn)數(shù),一般情況下可以省略這些后綴字母,但如果出了問(wèn)題還是要加上的)
什么是整型和浮點(diǎn)數(shù)?簡(jiǎn)單來(lái)說(shuō),整型就是整數(shù)數(shù)據(jù)類(lèi)型,也就是整數(shù);浮點(diǎn)數(shù)是一種看起來(lái)很像小數(shù)的表示方法。其中,后者具有小數(shù)點(diǎn),既能表示整數(shù)也能表示小數(shù)。比如:
10
10.0
雖然這兩個(gè)數(shù)大小一樣,也都是整數(shù)。但在計(jì)算機(jī)眼中,上者是『整型數(shù)』,下者是『浮點(diǎn)數(shù)』,并不一樣。
文本類(lèi)型,也就是一串文本。和數(shù)值不一樣的是,文本需要使用英文半角引號(hào)將內(nèi)容包裹起來(lái)。如:
{CustomName:“Arcaea“}
在Java1.14及以上版本中,引號(hào)也可以使用半角單引號(hào):
{CustomName:'Arcaea'}
復(fù)合標(biāo)簽類(lèi)型聽(tīng)起來(lái)很高大上。但只要你語(yǔ)文好一點(diǎn),就會(huì)發(fā)現(xiàn)它并沒(méi)有多么高大上。
『復(fù)合』的意思是:把兩種或幾種成分結(jié)合起來(lái)。所以『復(fù)合標(biāo)簽』的意思就是:把多個(gè)標(biāo)簽結(jié)合起來(lái)。在這邊,這個(gè)標(biāo)簽并不是普通的標(biāo)簽,而是由多個(gè)標(biāo)簽組合成的NBT標(biāo)簽:
{標(biāo)簽名:{標(biāo)簽名:值,標(biāo)簽名:值......}}
也就是說(shuō),復(fù)合標(biāo)簽本質(zhì)上,其實(shí)就是將一個(gè)NBT標(biāo)簽塞到另一個(gè)NBT標(biāo)簽里面去:
{Riding:{id:“xxxx“,Health:20.0f},id:“yyy“}
列表類(lèi)型常常與復(fù)合標(biāo)簽類(lèi)型結(jié)合使用。它長(zhǎng)這個(gè)樣子:
{標(biāo)簽名:[值,值,值,值......]}
列表類(lèi)型的本質(zhì),就是把多個(gè)同類(lèi)型的值組合在一起。比如:
{Friends:[“XiaoHong“,“XiaoMing“,“XiaoZhang“]}
這里Friends標(biāo)簽的值就是三個(gè)文本組成的列表。
剛才說(shuō)過(guò)列表類(lèi)型常常與復(fù)合標(biāo)簽類(lèi)型結(jié)合使用,具體的使用法是這樣子的:
{標(biāo)簽:[{標(biāo)簽},{標(biāo)簽},{標(biāo)簽}]}
也就是把多個(gè)NBT標(biāo)簽(復(fù)合標(biāo)簽)組合成一個(gè)列表。在以后我們會(huì)經(jīng)常性地遇到這樣的用法。
這就是NBT,或者說(shuō),是Mojang專門(mén)研發(fā)出來(lái)能夠給人看的:SNBT(Stringified NBT),也就是『字符串化的二進(jìn)制命名標(biāo)簽』。而真正的NBT,其實(shí)是樹(shù)狀結(jié)構(gòu),和上面的SNBT有很大差別。只不過(guò)你不用擔(dān)心怎么區(qū)分NBT和SNBT,因?yàn)楦陕镆苣??在大多?shù)語(yǔ)境下,大家是不會(huì)特意區(qū)分NBT和SNBT的,一般都統(tǒng)稱為NBT。
現(xiàn)在你能夠看懂NBT了吧?你可以嘗試一下下面的這串,看看能否看懂。
{Elements:[{Name:“Pyro“,Id:1},{Name:“Hydro“,Id:2},{Name:“Anemo“,Id:3},{Name:“Electro“,Id:4},{Name:“Dendro“,Id:5},{Name:“Cryo“,Id:6},{Name:“Geo“,Id:7}]}
本章就到這里了。
(其實(shí),標(biāo)簽的本質(zhì),和JSON的組件差不多,都是一個(gè)『鍵-值對(duì)』)