本篇教程的视频

本篇教程的源代码

GitHub地址:TutorialMod-1.20.1-Forge-Armor

注册盔甲材料

和工具类似的,在写盔甲之前,我们也需要先注册盔甲材料

新建类

首先我们创建一个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.pngice_ether_layer_2.png,分别对应盔甲的第一层和第二层贴图

这两个贴图可以使用BlockBench按照画第二层皮肤的方式绘制,而layer1对应的是上半身的贴图,layer2对应的是下半身的贴图

也可以在原版贴图的基础上改