ZX夏夜之风
要说minecraft知名的mod加载器,forge, fabric, liteloader, rift。。。很多就对了。

玩了多年mc,开始钻研mod加载,但是我连forge的加载机制和对minecraft的修改原理都不知道。。

求大佬讲一下以下内容:
Forge启动Minecraft的过程和原理

Forge如何修改Minecraft?

如果我想写一个简单的MOD加载器,那么这个加载器该按怎么样的路线来编写? (重点)

能否用 python 3编写(用不惯2.x) (重点)

3TUSK
本帖最后由 3TUSK 于 2021-7-28 15:17 编辑

写在前面:
如果你是一位使用 Java 或其他 JVM 上语言的独立游戏开发者,请不要原封不动地照搬这个思路来设计 Mod 加载器,除非你不打算以后维护你的游戏了。
Java SE 的标准库里就已经有比较正常的现成的框架可以用了。



Forge启动Minecraft的过程和原理

Minecraft 是一个标准的 Java 编写的程序,运行在 JVM 上。这意味着平时你启动 Minecraft,都是从它的 main 方法开始执行的。
但从一个 Mod 加载器开始启动 Minecraft 就不能这么做了:Minecraft 没有 Mod 加载机制,需要给它加进去。
因此,不论是 Forge 还是 Fabric,它们都不约而同地选择了通过一层「包装」来启动 Minecraft,首先先加载各自的「基础设施」,然后反射调用刚才提到的 main 方法来继续「正常」的启动。

「正常」加引号是因为,通过包装的一层启动 Minecraft 后,Mod 加载的逻辑会在运行时被注入进去。
Mod 加载器第一步要做的事情是「在特定的位置找到所有的 Mod,并加载进来」。
然后剩下的就是 Mod 加载的生命周期。Mod 加载的生命周期会随着 Mod 加载器的不同而不同,但粗略地讲,大抵都是在合适的时机触发对应的回调,让 Mod 的方法在合适的时间被调用,然后 Minecraft 在一如既往地加载游戏内容时就连带把 Mod 的内容也捎上了。
举个例子。比方说我要注册新物品,Forge 的做法是在原版的物品加载完之后,模型数据等等开始加载之前的某一个时间发布一个注册事件,各个 Mod 通过订阅并响应这个事件来注册新物品。Forge 同时还确保了 Minecraft 会把 Mod 的新物品的模型数据都捎带上。

Forge如何修改Minecraft?

刚才提到「不论是 Forge 还是 Fabric,它们都…… 首先先加载各自的『基础设施』」。
这套基础设施的一个关键职责就是「提供运行时修改 class 的能力」。这意味着基于这些基础设施的 Mod 可获得在 class 被载入 JVM 前修改 class 的能力——这些 Mod 会在 class 载入 JVM 前,编辑这些 class 以注入必须的逻辑,例如对 Mod 加载器来说至关重要的 Mod 加载生命周期。
在 Mod 社区中,这个职责通常被称作「类转换」(Class Transformation)。
具有类转换能力的 Mod 被称作 Coremod。

Forge(连带负责 Mod 加载的 Forge Mod Loader,FML)本身就是一个建基于它所依赖的 modlauncher 上的巨大 Coremod,它使用 Coremod 来将 Mod 需要的 API 追加到 Minecraft 中。

类似的,Fabric(包括负责 Mod 加载的 Fabric Loader 和负责跨 Mod 兼容 API 的 Fabric API)也是一个巨大的 Coremod。Fabric 主要使用 SpongePowered Mixin 作为修改 Minecraft 的工具。

如果我想写一个简单的MOD加载器,那么这个加载器该按怎么样的路线来编写? (重点)

-1. 直接使用 Fabric Loader,全剧终。


能否用 python 3编写(用不惯2.x) (重点)

一个坏消息和一个好消息。
坏消息是:不能,因为 Minecraft 是一个 Java 编写的运行在 JVM 上的游戏。除非你打算用 Jython 之类的东西让 Python 跑 JVM 上,否则用最接近 JVM 底层的 Java 才是最省时省力的选择(相比于其他选项)。
好消息是:Python 2.x 当然更不可能,所以你不用担心要回去写 Python 2.x。

ZX夏夜之风
3TUSK 发表于 2021-7-28 15:13
写在前面:
如果你是一位使用 Java 或其他 JVM 上语言的独立游戏开发者,请不要原封不动地照搬这个思路来设 ...

为什么看着一大堆的话我忽然丧失了信心。。。
不过这确实很详细,解答满分!

ZX夏夜之风
3TUSK 发表于 2021-7-28 15:13
写在前面:
如果你是一位使用 Java 或其他 JVM 上语言的独立游戏开发者,请不要原封不动地照搬这个思路来设 ...

再次提问:在 Minecraft 被 Forge 修改的过程中,LaunchWrapper作为什么角色?
我如何通过 LaunchWrapper 启动我的 mod 加载器主体?
LaunchWrapper会把什么传给我的加载器主体?

嵿尖丶战神

3TUSK
ZX夏夜之风 发表于 2021-7-28 20:31
再次提问:在 Minecraft 被 Forge 修改的过程中,LaunchWrapper作为什么角色?
我如何通过 LaunchWrapper ...
LaunchWrapper作为什么角色

launcherwrapper 是 1.6 - 1.12.2 之间 Forge/FML 所使用的「基础设施」,它提供了非常非常原始的类转换的功能(ITweaker、IClassTransformer)。
这个东西其实是 Mojang 出的,它用于在 1.6 Mojang 引入全新的启动器工作方式后,在启动 1.5.2 及更早版本的游戏时,注入代码使旧版游戏也能工作在新启动器上。
如何通过 LaunchWrapper 启动我的 mod 加载器主体

通过实现 ITweaker/IClassTransformer 将调用你的 Mod 加载器主体的代码注入到 Minecraft 底层的合适位置中。
请注意,这意味着你在启动游戏时应当从 launcherwrapper 开始启动,一般而言这需要一个自定义的 version manifest。Forge/Fabric 安装器的职责之一就是免除手动编辑这玩意的麻烦。
LaunchWrapper会把什么传给我的加载器主体

阅读这个,然后自行理解一下 https://github.com/Mojang/Legacy ... apper/ITweaker.java



不论是 Forge 还是 Fabric,现在都没有以 launcherwrapper 作为首选。究其原因还是它的功能显得过于粗糙了。如果只是自学的话,launcherwrapper 的结构确实简单明了,但如果你想搞出点新东西,我个人建议不要使用 launcherwrapper。

第一页 上一页 下一页 最后一页