我的世界FML加载模组过程
此教程未引用MC源码!
从 cpw 的 ModLauncher 说起
ModLauncher 是一个为 MC 设计的字节码修改器,它支持通过 ObjectWeb 的 asm 框架的 Tree API 修改 MC 和其他模组的字节码,也支持 Forge 等加载器需要的在特定阶段向 ClassPath 添加 jar 文件等功能。
客户端中,打开 MC 的版本 JSON,可以发现主类被修改为 cpw.mods.bootstraplauncher.BootstrapLauncher;
服务端中可以在 Forge 的 MANIFEST.MF 中看到主类为 net.minecraftforge.server.ServerMain。
查看源码可发现,这两个类最终都调用了 cpw.mods.modlauncher.Launcher::main 方法,它创建一个 Launcher 对象并调用它的 run 方法。
在 run 方法里发生了什么
首先它处理了参数,然后检索了所有的 ITransformationService。
接下来,它通过所有的 ITransformationService 的 beginScanning 和 completeScan 方法扫描 ITransformationService.Resource,这个 record 声明了所有的 SecureJar。在 beginScanning 阶段,FML 会调用 FMLLoader 的 beginModScan 方法,这时 FML 开始 discover 所有模组。这时所有有效的模组 Jar 文件以 IModFile 的形式存在。
到了 completeScan 阶段,FML 获取所有 IModFile 的 所有 IModInfo,并加载 CoreMod 和 AccessTransformer。
回到 run 方法,它做完接下来一系列操作后,调用 FML 的 LaunchHandler,启动被修改的 Minecraft。
在 MC 客户端中
在正常的启动流程中,FML 做了一些手脚:
在加载 resourceManager 后,FML 开始初始化模组。模组现在以 ModContainer 形式存在。