这是怎么一回事?前面的{Health:5s}是咋冒出来的?
这虽然是个多此一举的写法,但我们从中也可以了解到NBT路径的一个特殊功能:匹配特定的NBT标签
有时候,我们固然想要得到一个标签的值,但当我们想把范围缩小时,比如想要获取所有钻石掉落物的Age值,我们可能就无从下手。但其实,这有两种方法:
第一种,使用目标选择器;第二种,在NBT路径内加入一些匹配标签用的值。
其实这两种方法的原理都一样,但由于目标选择器的nbt参数我们不现在讲,因此先来看看第二种方法。
首先,路径『Age』虽然是正确的,但其实在这里省略了一些东西。
什么东西?没错,根标签呢?
一般情况下,根标签都会被省略不写。如果不省略,那整个路径会变成:
{}.Age
其中,{}是根标签的路径,也就是代指根标签。由于根标签是个复合标签,所以用大括号表示。
然后,对比『{Health:5s}.Age』和『{}.Age』,我们会发现两者唯一的区别就在于根标签拥有一个值:Health:5s
很奇怪吧?明明路径就可以代表标签的值,为什么还要专门写一个特定的值呢?
其实,给路径中的一个标签加上值看上去多此一举,但实际上很有用。因为它有一个功能——过滤。
如果不加上Health:5s,那么单独的{}将代表任何一个根标签。但如果加上Health:5s,那么这仅能代表含有Health:5s这个标签的根标签。
比如{Health:5s}.Age虽然能选中上面钻石的Age值,但一定选不中下面这个钻石的Age值:
{Age:-1s,Health:s,PickupDelay:0s,Item:{Count:1b,id:“minecraft:diamond“}
同理,对于路径『Age』,我们也可以写成这样:
Age:100s
这看起来是一个SNBT,但其实也是个路径,意思是寻找根标签内值为100s的Age标签。
总而言之,如果给NBT路径内的某个或多个标签加上一个特定的值,那就能起到过滤的作用,使结果更加精确。
你现在应该知道如何获取所有钻石掉落物的Age值吧?让我们试一试!
/execute as @e run data get entity @s {Item:{Count:1b,id:“minecraft:diamond“}}.Age
返回:
钻石拥有以下实体数据:163s
钻石拥有以下实体数据:127s
钻石拥有以下实体数据:s
(上面的data指令之后再解释)
GOOD!另外,你应该能解释『{Item:{Count:1b,id:“minecraft:diamond“}}.Age』的意思吧?试一试描述一下它的意思。
上面的内容只是NBT路径的冰山一角,在下一章,我们将会继续深入了解NBT路径,但至于何时更新是个大问题。