引言
如果您是一位Fabric开发者,准备将您的Mod移植到Forge上。
却遇到了一个难题——注册。
Forge的注册器并非如您所想的那样工作,且依赖特性。
您对此非常不满,并开始寻找解决方案……
现在,一个或许不那么好,但可行的解决方案就在你眼前。
简介
如果您讨厌现代的Forge注册器,那您来对地方了。
允许您直接调用Forge注册器,甚至是原生注册器。
这样能够让您的开发工作相对轻松些。
此Mod依然处于实验性阶段,可能会导致故障。
使用方法
该Mod只要位于Mod列表即可生效,无需将其写入依赖库中。
虽然这样的功能是受限的,但多数情况下已经够用了。
无论如何,注册依然只能在加载流程中进行。
允许在RegisterEvent中直接调用Forge注册器而非Forge原生提供的注册工具:
ForgeRegistries.OBJECTS.register(<ID>, <OBJECT>);
这种调用方式更加符合Fabric/Quilt开发者的习惯,且拥有Forge注册器的特性。
如果您需要非Forge原生附带的注册器,请将该Mod作为依赖项以调用该Mod提供的方法。
此外,该Mod还在3.1版本之后提供了一个对Forge注册器的包装方法:
FGRegistry.register(ForgeRegistries.OBJECTS, <ID>, <OBJ>);
Registry.register(BuiltInRegistries.OBJECTS, <ID>, <OBJ>);
就像在Fabric/Quilt那样,整个加载流程中都可以注册,最好的则莫过于静态初始化注册了。
不过众所周知,原生注册器不会在Mod被禁用时保护数据,所以,风险自担。
当然,如果只是通过这种方式注册物品方块之类非硬性要求的事物,这通常不会造成什么危害。
但如果注册地物、群系、结构和维度之类的,就要小心了——丢失的世界生成数据会让存档无法被打开。
虽然说Fabric/Quilt用户用了这么多年了也没说什么
实现原理
尽管该Mod并不开源,但仍允许您洞悉其核心原理。
通过任意修改方式无效化注册器的freeze和lock方法,再在需要时执行此类操作。
在加载流程之外注册的结果是不确定且极度危险的!