本篇教程的视频

(待发布)

本篇教程的源代码

GitHub地址:TutorialMod-Sign-1.20.1

本篇教程目标

  • 利用TerraformAPI添加告示牌

添加API依赖

告示牌是属于方块实体了,如果你挖过相关的源代码,你就会发现它在方块实体注册时,它的方块实体类型注册是硬编码的

也就是说,如果我们要实现原版的告示牌,在注册方块实体上,就得用Mixin加入原版的方块实体类型中

要么就是自己从头到尾实现一个告示牌,当然我们教程会做,但那是方块实体的内容了,未来再说

所以本期教程和下期的船,都是用TerraformAPI来实现的

前面一篇教程我们重点讲解了build.gradle文件的配置,现在我们就来实践一下

今天我们使用TerraformAPI来添加告示牌,所以要先引入这个API

操作方法在它的GitHub仓库上也有,可参阅TerraformAPI

build.gradlerepositories中添加

1
2
3
4
maven {
name = 'TerraformersMC'
url = 'https://maven.terraformersmc.com/'
}

在dependencies中添加

1
2
modImplementation "com.terraformersmc.terraform-api:terraform-wood-api-v1:7.0.3"
include("com.terraformersmc.terraform-api:terraform-wood-api-v1:7.0.3")

版本号可以在它仓库的gradle.properties文件中找到

这里我们就直接include了,因为这个库相当较小,可以直接包含在我们模组中

注册

TerraformAPI的仓库中,它也给出了示例,可以在example的主类文件中找到

注册方块

首先我们得写一堆Identifier,用于指定贴图位置

1
2
3
public static final Identifier ICE_ETHER_SIGN_TEXTURE = new Identifier(TutorialMod.MOD_ID, "entity/signs/ice_ether");
public static final Identifier ICE_ETHER_HANGING_SIGN_TEXTURE = new Identifier(TutorialMod.MOD_ID, "entity/signs/hanging/ice_ether");
public static final Identifier ICE_ETHER_HANGING_SIGN_GUI = new Identifier(TutorialMod.MOD_ID, "textures/gui/hanging_signs/ice_ether");

它分为普通告示牌、悬挂告示牌和悬挂告示牌的GUI,普通告示牌的GUI是从它的材质文件中截取的,我们就不用指定了

然后我们注册方块

1
2
3
4
5
6
7
8
public static final Block ICE_ETHER_SIGN = Registry.register(Registries.BLOCK, new Identifier(TutorialMod.MOD_ID, "ice_ether_sign"),
new TerraformSignBlock(ICE_ETHER_SIGN_TEXTURE, AbstractBlock.Settings.copy(Blocks.OAK_SIGN)));
public static final Block ICE_ETHER_WALL_SIGN = Registry.register(Registries.BLOCK, new Identifier(TutorialMod.MOD_ID, "ice_ether_wall_sign"),
new TerraformWallSignBlock(ICE_ETHER_SIGN_TEXTURE, AbstractBlock.Settings.copy(Blocks.OAK_WALL_SIGN)));
public static final Block ICE_ETHER_HANGING_SIGN = Registry.register(Registries.BLOCK, new Identifier(TutorialMod.MOD_ID, "ice_ether_hanging_sign"),
new TerraformHangingSignBlock(ICE_ETHER_HANGING_SIGN_TEXTURE, ICE_ETHER_HANGING_SIGN_GUI, AbstractBlock.Settings.copy(Blocks.OAK_HANGING_SIGN)));
public static final Block ICE_ETHER_WALL_HANGING_SIGN = Registry.register(Registries.BLOCK, new Identifier(TutorialMod.MOD_ID, "ice_ether_wall_hanging_sign"),
new TerraformWallHangingSignBlock(ICE_ETHER_HANGING_SIGN_TEXTURE, ICE_ETHER_HANGING_SIGN_GUI, AbstractBlock.Settings.copy(Blocks.OAK_WALL_HANGING_SIGN)));

这里我们注册了四种方块,分别是普通告示牌、悬挂告示牌和它们放在墙上的类型

这里注意实例化的有TerraformSignBlockTerraformWallSignBlockTerraformHangingSignBlockTerraformWallHangingSignBlock这四个,都是TerraformAPI提供的

也要注意,这里我们直接使用Registry.register来注册,不注册它的方块物品,物品我们待会还要另外再写

注册物品

1
2
3
4
public static final Item ICE_ETHER_SIGN = registerItem("ice_ether_sign",
new SignItem(new Item.Settings().maxCount(16), ModBlocks.ICE_ETHER_SIGN, ModBlocks.ICE_ETHER_WALL_SIGN));
public static final Item ICE_ETHER_HANGING_SIGN = registerItem("ice_ether_hanging_sign",
new HangingSignItem(ModBlocks.ICE_ETHER_HANGING_SIGN,ModBlocks.ICE_ETHER_WALL_HANGING_SIGN, new Item.Settings().maxCount(16)));

这里我们注册了两种物品,分别是普通告示牌和悬挂告示牌

实例化SignItemHangingSignItem,这两个是原版的类,传入我们写好的方块

物品设置可以像原版的告示牌一样,设置堆叠堆叠数量为16

加入物品栏

1
2
entries.add(ModItems.ICE_ETHER_HANGING_SIGN);
entries.add(ModItems.ICE_ETHER_SIGN);

数据文件

语言文件

1
2
translationBuilder.add(ModItems.ICE_ETHER_SIGN, "Ice Ether Sign");
translationBuilder.add(ModItems.ICE_ETHER_HANGING_SIGN, "Ice Ether Hanging Sign");

模型文件

物品的模型文件只要写悬挂告示牌的模型文件即可

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

另外,我们在之前写的方块族中,再另起一个,用来生成告示牌的模型文件

1
2
3
4
5
public static final BlockFamily ICE_ETHER_PLANKS = register(ModBlocks.ICE_ETHER_PLANKS)
.sign(ModBlocks.ICE_ETHER_SIGN, ModBlocks.ICE_ETHER_WALL_SIGN)
.group("wooden")
.unlockCriterionName("has_planks")
.build();

我们另外注册一个方块族,父级就用之前写的木板,用sign方法指定告示牌

当然,原本写在数据生成类中的这句话也要去掉

1
// blockStateModelGenerator.registerSimpleCubeAll(ModBlocks.ICE_ETHER_PLANKS);

至于悬挂告示牌的模型文件,可能是TerraformAPI会生成吧

另外就是材质文件,注意我们之前写的三个Identifier,位置放对,还要有两个物品栏中的物品材质文件

测试

跑好数据生成,我们就可以启动游戏进行测试了