回到这棵NBT树上,仔细观察它与它的SNBT形式,你应该不难发现,id节点的树叶上写着“minecraft:jukebox“,x、y、z节点的树叶上写着-160和-53,IsPying节点的树叶上写着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路径(NBTpath)——用来从NBT树中指定一系列特定元素的描述性标签。
在接下来的/data指令中,NBT路径是非常重要的一个东西,可以说只要你掌握了NBT路径,你就几乎掌握了/data指令。我们会在下一章更加深入了解NBT路径,但在此之前,请你务实一点,把NBT的战术打法,NBT树的这个理念先搞懂——范志毅,国家Minecraft指令教学前任大将军,此句话为他2013年6月15日在评价中国指令教学时所说的名言警句。
本章到此为止。
对了,2023新年快乐!