本篇教程的视频

本篇教程的源代码

GitHub地址:TutorialMod-Boat-1.20.1

本篇教程目标

  • 利用TerraformAPI添加船

注册船

船在游戏中是属于实体,与告示牌一样,在注册时,他们的注册表是硬编码的,所以如果你要实现像原版的那样的船

要么就用Mixin修改原版船的注册表,要么就自己从头到尾写一个船

不过那样的话,就属于实体相关的内容了,我们这里就还是先用第三方的API来写

同样它的示例也是在Terraform的仓库中有的

ModBoats

我们先创建一个ModBoats类,用来注册我们的船

1
2
3
public class ModBoats {

}

随后,我们写上两个Identifier

1
2
public static final Identifier ICE_ETHER_BOAT = new Identifier(TutorialMod.MOD_ID, "ice_ether_boat");
public static final Identifier ICE_ETHER_CHEST_BOAT = new Identifier(TutorialMod.MOD_ID, "ice_ether_chest_boat");

这两个一个是普通的船,一个是带箱子的船

接下来我们再写一个注册键,用来注册我们的船

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

注册键是TerraformBoatType类型的,也就是我们用TerraformAPI注册的船的注册表

我们用TerraformBoatTypeRegistry.createKey方法来创建一个注册键,传入的参数是普通的船的Identifier

接下来就写一个注册方法

1
2
3
4
5
6
7
8
9
public static void registerBoats(){
TerraformBoatType ICE_ETHER_BOAT_TYPE = 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, ICE_ETHER_BOAT_TYPE);
}

注册方法中,我们首先创建了一个TerraformBoatType类型的对象

通过itemchestItem方法,我们传入了我们的船和带箱子的船对应的物品(当然现在我们还没写物品,所以会报错)

最后我们用Registry.register方法来注册我们的船

传入的参数是TerraformBoatTypeRegistry.INSTANCE,也就是TerraformBoatType的注册表

ICE_ETHER_BOAT_KEY,也就是我们的船的注册键

ICE_ETHER_BOAT_TYPE,也就是我们创建的TerraformBoatType类型的对象

随后,这个方法还要在主类中调用,就和以前的那些方法一样

1
ModBoats.registerBoats();

添加物品

1
2
3
4
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.registerBoatItem方法来注册我们的船对应的物品

传入的参数有三个,分别是我们的船的Identifier,我们的船的注册键,以及是否是带箱子的船

然后不要忘记将船加入到物品栏中

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

渲染层设置

因为船是实体,而实体都是要给它设置渲染层,以保证其正常的渲染,否则游戏会崩溃

这里我们到模组的客户端类中写上

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

这里使用TerraformBoatClientHelper.registerModelLayers方法来注册我们的船的渲染层

后面的布尔值代表的是这个船是否是竹筏类型的

船有两种,一种是普通船,四周围合;但竹筏则是一个平面,边上没有围合起来的结构,所以它们两个的渲染方法是不一样的

数据文件

语言文件

继续使用数据生成来写各个数据文件

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);

模型文件只要写物品对应的模型即可

贴图文件

注意,贴图文件分两种,一个是物品贴图,一个是实体的展开图

物品贴图就和常规的物品一样放就可以

展开图也分两个,一个是普通的船,要放在texures/entity/boat/下,贴图名字与注册键的名字一致,也就是上面我们写的ICE_ETHER_BOAT_KEY,对应ice_ether_boat

另一个是带箱子的船,要放在texures/entity/chest_boat/下,贴图名字同上

测试

跑好数据生成之后,我们就可以进入游戏进行测试了