这是一种非常简单、暴力、原始的修改方式,通过直接修改class文件,可以任意的修改、注入想要的代码。
FML从创始开始直到1.5.2,都是直接采用这种方式来对Minecraft进行修改的。
直接修改class文件的方法很多,其中MCP是一个成熟的修改Minecraft的class文件的工具,为我们提供了反混淆等功能,便于开发人员以修改代码的形式来进行class文件的修改操作。除此之外,修改class文件的字节码甚至直接根据class文件结构修改其二进制数据都是可行的方法,但相比之下就较为麻烦,下文的制作方法为常规的MCP方法。
在下载并解压MCP后,我们可以看到根目录下有着大量的sh
、bat
脚本文件,这些脚本分别有以下作用:
cleanup
,清理MCP环境,删除bin
、src
、reobf
等文件夹decompile
,反编译Minecraft,会将反混淆反编译后的Minecraft代码存储于src
getchangedsrc
,获得被修改的Minecraft代码recompile
,编译修改后的Minecraft代码,未混淆的全部class文件将存于bin
reformat
,格式化src
中的代码reobfuscate
,将被修改的class混淆至notch,并提取至reobf
reobfuscate_srg
,将被修改的class混淆至srg,并提取至reobf
startclient
,运行修改后的Minecraft客户端startserver
,运行修改后的Minecraft服务端updateids
,使用CSV数据对源代码中的srg名重新编号,不推荐使用updatemcp
,更新MCP,不推荐使用updatemd5
,重新编译Minecraft代码,生成md5,如果修改代码后再进行次操作,class修改检测将以现在的代码为基准,不推荐使用updatenames
,使用CSV数据更新mcp名称,不推荐使用
根据以上说明,我们可以使用decompile
来初始化MCP。
Minecraft的代码位于src
文件夹中,可以直接修改。
如果需要使用IDE进行开发,可以使用eclipse导入eclipse
文件夹作为已有项目(Import -> Existing Projects)。
修改完毕后,先使用recompile
编译,再使用reobfuscate
混淆。
编译并混淆后的class位于reobf
文件夹,首先进入到这个文件夹。
推荐使用zip指令的方式进行打包,后缀名jar或zip此处无差异:
zip -q -r ModName-Version.jar *
使用GUI的读者,可以直接选择所有文件,右键压缩到zip。
-
使用压缩文件管理器打开Minecraft的核心文件
minecraft.jar
与Mod的压缩文件 -
在管理器中使用后者的文件替换前者对应的文件
-
删除核心文件的
META-INF
文件夹 -
1.6以上的Forge客户端,还需要在JVM参数中加入
-Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true
来关闭FML对Minecraft核心文件的完整性以及签名检查 -
1.6之后的启动器会对核心文件的完整性进行检查,需要通过复制并修改json的方式绕过检查
这是最简单直接的修改方式,也是最不推荐的修改方式,这种方式会带来包括但不限于以下弊端:
-
安装过程繁琐易出错,如果安装前忘记备份,将会带来无尽的麻烦
-
极差的兼容性,如果两个Mod修改同一个class基本无法兼容
-
删除Mojang对核心文件的签名将带来安全风险
-
不具有可维护性,更新、删除Mod难度较大