直接修改class文件

这是一种非常简单、暴力、原始的修改方式,通过直接修改class文件,可以任意的修改、注入想要的代码。 FML从创始开始直到1.5.2,都是直接采用这种方式来对Minecraft进行修改的。

直接修改class文件的方法很多,其中MCP是一个成熟的修改Minecraft的class文件的工具,为我们提供了反混淆等功能,便于开发人员以修改代码的形式来进行class文件的修改操作。除此之外,修改class文件的字节码甚至直接根据class文件结构修改其二进制数据都是可行的方法,但相比之下就较为麻烦,下文的制作方法为常规的MCP方法。

制作方法

安装MCP

在下载并解压MCP后,我们可以看到根目录下有着大量的shbat脚本文件,这些脚本分别有以下作用:

  • cleanup,清理MCP环境,删除binsrcreobf等文件夹

  • 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代码

Minecraft的代码位于src文件夹中,可以直接修改。

如果需要使用IDE进行开发,可以使用eclipse导入eclipse文件夹作为已有项目(Import -> Existing Projects)。

修改完毕后,先使用recompile编译,再使用reobfuscate混淆。

打包Mod

编译并混淆后的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难度较大

Last updated