第一百零八章 掉落物的NBT 上 -物品通用标签
物品的NBT就先讲到这,如果你还想了解更多,可以前往Minecraft Wiki搜索词条『Player.dat格式』,里面写了很多常用的物品标签。从这一章开始,我们就要开始学习实体的NBT。
.......
如果你看过『作品相关』的:
『如何制作一个起床战争资源点』
(现在不推荐你看这一章)
那你应该知道,在Java版,除了那一章讲的方法以外,还可以使用/summon指令来快捷生成掉落物。而这种方法的核心,就是:掉落物(minecraft:item)的NBT。
(什么?Mojang改名了?Logo也改了?微软为了庆祝Minecraft11周年改的?)
————一个并不怎么华丽的分割线————
钻石<——看!你掉了一颗钻石在这!
你知道,如果你不在五分钟内捡起它的话,那么你幸幸苦苦挖到的钻石就会凭空消失。
你也知道,如果这颗钻石掉进岩浆,或碰到仙人掌和火焰,那么这颗钻石也会消失。
但你可能不知道,上面这些,都是写在掉落物的NBT里的。
接下来,让我们进入钻石(掉落物)的NBT里,来研究研究:
{Age:0s,Health:5s,Pickubr /Delay:0s,Item:{Count:1b,id:“minecraft:diamond“}
↑↑↑这是你掉的钻石的NBT,需要注意这只不过是一个简化版↑↑↑
其中,Age标签的数据类型为Short短整型,它唯一的作用是记录『这个物品已经掉落多长时间,以方便游戏清除掉落时间过长的物品』,它的单位为『游戏刻』。此时Age标签的值为0,说明这个钻石刚刚才掉落。该标签实际可发挥作用的值范围为『-32767~6000』,如果设置为『-32767』,那么这个物品将会一直存在于这里(没错,你就不用担心死了之后跑回来在要捡起物品时物品突然消失所导致的德国boy行为了)。
那如果到了6000呢?恭喜,你的物品违反了能量守恒定律凭空消失了。
然后是Health,你肯定会很惊讶为什么掉落物也有生命值呢?实际上小编也——
实际上我不惊讶,因为我早就知道了
Health标签的数据类型也是Short短整型,它的值决定了你的物品的抗火焰、岩浆以及仙人掌的能力(想攻击一个掉落物?做梦!),游戏默认值为5,当为0时就会被销毁。
如果你不想让你的钻石被熔岩焚毁,就可以尝试修改修改这个Health标签的值。
于是——震惊MC科学界的发现!碳元素组成的钻石竟然在超高温下仍然健在!
(这样子就可以解释为什么那些坑新手的MC教程里,钻石扔进熔岩并没有被销毁了。)
→记住:永远不要和MC讲科学
Pickubr /Delay这个标签有点有趣。在介绍这个NBT标签之前,先让你了解了解一个掉落物的细节:
假设现在将钻石扔到你的脚下,你会发现:钻石在落地后并没有马上被你捡起,而是过了一两秒之后,才被你捡起来。
(如果在很土豆的服务器,这个时间会更长)
为什么会这样呢?
就是因为Pickubr /Delay标签。
Pickubr /Delay标签的数据类型也是Short短整型,它的值代表着掉落物剩下不能被捡起的时长,每游戏刻它的值都会减少1,当它的值减到0时就代表掉落物可以被玩家捡起。
就因为这个标签,导致你扔出去东西后不会立马回到你的身上,而是要等一会儿。
如果你将这个值设定为32767,那恭喜你——你永远也捡不起这个钻石了,因为设定为32767后,这个值将不再会减少。
Item标签的数据类型是复合标签,它存储着该掉落物的核心——物品的信息。那这物品的信息到底是通过哪些标签储存的呢?
接下来,容许我隆重介绍Minecraft中三大通用标签之一的:
物品通用标签
『物品通用标签』具有下面几个标签:
Count(Byte字节型)——物品堆叠的数量。
Slot(Byte字节型)——物品所在的栏位(很多情况下不会有这个标签)。
id(String文本|JE1.8前只支持数值)——物品命名空间ID。神奇的是如果你不填,那么游戏会把物品认成石头。
Damage(扁平化中被换职|Short短整型)——物品数据值
tag(复合标签)——关于当前物品的额外信息,我们前几章了解的各种物品标签其实都存储在这个复合标签里面。
举个例子,假设你的副手拿着三颗附魔了锋利I的钻石,那么这三颗钻石的物品NBT标签就是:
{Count:3b,Slot:-106b,id:“minecraft:diamond“,tag:{Enchantments:[{id:“minecraft:sharbr /ness“,lvl:1}]}}
\\适用于Java1.13及以上版本\\
{Count:3b,Slot:-106b,id:“minecraft:diamond“,Damage:0s,tag:{ench:[{id:16,lvl:1}]}}
\\适用于Java1.8~1.12.2版本\\
其中,『Count:3b』代表有3个物品,『Slot:-106b』代表该物品在副手栏位(副手栏位的号码为-106,注意这里的栏位号码不等同于栏位ID),『id:“minecraft:diamond“』代表该物品是钻石,『tag』下的『Enchantments或ench』规定了该物品的附魔情况。对于扁平化前的版本来说,『Damage:0s』还代表着该钻石的数据值为0。
『物品通用标签』中唯一需要注意的是id标签,id标签在MC历史上有很多改变。在Java1.8以前,它的数据类型为Short短整型,存储的是物品的数字ID。而1.8之后,Mojang渐渐抛弃了数字id,id标签的数据类型也就变成了String文本(字符串)类型,用来存储物品的命名空间ID。
现在,让我们尝试生成一个钻石。等等,这个Damage标签,不是已经在第一百零三章就出现了吗,为什么这里又出现了呢?
因为这个Damage标签在扁平化之前,也是物品通用标签的一份子,用来储存这个物品的数据值。1.13扁平化之后,数据值没了,这个Damage标签就被Mojang调到tag下面成为物品的『损坏值』。
所以存在于物品tag标签下的Damage标签,是JE1.13更新中才出现的。JE1.13以前的损害值,就直接和物品数据值结合在一起(就像现在的基岩版一样)。
现在,让我们正式生成一个钻石:
/summon item ~~-2 ~{Age:0s,Item:{Count:1b,id:“minecraft:diamond“}}
\\适用于Java1.11及以上版本\\
/summon Item ~~-2 ~{Age:0s,Item:{Count:1b,id:“minecraft:diamond“}}
\\适用于Java1.8~1.10.2\\
/summon Item ~~-2 ~{Age:0s,Item:{Count:1b,id:264s}}
\\适用于Java1.7.2~1.7.10\\
你可能注意到了,这条指令的生成位置是在脚底下两格处。为什么要这样做?
答案你应该知道:因为我们没有指定Pickubr /Delay标签,游戏在生成时就会默认它为0,就容易导致钻石一生成还没落地就被我们吸走。
所以现在你知道该如何制作一个高端大气上档次的起床战争资源点了吗?别忘记把Age设成-32767了!
本章到此为止。
附录:掉落物和物品通用标签的历史
Java
0.24——加入了掉落物
1.3.1——同一处的同一类型掉落物现在会自行堆叠
1.8——物品通用标签的id标签的数据类型从Short短整型改为String字符串
1.11——实体ID从Item变为item
1.13——物品通用标签的Damage标签被移到tag标签下,数据类型从Short短整型改为Int整型。
携带版/基岩版
0.2.0——加入了掉落物
?——物品通用标签的id标签被Name标签替代