UU看書

第一百五十九章 深入瞭解NBT樹和NBT路徑

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

在上一章,你應該已經理解了什麼叫作NBT樹,但理解不代表會運用。要真正搞懂NBT樹的理念,我們得投入實踐,學會閱讀NBT樹甚至表示出一個NBT樹。

NBT資料樹常常會表示成下面這樣的格式:

lt資料型別gtroot或其他具體名稱:根、父級標籤或其他具體的名稱或描述

├lt資料型別gt名稱:值或描述

└lt資料型別gt名稱:值或描述

注:在上面的格式中,ltgt代表必定會出現,代表可能會出現(含義跟指令格式中的一樣)。

許多網站和程式,比如MinecraftWiki、常用的Java版NBT編輯器NBTExplorer,都採用了上述格式來表示NBT。

舉個簡單的例子,在MinecraftWiki上,Java版書與筆的物品NBT是這麼表示出來的:

▦tag:父級標籤

└▤pages:書與筆的各個頁面。

空└✎:一個單頁。每一頁是一個字串,不能超過32767個字元。

在上面的這個例子中,由於MinecraftWiki使用一個圖片標識來表示資料型別,所以這裡用一些特殊符號來代替:

▦——Compound複合標籤

▤——List列表

✎——String字串

仔細觀察MinecraftWiki給出的NBT樹,結合我們前面所學的知識,你應該不難得出上面這個例子所表示的意思:

『對於物品書與筆,在其物品NBT標籤中的tag複合標籤下,有一個名為pages的列表型標籤。這個pages列表是一個由多個字串型別的值組成的列表,每個值都代表著書與筆中的一頁,且每個值都不得擁有超過32767個字元。』

什麼?你很難理解?或許我們需要睜大眼睛,逐行研究上面的例子。

第一行:▦tag:父級標籤

根據上面的格式『lt資料型別gtroot或其他具體名稱:根、父級標籤或其他具體的名稱或描述』,我們不難知道這在表示一個名為tag的複合標籤。同時,它被解釋為『父級標籤』,說明MinecraftWiki在這裡給出的NBT樹是在描述這個標籤的孩子(也就是值)。

等等,為什麼MinecraftWiki不直接從根開始,而是從這個tag標籤開始呢?

回憶一下第十一卷的內容,tag標籤是物品通用標籤內的一個標籤,用來儲存物品的額外資訊。所有額外的物品標籤都在tag標籤內,因此MinecraftWiki不從根開始描述的原因也就不難理解——使文章詳略得當。

問題解決,我們來看看第二行:└▤pages:書與筆的各個頁面。

最開始的└意味著在這裡,NBT資料樹的這條樹枝上有一個節點,而且由於└沒有繼續向下延伸,因此這個節點是該樹枝上最後一個節點。第二個▤代表的意思很明確,即該節點對應的NBT標籤是個列表。『pages』是該列表的標籤名,而後面的『書與筆的各個頁面。』是對該標籤的一個描述。

第三行更加簡單:└✎:一個單頁。每一頁是一個字串,不能超過32767個字元。

最開始的└不用說,✎估計也不用說。但✎後面的標籤名稱呢?

還是那句話,這是個列表,列表是由多個相同型別的值組成,而不是標籤。換句話說,這部分NBT樹實際上描述的不是個標籤,而是個值,自然也就不需要給出名稱,因為沒有名稱。

冒號右邊的很明顯,是個對值的描述,相信大家都看得懂這裡的中文,我就不再闡述。

現在,你肯定已經擁有閱讀MinecraftWiki上NBT樹狀圖的基本素養。來嘗試一下下面的這個NBT樹:

▦實體資料值

│實體共通標籤

│活體共通標籤

│生物共通標籤

├🄸Size:史萊姆的大小。最小為0,即小型史萊姆大小;最大值為126,超過126的值將當作126處理。

└◧wasOnGround:表示史萊姆是否正在接觸地面。

圖示:

🄸——Int整型

◧——Boolean布林值(Byte位元組型)

MinecraftWIki把生物共通標籤給拆開了?啥時候多出個活體共通標籤?

上面唯一需要注意的一點是,你應該知道Byte位元組型有兩個種類的值,一個是普通的數值,一個是布林值。為方便區分,MinecraftWiki將布林值型別從Byte位元組型中獨立出來,成為Boolean布林值,但實際上在NBT中還是Byte位元組型。

這裡就暫時不放參考答案(實際上是因為懶得寫),相信大家都能夠看懂上面的NBT樹狀圖。

搞懂NBT樹狀圖後,接下來讓我們繼續瞭解NBT路徑。

在上一章,我們基本上搞清楚了NBT路徑是什麼。比如對於下面這個NBT路徑:

Apple0CenSama

你應該知道它有三個意思:

①這代表Sama標籤的路徑,你可以透過這個路徑來找到這個標籤

②這代表Sama這個標籤

③這代表Sama這個標籤的值

而在Minecraft中,NBT路徑最常見的意思就是第二和第三個——代表一個標籤和或其值。或者說,NBT路徑最常見的作用,就是用來尋找並獲取到一個標籤,然後對這個標籤的值進行一些操作。

舉個簡單的例子,還記得你在第一百零八章掉下來的鑽石嗎?把它拿過來再看看:

Age0s,Health5s,PickupDelay0s,ItemCount1b,id“minecraftdiamond“

↑↑↑這是你掉的鑽石的NBT,需要注意這只不過是一個簡化版↑↑↑

如果我們要使用data指令來獲取到這顆鑽石Age標籤的值,這個NBT路徑該怎麼寫?

很簡單,就一個單詞:

Age

然後在聊天框中就會返回:0s

但其實你也可以這麼寫:

Health5sAge

這是怎麼一回事?前面的Health5s是咋冒出來的?

這雖然是個多此一舉的寫法,但我們從中也可以瞭解到NBT路徑的一個特殊功能:匹配特定的NBT標籤

有時候,我們固然想要得到一個標籤的值,但當我們想把範圍縮小時,比如想要獲取所有鑽石掉落物的Age值,我們可能就無從下手。但其實,這有兩種方法:

第一種,使用目標選擇器;第二種,在NBT路徑內加入一些匹配標籤用的值。

其實這兩種方法的原理都一樣,但由於目標選擇器的nbt引數我們不現在講,因此先來看看第二種方法。

首先,路徑『Age』雖然是正確的,但其實在這裡省略了一些東西。

什麼東西?沒錯,根標籤呢?

一般情況下,根標籤都會被省略不寫。如果不省略,那整個路徑會變成:

Age

其中,是根標籤的路徑,也就是代指根標籤。由於根標籤是個複合標籤,所以用大括號表示。

然後,對比『Health5sAge』和『Age』,我們會發現兩者唯一的區別就在於根標籤擁有一個值:Health5s

很奇怪吧?明明路徑就可以代表標籤的值,為什麼還要專門寫一個特定的值呢?

其實,給路徑中的一個標籤加上值看上去多此一舉,但實際上很有用。因為它有一個功能——過濾。

如果不加上Health5s,那麼單獨的將代表任何一個根標籤。但如果加上Health5s,那麼這僅能代表含有Health5s這個標籤的根標籤。

比如Health5sAge雖然能選中上面鑽石的Age值,但一定選不中下面這個鑽石的Age值:

Age1s,Health32767s,PickupDelay0s,ItemCount1b,id“minecraftdiamond“

同理,對於路徑『Age』,我們也可以寫成這樣:

Age100s

這看起來是一個SNBT,但其實也是個路徑,意思是尋找根標籤內值為100s的Age標籤。

總而言之,如果給NBT路徑內的某個或多個標籤加上一個特定的值,那就能起到過濾的作用,使結果更加精確。

你現在應該知道如何獲取所有鑽石掉落物的Age值吧?讓我們試一試!

executeaserundatagetentitysItemCount1b,id“minecraftdiamond“Age

返回:

鑽石擁有以下實體資料:163s

鑽石擁有以下實體資料:127s

鑽石擁有以下實體資料:11451s

(上面的data指令之後再解釋)

GOOD!另外,你應該能解釋『ItemCount1b,id“minecraftdiamond“Age』的意思吧?試一試描述一下它的意思。

上面的內容只是NBT路徑的冰山一角,在下一章,我們將會繼續深入瞭解NBT路徑,但至於何時更新是個大問題。

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

新書推薦

醫毒雙絕,一睜眼竟然生了雙胎! 我玩了個假的MC? 全職高手之白風沐雪 吳小凡重生籃球生涯 我在全息遊戲中錦鯉出圈 什麼叫瀟灑型中鋒啊 又玩克蘇魯跑團網遊