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

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

<think>嗯,用户遇到了Minecraft服务器启动时无法加载主类@user_jvm_args.txt的错误。我需要先分析可能的原因。根据引用[1]中的启动命令,用户可能没有正确配置Java参数文件。首先,检查user_jvm_args.txt是否存在,路径是否正确。用户可能在启动命令中引用了这个文件,但文件可能被误删或路径错误。 接下来,查看引用[3]提到的客户端mod问题,虽然这个错误通常与主类加载有关,但也不能完全排除mod冲突的可能性。不过,主类加载错误更可能与Java参数文件有关。需要确认用户是否在服务端安装了仅客户端的mod,如Optifine,这可能导致类加载错误,但报错信息可能不同。 然后,检查Java版本是否兼容。例如,某些Minecraft版本需要特定的Java版本,如果版本不匹配,也可能导致类加载失败。此外,启动命令中的参数是否正确,比如是否遗漏了-jar或其他必要的参数。 还要查看文件权限问题,用户可能没有足够的权限访问user_jvm_args.txt或相关目录。使用sudo或更改文件权限可能解决这个问题。同时,确保所有依赖库和Forge文件正确安装,没有损坏。 最后,建议用户逐步排查:验证文件结构、检查Java参数、确认Java版本、检查mod兼容性、测试基本启动命令。这样分步骤排除可能的原因,找到具体问题所在。</think>### 分步解决方案:Minecraft服务器启动时"找不到或无法加载主类 @user_jvm_args.txt"错误 1. **验证文件路径与内容** - 检查文件`user_jvm_args.txt`是否存在且路径正确,默认位置应为: ```bash /home/[用户名]/MinecraftServer/user_jvm_args.txt ``` - 确认文件内容格式正确,每行一个JVM参数,例如: ```properties -Xmx4G -Xms2G ``` 2. **检查启动命令格式** - 确保启动命令包含完整的参数链,参考引用[1]的标准命令格式: ```bash /usr/bin/java @/home/zxy/MinecraftServer/user_jvm_args.txt @/home/zxy/MinecraftServer/libraries/net/minecraftforge/forge/1.20.1-47.3.5/unix_args.txt nogui ``` - 验证`unix_args.txt`是否存在且包含正确的启动主类信息,例如: ```properties -DlibraryDirectory=libraries -jar forge-1.20.1-47.3.5.jar ``` 3. **排查MOD冲突(引用[3]相关)** - 移除`mods`目录下所有纯客户端MOD(如Optifine) - 使用二分法逐个添加MOD测试,直到复现错误 4. **检查Java环境** - 确认Java版本匹配(Forge 1.20.1需要Java 17): ```bash java -version ``` - 重新安装JDK: ```bash sudo apt install openjdk-17-jdk ``` 5. **文件权限修复** - 递归设置目录权限: ```bash chmod -R 755 /home/[用户名]/MinecraftServer ``` 6. **完整测试流程** - 新建空白目录测试最小化启动: ```bash mkdir test_server && cd test_server wget https://maven.minecraftforge.net/net/minecraftforge/forge/1.20.1-47.3.5/forge-1.20.1-47.3.5-installer.jar java -jar forge-1.20.1-47.3.5-installer.jar --installServer ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值