3,334
个编辑
MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针。
如果在编辑的过程中遇到了什么问题,可以去讨论板提问。
为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证。
MCBBS Wiki GitHub群组已上线!
您可以在回声洞中发表吐槽!
服务器状态监控。点击进入
本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>
(→ItemStack对象的使用: // Edit via Wikiplus) |
(→Meta-hack: // Edit via Wikiplus) |
||
好,这个字段,它的实际名称,为<code>itemDamage</code>,意思为“物品的损害值”,什么叫损害值?举个例子,一个满耐久的铁镐,其损害值为0;而如果用了它一次,且它挖掉的这个方块具有让它损耗耐久的功能(不能是TNT这种方块),那么它之后的损害值就变为了1——这下明白了吧?一个物品的最大损害值,实际上数值上等于它的最大耐久值。通过Item类的setMaxDamage方法可以控制物品的最大损害值。
然而,事情远没有这么简单。itemDamage这一字段,它的含义是会变的——由对应Item实例的<code>boolean hasSubtypes</code>字段控制,该字段默认为false。
但如果,我们用setHasSubtypes(true)来改变了这一字段呢?那么itemDamage,也即meta,它就不能用于指代损害值了,而是用于区分共享同一个Item实例的不同种物品了。这个技巧,有什么好处呢?一是为了防止物品占用过多的数字ID——虽然Forge的注册表不要求我们显式指定数字ID,但不代表数字ID就不存在了,它仍然存在于Minecraft底层之中,直到1.13它才彻底消失;而在1.12.2时期,数字ID是会被Forge动态分配的。二是在某些实现中它确实很符合人的惯常思维,也确实很好用,比如MC中有很多与颜色相关的物品,先写一个辅助类EnumDyeColor,再通过meta的值进行统筹分配颜色,确实是个不错的设计。然而为什么这玩意叫“Meta-hack”呢?那是因为Mojang不知道怎么想的,非得把物品的损害值和类型序数这两个概念耦合在一个字段中——这不是吃饱了撑的吗?所以实际上一个Item实例并不能同时拥有类型序数和耐久值,除非其中有一个被存在附加NBT中(实际上最好把itemDamage设定为类型序数,这样在设定物品模型的时候方便——setCustomModelResourceLocation那块正好传入一个meta值,不过把类型序数存进附加NBT也不是不行,写个Property Override就可以,这个内容后面会讲到的)。实际上meta这个概念在1.13直接被废除了,物品的耐久也被并入了附加NBT中。
|