在上一章,你应该已经理解了什么叫作NBT树,但理解不代表会运用。要真正搞懂NBT树的理念,我们得投入实践,学会阅读NBT树甚至表示出一个NBT树。
NBT数据树常常会表示成下面这样的格式:
[root或其他具体名称]:根、父级标签或其他具体的名称或描述
│
├[名称]:值或描述
......
└[名称]:值或描述
注:在上面的格式中,代表必定会出现,[]代表可能会出现(含义跟指令格式中的一样)。
许多网站和程序,比如Minecraft Wiki、常用的Java版NBT编辑器NBTExplorer,都采用了上述格式来表示NBT。
举个简单的例子,在Minecraft Wiki上,Java版书与笔的物品NBT是这么表示出来的:
? tag:父级标签
└? pages:书与笔的各个页面。
空└?:一个单页。每一页是一个字符串,不能超过个字符。
在上面的这个例子中,由于Minecraft Wiki使用一个图片标识来表示数据类型,所以这里用一些特殊符号来代替:
?——Compound复合标签
?——List列表
?——String字符串
仔细观察Minecraft Wiki给出的NBT树,结合我们前面所学的知识,你应该不难得出上面这个例子所表示的意思:
『对于物品书与笔,在其物品NBT标签中的tag复合标签下,有一个名为pages的列表型标签。这个pages列表是一个由多个字符串类型的值组成的列表,每个值都代表着书与笔中的一页,且每个值都不得拥有超过个字符。』
什么?你很难理解?或许我们需要睁大眼睛,逐行研究上面的例子。
第一行:? tag:父级标签
根据上面的格式『[root或其他具体名称]:根、父级标签或其他具体的名称或描述』,我们不难知道这在表示一个名为tag的复合标签。同时,它被解释为『父级标签』,说明Minecraft Wiki在这里给出的NBT树是在描述这个标签的孩子(也就是值)。
等等,为什么Minecraft Wiki不直接从根开始,而是从这个tag标签开始呢?
回忆一下第十一卷的内容,tag标签是物品通用标签内的一个标签,用来储存物品的额外信息。所有额外的物品标签都在tag标签内,因此Minecraft Wiki不从根开始描述的原因也就不难理解——使文章详略得当。
问题解决,我们来看看第二行:└? pages:书与笔的各个页面。
最开始的└意味着在这里,NBT数据树的这条树枝上有一个节点,而且由于└没有继续向下延伸,因此这个节点是该树枝上最后一个节点。第二个?代表的意思很明确,即该节点对应的NBT标签是个列表。『pages』是该列表的标签名,而后面的『书与笔的各个页面。』是对该标签的一个描述。
第三行更加简单:└?:一个单页。每一页是一个字符串,不能超过个字符。
最开始的└不用说,?估计也不用说。但?后面的标签名称呢?
还是那句话,这是个列表,列表是由多个相同类型的值组成,而不是标签。换句话说,这部分NBT树实际上描述的不是个标签,而是个值,自然也就不需要给出名称,因为没有名称。
冒号右边的很明显,是个对值的描述,相信大家都看得懂这里的中文,我就不再阐述。
现在,你肯定已经拥有阅读Minecraft Wiki上NBT树状图的基本素养。来尝试一下下面的这个NBT树: