学习之前,应该先了解一下这些东西
一、 什么是模组加载器
二、 他们是如何修改Minecraft的
三、 修改Minecraft的原理是什么
四、 什么是混淆
五、 如何修改Minecraft
1. 类似于Fabric、Forge,等等,这些都是模组加载器
2. 他们都会通过重新设置类加载器,而重新加载所有类,除了java.lang,java.xxx 之类的核心类,因为java不允许这些类重新加载,当然也可以通过bootclasspath来强制修改java核心类,这些都是后话了, 我们可以使用Mojang官方的LegacyLauncher,这个依赖来在运行的时候重新加载,但年代太久没更新,已经不支持Java9以上的版本,不过修复它也很简单
3. 当类被重新加载的时候,有一个过程,会将二进制文件读取,在读取后我们可以对它进行修改,可以通过ASM等框架,或者基于ASM框架的Mixin框架,之前我制作过这些ASM和Mixin的基础视频
4. 混淆就是把一个类名或者其他可见名,改为不能分辨的名字,比如一个Minecraft类,混淆之后会变成abc这个名字,并且所有的包名都会被去掉, Minecraft原版Jar文件都是混淆后的,只有类名、方法名、字段名被混淆了,再加上近几年官方都在放出每个版本的混淆映射,我们可以通过映射来返混淆,映射就是把每个混淆的名字,告诉你它之前是什么名字,Mojang不允许我们把反混淆后的源码放出来,所以一些客户端比如LiquidBounce使用Forge以Mod的形式来修改客户端
5. 我们可以先把Jar反混淆,之后我们依赖这个类,这样我们就可以正常依赖这个Jar,之后在用官方给的映射列表把写好的东西给重新混淆,这仅仅是不行的,我们还需要修改Java类,使用ASM或者Mixin,比如需要在游戏的onUpdate等方法里插入调用,来实现事件Event,这些操作都需要Gradle来完成,可以写一个Gradle插件来帮我们完成这些操作,比如在编译之后打包Jar之前,我们就可以对这些类重新混淆