本篇教程的视频:

本篇教程源代码

GitHub地址:TutorialMod-Boat-1.21

介绍

是一个可以载人的实体,可以在水上行驶,箱子船同样如此,不过是多了个箱子而已

不过要想添加像原版一样的船,这并不简单,而且比告示牌更复杂,因为船是实体,其逻辑比方块实体复杂得多

本期教程我们还将使用TerraForm API来实现船和箱子船的添加

TerraForm API的GitHub地址:TerraForm API

关于其依赖的添加见前一篇教程Here,这里就不再赘述了

添加船

创建ModBoats类

首先我们创建一个ModBoats类,这个类用来注册我们的船和箱子船

1
2
3
public static final Identifier ICE_ETHER_BOAT = Identifier.of(TutorialMod.MOD_ID, "ice_ether_boat");

public static final Identifier ICE_ETHER_CHEST_BOAT = Identifier.of(TutorialMod.MOD_ID, "ice_ether_chest_boat");

首先我们定义了两个Identifier,标识了我们的船和箱子船,其实和我们前面写的Identifier一样,也就是资源文件的位置

1
public static final RegistryKey<TerraformBoatType> ICE_ETHER_BOAT_KEY = TerraformBoatTypeRegistry.createKey(ICE_ETHER_BOAT);

随后我们定义了一个RegistryKey,这个RegistryKeyTerraformBoatType的,这个类是TerraForm API中的一个类,用来注册船的类型

下面我们写一个初始化方法,里面写船的注册

1
2
3
4
5
6
7
8
9
public static void registerModBoats() {
TerraformBoatType iceEtherBoat = new TerraformBoatType.Builder()
.item(ModItems.ICE_ETHER_BOAT)
.chestItem(ModItems.ICE_ETHER_CHEST_BOAT)
.planks(ModBlocks.ICE_ETHER_PLANKS.asItem())
.build();

Registry.register(TerraformBoatTypeRegistry.INSTANCE, ICE_ETHER_BOAT_KEY, iceEtherBoat);
}

在初始化注册方法中,我们定义了一个TerraformBoatType

在这个类中,我们定义了船的物品,箱子船的物品,船对应的木板,当然,因为船的物品还没有写,所以这里会报错

而后我们用Registry注册了这个TerraformBoatType,将船和箱子船一起注册

主类初始化

我们在主类的onInitialize方法中调用这个方法

1
ModBoats.registerModBoats();

注册船和箱子船的物品

我们在ModItems类中注册这两个物品

1
2
3
public static final Item ICE_ETHER_BOAT = TerraformBoatItemHelper.registerBoatItem(ModBoats.ICE_ETHER_BOAT, ModBoats.ICE_ETHER_BOAT_KEY, false);

public static final Item ICE_ETHER_CHEST_BOAT = TerraformBoatItemHelper.registerBoatItem(ModBoats.ICE_ETHER_CHEST_BOAT, ModBoats.ICE_ETHER_BOAT_KEY, true);

这里我们用到了TerraformBoatItemHelper这个类,这个类是TerraForm API中的一个类

他们用到的参数分别是船的Identifier,船的RegistryKey,和一个boolean,这个boolean是用来判断是否是箱子船

加入物品栏

1
2
entries.add(ModItems.ICE_ETHER_BOAT);
entries.add(ModItems.ICE_ETHER_CHEST_BOAT);

设置渲染层

因为船是实体,它是要写渲染的,在之后的生物实体教程中,我们也会写到渲染

这里我们到模组的客户端类中,设置渲染层

1
TerraformBoatClientHelper.registerModelLayers(ModBoats.ICE_ETHER_BOAT, false);

这里我们用到了TerraformBoatClientHelper这个类,同样是TerraForm API中的一个类

我们将船的Identifier和一个boolean传入,这个boolean是用来判断我们的船是不是竹筏这类的

因为普通的船是围合起来的,但竹筏是平的,在渲染上它俩是不一样的

数据文件

语言文件

1
2
translationBuilder.add(ModItems.ICE_ETHER_BOAT, "Ice Ether Boat");
translationBuilder.add(ModItems.ICE_ETHER_CHEST_BOAT, "Ice Ether Chest Boat");

这里我们注册了船和箱子船的语言文件

模型文件

1
2
itemModelGenerator.register(ModItems.ICE_ETHER_BOAT, Models.GENERATED);
itemModelGenerator.register(ModItems.ICE_ETHER_CHEST_BOAT, Models.GENERATED);

这里只要写物品的模型文件即可

材质文件

实体材质文件放在assets/tutorialmod/textures/entity/boatassets/tutorialmod/textures/entity/chest_boat

物品的材质文件还是常规的位置,放在assets/tutorialmod/textures/item中,当然也是有两个

位置不要搞错,不然会出问题

随后,我们就可以启动游戏进行测试了