UU看書

第一百五十八章 重新認識NBT

天才一秒記住【UU看書】地址:www.uukanshu.co

看到這個題目,你是不是大吃一驚?NBT怎麼還要重新認識?

別太驚訝。還記得最開始我們接觸到NBT的時候嗎?在第五十四章的最後,我指出這其實並不是真正的NBT,而是Mojang專門搞出來給人看的『SNBT』,即『StringifiedNBT』,『字串化的二進位制命名標籤』。在之後的章節,我們也重點了解了SNBT,知道了它的格式和使用方法。而現在,我們已經瞭解並掌握了許多物品和實體的NBT,這時候,也是時候來認識一下真正的樹狀結構的NBT,這樣子你才能真正理解接下來的內容。

—————分割線—————

樹,是大自然的鬼斧神工。它提供了人類賴以生存的氧氣和食物,也給了人類許多靈感。

一棵樹,有樹根、樹幹、樹葉。它們均發源於一點,我們可以把這一點稱為——根(root)。為了方便講解,我們接下來忽略位於地底下的樹根,只看樹幹和樹葉。

樹幹上有許多分叉點,我們可以把這些分叉點稱為——節點(node)。透過節點可以長出一些樹葉或新的樹幹,在新的樹幹上則又有許多新的節點,分叉出更多的樹葉和樹幹。

一個節點所分叉出的所有樹葉和樹幹,以及這些樹幹上所有的節點,可以全部視為這個節點的值(value)。你可以這麼理解——這些樹葉和樹幹,就是這個節點所存在的價值。如果沒有這些樹葉和樹幹,那麼這個節點也將不復存在。

這就是一棵樹——一顆完全由根、節點和值構成的樹!(圖1581)

根其實是一種特殊的節點,它是整個樹的開始,所以整個樹都可以看作是根的值。

除了根,其他節點都可以取名字。在同一個樹幹上,每個節點的名字都必須是獨一無二的,以防與其他節點弄混。

比如,我們可以給根上面的第一個節點取名『Apple』、第二個節點取名『Beluga』。這樣子,我們就不容易搞混這兩個節點,也可以方便用名稱指代這兩個節點。

假設第一個節點長出了一條樹幹,上面也有一個節點,我們給它取名為『Cen』。而這個『Cen』節點也長出了一條樹幹,上面也是有一個節點,我們給他取名『Sama』(圖1582)。那麼,如果其他人也要尋找『Sama』節點,該如何尋找呢?

假設其他人只知道這個節點叫『Sama』然後去尋找它,在節點很多的情況下這無疑是大海撈針。而且有可能在不同樹幹上的其他節點也叫『Sama』。這時候該怎麼辦?

我們來看一個現實生活中的情景:

你此時正在學校裡上課,老師要求你將書翻到這節課要講的『第三模組第五單元第一課』。你肯定是先找到『第三模組』,然後找到『第五單元』,最後找到『第一課』。老師不可能只告訴你『翻到第一課』,因為每個單元都有自己的第一課。老師這樣說,讓你得知了『第一課』的路徑(path),於是你才找到了這節課要講的『第一課』。

回到上面的問題,答案已經十分明顯了——那位要尋找『Sama』節點的,應該去詢問得知『Sama』節點具體位置的人,比如我們。然後我們應該將『Sama』節點的路徑告訴他,也就是:

AppleCenSama

這就是『Sama』節點的路徑。如你所見,一個路徑就是『節點節點節點』的形式,從左往右的節點指出了一條從根開始通向終點節點的具體道路(圖1583)。

路徑既然可以用來找到節點,那麼他們應該也就能夠表示節點,乃至於表示這個節點的值。畢竟『一個節點』只對應『一條路徑』,『一條路徑』也只對應『一個節點』,『一個節點』也只能有『一個值』。因此,如果我們再一次看向『Sama』節點的路徑『AppleCenSama』,我們就會發現『AppleCenSama』既可以用來表示『Sama』節點,也可以用來表示『Sama』節點的值。(只不過Sama節點的值是空的)

又比如說,路徑『AppleCen』既表示節點『Cen』,也表示節點『Cen』的值——從『Cen』節點長出的樹幹以及上面的『Sama』節點。

看起來像『節點節點』這樣的路徑解決了尋找節點以及節點的值的問題,但如果『Apple』節點又長出了一條新的樹幹,這條新的樹幹上又有一個節點『Touhou』該怎麼辦(圖1584)?此時『Sama』節點的路徑又該如何表示?

很明顯,現在『Apple』節點長出了兩條樹幹(另外兩條是貫穿Apple節點的從根長出來的主幹,其實是一條,不要搞錯了),我們需要有一個正確的方式來表示這兩條樹幹。比如我們可以取名字,但這似乎過於麻煩了,而且容易把樹幹和節點搞混。最好也最簡單的方法就是給樹幹編『號數』,也就是使用索引(index)。

將節點『Cen』所在的樹幹編上索引0,那條新的樹幹編上1,然後我們只需要在路徑中的『Apple』後面,『』前面加上樹幹的索引,就大功告成了:

Apple0CenSama

其中,0指的就是索引為0的樹幹,也就是『Cen』節點所在的那一條。透過這種方法,我們也可以表示『Touhou』節點:

Apple1Touhou

不過,這些東西跟NBT有什麼關係呢?

這個問題問得好。現在,讓我們再來看看另外一顆樹(圖1585):

├id“minecraftjukebox“

├IsPlaying1b

├RecordItem

│├Count1b

││

│└id“minecraftmusicdiscward“

├x1

├y60

├z53

├RecordStartTick0L

└TickCount514L

仔細看這東西,你有沒有發現?

如果沒有發現,那讓我們把這棵樹的形態轉化一下,變成:

id“minecraftjukebox“,x1,y60,z53,IsPlaying1b,RecordItemCount1b,id“minecraftmusicdiscward“,RecordStartTick0L,TickCount514L

這不就是SNBT嗎?

沒錯,上面那棵樹,其實就是下面這個SNBT的NBT形式,遊戲所看到的NBT就長這個模樣。

這棵NBT其實就是一個放在1,60,53的唱片機的方塊實體。我們會在第十八卷具體瞭解到方塊以及方塊實體的內容,在這邊你只需要將方塊實體當作是方塊NBT即可。從這棵NBT中,我們和遊戲都可以得知,這個唱片機此時正在播放(IsPlaying)ward唱片(RecordItem),並且已經播放了257秒(TickCount),這個唱片機在此之前沒有播放過任何唱片(RecordStartTick)。

你可以在MinecraftWiki上搜尋『唱片機』來具體瞭解上述標籤的作用,NBT都講到這了你應該不可能看不懂MinecraftWiki上關於NBT的內容吧?

回到這棵NBT樹上,仔細觀察它與它的SNBT形式,你應該不難發現,id節點的樹葉上寫著『“minecraftjukebox“』,x、y、z節點的樹葉上寫著『1』『60』和『53』,IsPlaying節點的樹葉上寫著『1b』,RecordStartTick和TickCount節點的樹葉上寫著『0L』和『514L』。在SNBT中,上面這些節點所對應的標籤的值的型別都是字串、Int整型、Byte位元組型和Long長整型。也就是說,String字串、Byte位元組型、Short短整型、Int整型和Long長整型,以及其他的浮點數資料型別,在NBT樹中都無一例外承載於『樹葉』之上。

而RecordItem節點,長出的是一條樹幹,樹幹上有id和Count節點。在SNBT中,RecordItem標籤的值型別是複合標籤,複合標籤內也有id和Count標籤。也就是說,『複合標籤』在NBT樹中所體現出來的就是一條樹幹。

也就是說,整個NBT標籤其實就是一個複合標籤?

沒錯,確實是這樣。

透過上面的觀察,你應該已經總結出來了NBT樹與SNBT的一些對應關係,比如節點對應標籤名,樹幹對應複合標籤。那……列表呢?在NBT樹中,列表又是長什麼樣子?

還記得上面的『Apple』節點嗎,我們在研究節點的路徑(path)時,遇到了一個節點長出兩條樹幹的情況。如果我們以SNBT的形式將『Apple』節點表示出來,其實就是這樣的:

AppleCenSama,Touhou

在SNBT中,『Apple』標籤的值就是一個複合標籤列表!列表的順序規定了列表內每個元素(element)的索引值(index)。和生活中數數不一樣的是,列表的索引並不是從1開始,而是從0開始,這就是為什麼我們給『Cen』節點所在的樹幹標上索引0而不是1的原因。

同理,如果一個節點長出了一堆承載相同型別資料的葉子,那這個節點的值也是一個列表(或陣列)。如果一堆值是列表的節點擠在一起,那這一堆節點所形成的大節點自然也是一個值是列表的節點,而且這列表還是列表的列表:

節點,,…,,,…,…

它的SNBT形式

只不過,像這樣的二維列表,甚至是三維列表,我們在之前都沒有碰到過,在以後也很有可能不會碰到。

這就是NBT的樹狀結構,也就是真正的NBT。看起來講了很多,但其實內容並不是很難,唯一的難點估計是語言比較枯燥。

但這並不是本章唯一的重點。你應該還記得剛才講的『節點的路徑』。相比於NBT的樹狀結構,我們會在接下來的內容中更常碰見節點的路徑(path)。其實,這個『節點的路徑』,就是NBT路徑(NBTpath)——用來從NBT資料樹中指定一系列特定元素的描述性標籤。

在接下來的data指令中,NBT路徑是非常重要的一個東西,可以說只要你掌握了NBT路徑,你就幾乎掌握了data指令。我們會在下一章更加深入瞭解NBT路徑,但在此之前,請你『務實一點,把NBT的戰術打法,NBT樹的這個理念先搞懂』——范志毅,國家Minecraft指令教學前任大將軍,此句話為他2013年6月15日在評價Minecraft指令教學時所說的名言警句。

本章到此為止。

對了,2023新年快樂!

如遇章節錯誤,請點選報錯(無需登陸)

新書推薦

詭異降臨,我能無限回檔 國象小子 死靈法師能有什麼壞心思 天賦拉滿的我,下次還填非常簡單 網遊之對決巔峰 江湖籃球 我的世界之天譚歷險記