第一百五十八章 重新认识NBT

{id:“minecraft:jukebox“,x:-1,y:60,z:-53, IsPlaying :1b, RecordItem :{Count:1b,id:“minecraft:music_disc_ward“}, RecordStartTick:0L, TickCount:514L}

这不就是SNBT吗?

没错,上面那棵树,其实就是下面这个SNBT的NBT形式,游戏所看到的NBT就长这个模样。

这棵NBT其实就是一个放在(-1,60,-53)的唱片机的方块实体。我们会在第十八卷具体了解到方块以及方块实体的内容,在这边你只需要将方块实体当作是方块NBT即可。从这棵NBT中,我们和游戏都可以得知,这个唱片机此时正在播放(IsPlaying)ward唱片(RecordItem),并且已经播放了25.7秒(TickCount),这个唱片机在此之前没有播放过任何唱片(RecordStartTick)。

你可以在Minecraft Wiki上搜索『唱片机』来具体了解上述标签的作用,NBT都讲到这了你应该不可能看不懂Minecraft Wiki上关于NBT的内容吧?

回到这棵NBT树上,仔细观察它与它的SNBT形式,你应该不难发现,id节点的树叶上写着『“minecraft:jukebox“』,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』节点表示出来,其实就是这样的:

{Apple:[{Cen:{Sama:}},{Touhou:}]}

在SNBT中,『Apple』标签的值就是一个复合标签列表!列表的顺序规定了列表内每个元素(element)的索引值(index)。和生活中数数不一样的是,列表的索引并不是从1开始,而是从0开始,这就是为什么我们给『Cen』节点所在的树干标上索引0而不是1的原因。

同理,如果一个节点长出了一堆承载相同类型数据的叶子,那这个节点的值也是一个列表(或数组)。如果一堆值是列表的节点挤在一起,那这一堆节点所形成的大节点自然也是一个值是列表的节点,而且这列表还是列表的列表:

{节点:[[{},{},…],[{},{},…],…]}

\\它的SNBT形式\\

只不过,像这样的二维列表,甚至是三维列表,我们在之前都没有碰到过,在以后也很有可能不会碰到。

这就是NBT的树状结构,也就是真正的NBT。看起来讲了很多,但其实内容并不是很难,唯一的难点估计是语言比较枯燥。

但这并不是本章唯一的重点。你应该还记得刚才讲的『节点的路径』。相比于NBT的树状结构,我们会在接下来的内容中更常碰见节点的路径(path)。其实,这个『节点的路径』,就是NBT路径(NBT path)——用来从NBT数据树中指定一系列特定元素的描述性标签。

在接下来的/data指令中,NBT路径是非常重要的一个东西,可以说只要你掌握了NBT路径,你就几乎掌握了/data指令。我们会在下一章更加深入了解NBT路径,但在此之前,请你『务实一点,把NBT的战术打法,NBT树的这个理念先搞懂』——范志毅,国家Minecraft指令教学前任大将军,此句话为他2013年6月15日在评价Minecraft指令教学时所说的名言警句。

本章到此为止。

对了,2023新年快乐!