Minecraft Forge 1.20.1 模组制作(3):Forge注册表

本章开始我们正式进入Java代码编写。
Forge提供了一套便利的注册表系统。Forge注册表用于注册和查询各种类型信息,常见的如物品类型、方块类型、实体类型、方块实体类型等。

1. Forge注册表的调用、ResourceLocation

Forge注册表的基类(接口)为IForgeRegistry。Forge提供的注册表以静态常量的形式位于类ForgeRegistries中,调用时使用:ForgeRegistries.ITEMS即可获取物品注册表,另外ENTITY_TYPESBLOCKS为实体类型和方块注册表。
Forge注册表在调用时可视为一个从ResourceLocation到对象的映射。ResourceLocation是Minecraft一种常见的键类型,由命名空间和路径两个字符串组成(仅允许小写字母、数字和下划线)。ResourceLocation可以用于表示资源文件路径,但其本身并非必然具有实际含义,可以简单地视为两个字符串的组合。ResourceLocation通常显示为namespace:path的格式。其使用如下:

ResourceLocation key0 = new ResourceLocation("namespace", "path")	// "namespace:path"
ResourceLocation key1 = new ResourceLocation("namespace:path")	// "namespace:path"
ResourceLocation key2 = new ResourceLocation("path")  // "minecraft:path".("minecraft"是默认命名空间)
key0.getNamespace();	// "namespace"
key0.getPath();	// "path"

通常在作为键时,其命名空间为模组ID。Forge注册表的查询类似于Java Map,但请注意当试图查询一个不存在的键时,其会返回默认值而不是null。例如:

EntityType<?> type = ForgeRegistries.ENTITY_TYPES.getValue(new ResourceLocation("something:unexisting"))

会返回猪的实体类型,而不是null。这也是有时候缺失实体类型的刷怪类道具/方块刷出猪的原因。

2. 向注册表中注册内容

向Forge注册表中注册内容的最常用方法是使用延迟注册(DeferredRegister)。新建类com.sodiumzh.tutorial.registries.ItemRegistry,声明一个静态常量:

public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, ForgeTutorial.MODID);

这样就创建了一个用于物品的延迟注册器。create的两个参数分别为目标注册表,以及其注册内容的键命名空间

注册具体对象时,在DeferredRegister的下方声明静态常量:

public static final RegistryObject<Item> TEST_ITEM = ITEMS.register("test_item", () -> new Item(new Item.Properties()));

这向ITEM这个DeferredRegister中注册了一个键为test_item的默认物品。最终注册到注册表中时,这个物品的键是forge_tutorial:test_item

DeferredRegister#register的第二个参数为Supplier。这是为了在实际注册到注册表时再构建对象,而非声明时立即构建。这也是“延迟”一词的由来,因为DeferredRegister并非立即将内容注册到注册表中,而是将自身注册到Mod事件总线(目前可以姑且理解为模组加载流程)中。当加载进行到注册表注册阶段时,所有的DeferredRegister集中构建对象并注册。

由于注册的对象并非立即构建,register方法不直接返回对象,而是返回一个该对象的RegistryObject。在模组加载的注册阶段完成后,调用其get()方法可以获取对象。要注意的是如果还没有运行完注册阶段,调用get()会返回null

最终,回到主类的构造方法,加入如下代码:

IEventBus modEventBus = context.getModEventBus(); // 获取Mod事件总线
ItemRegistry.ITEMS.register(modEventBus); // 将DeferredRegister注册到Mod事件总线中

打开调试游戏,进入创造模式世界,输入命令:

/give Dev forge_tutorial:test_item

得到了一个缺失材质的物品。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值