用户:MashKJo/1.12.2模组开发教程/6.ItemStack和Meta-hack:修订间差异

→‎Meta-hack:​ // Edit via Wikiplus
→‎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中。
行政员、​优秀编辑者、​界面管理员、​监督员、​管理员、​小部件编辑者
3,334

个编辑