Table of Contents
Fabric 模组编写的介绍
这是对制作 Fabric 模组时可以使用的一些常用技术的快速介绍。 要为 Minecraft 制作模组,通常必须以非标准的方式与 Minecraft 的代码进行交互。 尽管 Minecraft 变得越来越灵活,可以适应变化,但它并不是天生就可以进行修改的。
与其他改装 API 不同,Fabric Loader 不会覆盖 Minecraft 的类文件以添加更多功能, 而是使用Mixin 库注入代码。 但是,大多数时候您不会直接使用此库。
Mixins 可能很脆弱,有时会引起冲突。 因此,Fabric API 已经为您实现了一些常用功能。 如果核心 Fabric API 中不存在它,那么通常它将存在于第三方库中。 在几乎每种情况下,与自己实现 mixin 相比,最好使用 Fabric API 或第三方库。
但是有时候,您不需要任何这些。 尽管 Minecraft 并非专为改装而设计,但它仍然包含许多功能,您无需进行任何其他更改即可访问它们。
本文将按优先顺序介绍影响 Minecraft 的所有方法。
Minecraft 自带 API
如果 Minecraft 已经允许您执行某些操作,请不要重新造轮子。一个很好的例子是“net.minecraft.util.registry.Registry”类,它使您无需修改 Minecraft 的代码即可添加方块、物品等。
Minecraft 还将 JSON 数据文件用于各种数据驱动功能。您可以将 JSON 文件添加到您的模组中,Fabric API 会注入这些文件。例如,方块模型和战利品表是通过 JSON 文件实现的。
Fabric API
安装在客户端中的 Fabric 本身分为两个部分。
- Fabric Loader:用于加载您的本身并调用您的入口点。
- Fabric API:这是一个可选的库,提供一些常用的接口。
故意将 API 保持相对较小,以使 Fabric 可以更快地移植到新的 Minecraft 版本。
您可以通过查看其 GitHub 上的源代码来了解 Fabric API 中包含的内容。 Fabric API 包含许多常见的事件挂钩,以及用于联网和渲染之类的通用实用程序。
第三方 API
由于 Fabric API 为方便维护,体量较小且覆盖范围较小,因此存在第三方 API 来填补空白。 Mixin 允许任何第三方库以与核心 Fabric API 相同的方式修改 Minecraft 的代码。 您应尽可能使用这些而不是编写自己的 mixin,以最大程度地减少发生冲突的可能性。
您可以在此 wiki 上找到第三方库的不完整列表。
Mixin
最后,您可以使用 mixin。 Mixin 功能强大,可让您更改 Minecraft 自己的代码。 某些 mixin 可能会冲突,但是若能负责任地使用,这些是为模组添加特性的关键。
Mixin 有多种,按优先顺序排列:
- 添加接口
- 回调注入
- 重定向注入
- 覆写
此列表不一定完整,只是快速概述。
添加接口
这可能是使用 mixin 的最安全方法之一。 新的接口实现可以添加到任何 Minecraft 类中。 然后,可以通过将类强制转换为接口来访问该接口。 这不会改变类的任何内容,只会增加新的内容,因此极不可能发生冲突。
需要注意的是,您插入的函数签名(名称+类型)必须是唯一的。 因此,如果您使用常见的参数类型,请确保指定独特的名称。
回调注入
回调注入器 @Inject 使您可以向现有方法以及该方法中的特定方法调用添加回调挂钩。 它们还使您可以拦截和更改方法的返回值,并尽早返回。 回调注入可以堆叠,因此不太可能引起模组之间的冲突。
重定向注入
通过 @Redirect,您可以使用自己的代码在目标方法内包装方法调用或变量访问。 使用这些功能时需要谨慎,目标调用或访问只能在所有模组之间重定向一次。 如果两个模组重定向相同的值,将导致冲突。 优先考虑回调注入。
覆写
避免使用覆写,因为替换了一个方法,删除了所有现有代码,并与该方法上的任何其他类型的 mixin 发生冲突。 覆写极有可能不仅与其他模组冲突,而且与 Minecraft 本身的更改冲突。 您极有可能不需要覆盖来完成您想做的事情,请使用其他方法。