本篇教程的视频

本篇教程的源代码

Github地址:TutorialMod-HorseArmor-1.21

介绍

马铠在游戏中也是一种盔甲类物品,它可以装备在马身上,提供护甲值

这个也是盔甲类物品的衍生,只是它是为我们的动物准备的

并且在1.21的版本中,还加入了狼铠,前面我们在讲盔甲的时候也提到过一个BODY部位的东西,这个量是给狼铠的基础护甲值

然而,目前因为狼铠只有一种材质,它在源代码中是硬编码的,要想新增新的狼铠,我个人认为是要等它和马铠一样,拥有不同材质的时候才好写

现在要写的话就得用Mixin来修改源代码了,待会我们也可以提一下

查看源代码

马铠物品

我们以IRON_HORSE_ARMOR为例,先来看它的注册

1
2
3
public static final Item IRON_HORSE_ARMOR = register(
"iron_horse_armor", new AnimalArmorItem(ArmorMaterials.IRON, AnimalArmorItem.Type.EQUESTRIAN, false, new Item.Settings().maxCount(1))
);

它实例化的是AnimalArmorItem,然后这里面的参数是和我们之前写的玩家的盔甲差不多的

ArmorMaterials是和玩家盔甲材质共用的

后面的TypeEQUESTRIAN,这个是马铠的类型,这个是可以直接调用的

false是没有第二层材质

最后是Item.Settings,这个是物品的设置

然后其他的我们就不用看了,我们写的时候就参照这个来写就行了

狼铠物品

虽然本篇教程不会写狼铠,但是我们还是可以看一下它相关的源代码,解释一下为什么要使用Mixin才有可能新增狼铠

1
2
3
4
public static final Item WOLF_ARMOR = register(
"wolf_armor",
new AnimalArmorItem(ArmorMaterials.ARMADILLO, AnimalArmorItem.Type.CANINE, true, new Item.Settings().maxDamage(ArmorItem.Type.BODY.getMaxDamage(4)))
);

WOLF_ARMOR的注册和IRON_HORSE_ARMOR一样,只是这里的TypeCANINE,这个是狼铠的类型

然后还有一个maxDamage,这个也是狼铠的耐久值,里面的数字也是乘数,其计算逻辑是和我们前面写的玩家的盔甲一样的,这里就不再赘述

随后我们来看看这个字段它使用在什么地方

1
2
3
4
5
6
7
8
@Override
public ActionResult interactMob(PlayerEntity player, Hand hand) {
...
if (itemStack.isOf(Items.WOLF_ARMOR) && this.isOwner(player) && this.getBodyArmor().isEmpty() && !this.isBaby()) {
this.equipBodyArmor(itemStack.copyWithCount(1));
itemStack.decrementUnlessCreative(1, player);
return ActionResult.SUCCESS;
...

这个是WolfEntityinteractMob方法,这个是玩家与狼交互的方法

这里我们就可以发现,这里用的是itemStack.isOf(Items.WOLF_ARMOR),这个是硬编码的,所以我们要新增狼铠的话,就得用Mixin来修改这个源代码

当然,不只是要改这里的代码,还有其他的地方,感兴趣的话可以自行研究,这里就不再赘述

注册马铠

注册物品

那我们现在就来注册一个马铠

1
2
public static final Item ICE_ETHER_HORSE_ARMOR = registerItems("ice_ether_horse_armor",
new AnimalArmorItem(ModArmorMaterials.ICE_ETHER, AnimalArmorItem.Type.EQUESTRIAN, false, new Item.Settings().maxCount(1)));

这个就是我们新增的马铠

ICE_ETHER是我们之前玩家盔甲的材质,直接用就好了

其他的参数是和IRON_HORSE_ARMOR一样的,我们照着写一下就好了

加入物品栏

然后我们把这个物品加入物品栏

1
entries.add(ModItems.ICE_ETHER_HORSE_ARMOR);

数据文件

语言文件

1
translationBuilder.add(ModItems.ICE_ETHER_HORSE_ARMOR, "Ice Ether Horse Armor");

这个是物品的名字,我们把它翻译一下

模型文件

1
itemModelGenerator.register(ModItems.ICE_ETHER_HORSE_ARMOR, Models.GENERATED);

这个是物品的模型,用GENERATED即可

材质文件

材质文件的路径是resources/assets/tutorialmod/textures/entity/horse/armor

然后材质文件的命名是horse_armor_<材质名>.png,比如这里就是horse_armor_ice_ether.png,它的材质名是后置的