本篇教程的视频
本篇教程的源代码
注册盔甲材料
和工具类似的,在写盔甲之前,我们也需要先注册盔甲材料
新建类
首先我们创建一个ModArmorMaterials类,这是一个枚举类,并让它实现ArmorMaterial这个接口
然后还是去源代码的ArmorMaterials里面拿一些参数和方法过来,并创建相应的构造函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| public enum ModArmorMaterials implements ArmorMaterial { ; private static final EnumMap<ArmorItem.Type, Integer> HEALTH_FUNCTION_FOR_TYPE = Util.make(new EnumMap<>(ArmorItem.Type.class), (map) -> { map.put(ArmorItem.Type.BOOTS, 13); map.put(ArmorItem.Type.LEGGINGS, 15); map.put(ArmorItem.Type.CHESTPLATE, 16); map.put(ArmorItem.Type.HELMET, 11); }); private final String name; private final int durabilityMultiplier; private final EnumMap<ArmorItem.Type, Integer> protectionFunctionForType; private final int enchantmentValue; private final SoundEvent sound; private final float toughness; private final float knockbackResistance; private final Supplier<Ingredient> repairIngredient;
ModArmorMaterials(String name, int durabilityMultiplier, EnumMap<ArmorItem.Type, Integer> protectionFunctionForType, int enchantmentValue, SoundEvent sound, float toughness, float knockbackResistance, Supplier<Ingredient> repairIngredient) { this.name = name; this.durabilityMultiplier = durabilityMultiplier; this.protectionFunctionForType = protectionFunctionForType; this.enchantmentValue = enchantmentValue; this.sound = sound; this.toughness = toughness; this.knockbackResistance = knockbackResistance; this.repairIngredient = repairIngredient; }
public int getDurabilityForType(ArmorItem.Type pType) { return HEALTH_FUNCTION_FOR_TYPE.get(pType) * this.durabilityMultiplier; }
public int getDefenseForType(ArmorItem.Type pType) { return this.protectionFunctionForType.get(pType); }
public int getEnchantmentValue() { return this.enchantmentValue; }
public SoundEvent getEquipSound() { return this.sound; }
public Ingredient getRepairIngredient() { return this.repairIngredient.get(); }
public String getName() { return TutorialMod.MOD_ID + ":" + this.name; }
public float getToughness() { return this.toughness; }
public float getKnockbackResistance() { return this.knockbackResistance; } }
|
那么我们还是来看看这些参数是什么意思
name:这是它的注册名,也是用于定位资源文件的标识,在下面的getName方法里,还需要加上我们自己的MOD_ID
durabilityMultiplier:耐久度乘数,它会和不同部位的基础耐久度(最上方EnumMap类型的HEALTH_FUNCTION_FOR_TYPE就是定义各个部位盔甲的基础耐久度的)相乘,得到最终的耐久度
protectionFunctionForType:这是一个EnumMap类型的参数,用于定义不同部位盔甲的护甲值
enchantmentValue:附魔能力,值越大,能获得的附魔品质越好
sound:装备盔甲时的声音
toughness:韧性,韧性越高,受到的伤害越少
knockbackResistance:击退抗性,与韧性一样,用于计算伤害减免,不过,原版只有下界合金材料的盔甲才有击退抗性
repairIngredient:盔甲的修复材料
注册盔甲材料
接下来我们就来注册一个盔甲材料
1 2 3 4 5 6
| ICE_ETHER("ice_ether", 40, Util.make(new EnumMap(ArmorItem.Type.class), map -> { map.put(ArmorItem.Type.BOOTS, 3); map.put(ArmorItem.Type.LEGGINGS, 6); map.put(ArmorItem.Type.CHESTPLATE, 8); map.put(ArmorItem.Type.HELMET, 3); }), 30, SoundEvents.ARMOR_EQUIP_NETHERITE, 3.0F, 0.1F, () -> Ingredient.of(ModItems.ICE_ETHER.get()));
|
这里的参数可以根据自己的需要来设置
对于这里的protectionFunctionForType参数,我们仿照原版的方式创建一个EnumMap,并在其中定义了不同部位的护甲值
需要注意的是,护甲值总和为20,虽然不知道设置超过20会有什么效果,建议还是设置在小于等于20的范围内
注册盔甲
有了盔甲材料之后,我们就可以来注册盔甲了
1 2 3 4 5 6 7 8
| public static final RegistryObject<Item> ICE_ETHER_HELMET = ITEMS.register("ice_ether_helmet", () -> new ArmorItem(ModArmorMaterials.ICE_ETHER, ArmorItem.Type.HELMET, new Item.Properties())); public static final RegistryObject<Item> ICE_ETHER_CHESTPLATE = ITEMS.register("ice_ether_chestplate", () -> new ArmorItem(ModArmorMaterials.ICE_ETHER, ArmorItem.Type.CHESTPLATE, new Item.Properties())); public static final RegistryObject<Item> ICE_ETHER_LEGGINGS = ITEMS.register("ice_ether_leggings", () -> new ArmorItem(ModArmorMaterials.ICE_ETHER, ArmorItem.Type.LEGGINGS, new Item.Properties())); public static final RegistryObject<Item> ICE_ETHER_BOOTS = ITEMS.register("ice_ether_boots", () -> new ArmorItem(ModArmorMaterials.ICE_ETHER, ArmorItem.Type.BOOTS, new Item.Properties()));
|
这里的盔甲一共是4个,分别是头盔、胸甲、护腿和靴子,每个盔甲的注册语句都差不多,主要是要指定好盔甲材料和盔甲类型,以及物品属性
同样,因为盔甲本身有耐久度,所以在实际注册时,还会为其设置最大堆叠上限为1
然后不要忘记将这些物品添加到物品栏
1 2 3 4
| pOutput.accept(ModItems.ICE_ETHER_HELMET.get()); pOutput.accept(ModItems.ICE_ETHER_CHESTPLATE.get()); pOutput.accept(ModItems.ICE_ETHER_LEGGINGS.get()); pOutput.accept(ModItems.ICE_ETHER_BOOTS.get());
|
数据文件
语言文件
1 2 3 4
| add(ModItems.ICE_ETHER_HELMET.get(), "Ice Ether Helmet"); add(ModItems.ICE_ETHER_CHESTPLATE.get(), "Ice Ether Chestplate"); add(ModItems.ICE_ETHER_LEGGINGS.get(), "Ice Ether Leggings"); add(ModItems.ICE_ETHER_BOOTS.get(), "Ice Ether Boots");
|
模型文件
1 2 3 4
| basicItem(ModItems.ICE_ETHER_HELMET.get()); basicItem(ModItems.ICE_ETHER_CHESTPLATE.get()); basicItem(ModItems.ICE_ETHER_LEGGINGS.get()); basicItem(ModItems.ICE_ETHER_BOOTS.get());
|
盔甲的物品模型还是一般的物品模型
物品标签
1 2 3 4 5
| tag(ItemTags.TRIMMABLE_ARMOR) .add(ModItems.ICE_ETHER_HELMET.get(), ModItems.ICE_ETHER_CHESTPLATE.get(), ModItems.ICE_ETHER_LEGGINGS.get(), ModItems.ICE_ETHER_BOOTS.get());
|
这是将我们的盔甲添加到TRIMMABLE_ARMOR这个标签中,这样它们就可以被锻造了
贴图文件
物品的贴图按照一般方式放置
然后,我们还需要在textures下新建models/armor文件夹,并在其中放置盔甲的模型贴图(分辨率为64×32),命名为ice_ether_layer_1.png和ice_ether_layer_2.png,分别对应盔甲的第一层和第二层贴图
这两个贴图可以使用BlockBench按照画第二层皮肤的方式绘制,而layer1对应的是上半身的贴图,layer2对应的是下半身的贴图
也可以在原版贴图的基础上改