MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针。
如果在编辑的过程中遇到了什么问题,可以去讨论板提问。
为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证。
MCBBS Wiki GitHub群组已上线!
您可以在回声洞中发表吐槽!
服务器状态监控。点击进入
本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>
用户:MashKJo/1.12.2模组开发教程/15.高级物品(三) - 盔甲
ArmorMaterial
和武器/工具的类类似,盔甲对应的类ItemArmor的构造方法也需要一个类似于“质地”的东西——ItemArmor.ArmorMaterial。该类同样为枚举类,因此,类似于ToolMaterial,我们这样来构造新的ArmorMaterial:
public static final ItemArmor.ArmorMaterial MY_CUSTOM_ARMOR_MATERIAL = EnumHelper.addArmorMaterial(name, textureName, durability, reductionAmounts, enchantability, soundOnEquip, toughness);
其中,name应该由小写字母和下划线组成;textureName看似是指代该盔甲穿在玩家身上时的贴图,但实则起到一个充当该ArmorMaterial的唯一标识符的作用,你应该填入"modid:armor_material_name"
;durability即盔甲各部件的耐久值;reductionAmounts是一个长度为4的int数组,用于指定盔甲4个部件各自对伤害的免疫程度,其实就是护甲值;enchantability指盔甲的附魔能力;soundOnEquip是一个SoundEvent参数,用于指定该盔甲被穿上时的音效,关于SoundEvent的知识后续会有专门讲解,你可以先复用原版的SoundEvent,它们均位于SoundEvents类中;toughness指的是盔甲韧性值。
创建一套新盔甲
我们首先看看ItemArmor类的构造方法:(ItemArmor.ArmorMaterial materialIn, int renderIndexIn, EntityEquipmentSlot equipmentSlotIn)
。其中renderIndex在原版中没有任何实际用途,乱填一个就好,而最后一个EntityEquipmentSlot参数代表了它是头盔/胸甲/护腿/靴子中的哪一种。因此,要创建一整套新盔甲,你需要new ItemArmor类或其子类4次。
原版的ItemArmor类的自定义空间几乎为0,不过Forge在Item类中patch了一些专门针对盔甲的方法:
void onArmorTick(World world, EntityPlayer player, ItemStack stack)
:这个方法会在盔甲穿上后每一tick都会被调用一次,通常你可以用这个方法来给盔甲加上穿戴药水效果之类的东西。String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type)
:这个方法用于确定盔甲穿在身上对应的纹理,返回一个String,实际上这个String的格式类似于ResourceLocation用于指代具体文件时的格式(且路径被写全了)。例:原版的铁套护腿的材质的路径为assets/minecraft/textures/models/armor/iron_layer_2.png
,那么体现在这里,返回的String应为"minecraft:textures/models/armor/iron_layer_2.png"
。看起来你可以很自由地指定材质文件,实则不然——除非你给盔甲自定义一个新的模型,否则盔甲会自动使用原版默认模型,那么材质文件必须有2份——其中一张包含头盔、胸甲、靴子的贴图,另外一张包含护腿的贴图,且实际的贴图在材质文件中对应的UV坐标有严格限制。因此如果你不指定自定义模型,那么在这里是要判断传入的EntityEquipmentSlot,并根据情况返回2个路径;至于材质文件,你基本上只能在原版的基础上修改。ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack stack, EntityEquipmentSlot armorSlot, ModelBiped _default)
:这个方法用于给盔甲指定自定义模型,指定后我们就可以自由地根据自己的需求调整材质文件的方方面面了。注意到返回一个ModelBiped,它实际上是ModelBase的子类,关于ModelBase的相关知识,详见后续教程内容。
ISpecialArmor
Forge提供了一个接口:ISpecialArmor,通过让我们的ItemArmor子类实现该接口,就能实现对盔甲各方面属性的更精细的调控。该接口有一个静态内部类:ArmorProperties,主要用于阐明盔甲的伤害吸收能力。
public interface ISpecialArmor{ ArmorProperties getProperties(EntityLivingBase player, @Nonnull ItemStack armor, DamageSource source, double damage, int slot); int getArmorDisplay(EntityPlayer player, @Nonnull ItemStack armor, int slot); void damageArmor(EntityLivingBase entity, @Nonnull ItemStack stack, DamageSource source, int damage, int slot);
... }
通过实现该接口,我们可以设定:该盔甲的ArmorProperties,穿戴后在HUD中显示的护甲值的多少,等等。