有时候模组会出一些小问题或是需要做出修改的地方,但是在模组作者已经宣布停更,不更新旧版本或是不愿意修复的情况下,除了直接对模组进行编程续命外(这需要花很多的时间与努力,也容易遇到很多难以解决的问题,而且前提是模组开源),也可以通过创可贴和recaf对模组进行简单的修改。
注意:使用该教程需要有一定的模组制作经验(至少搭建过工作区)。修改过的模组需要严格按照模组协议进行分发,原则上不允许传播经反编译修改过的模组。通过该教程修改的模组只通过创可贴进行最后更改。
首先需要下载recaf反编译工具:https://github.com/Col-E/Recaf。
下载下来是一个jar包,如果双击无法运行,在java环境配置正确的情况下,可以通过在命令提示符中运行:
java -jar <文件名>
原则上这么打开一次后就无需再通过命令行进行启动。
启动后进行配置:点击Config(配置),Class Mode(类模式)选择Table,Language(语言)选择zh-cn,重启软件应用更改。
将需要修改的模组jar包拖入窗口即可读取模组内容进行反编译。
示例1:修复龙梅茶被错误判断为桶的问题
末地重生添加了一种叫龙梅茶的饮品,由于作者错误地为其添加了桶的方法,导致热力等模组将其识别为桶,并能向其中灌装液体将其变为流体桶。
将末地重生的模组文件jar包直接拖入recaf左侧框体中,待读取完毕后找到龙梅茶物品的注册文件,路径为endreborn/mod/items/ItemDragoniteTea,双击打开。
通过github上的源码得知需要删除的方法是倒数第三个,如不确定可以右击>编辑汇编代码查看是否有相似字段。
右键方法,点击移除即可。
使用ctrl+s进行保存,点击文件>导出程序导出到任意一个位置,注意不要覆盖原模组文件。
找到修改后的模组,使用解压软件打开,寻找修改过的文件。
在bansoukou文件夹中新建一个与模组jar包同名的文件夹(注意不需要.jar后缀),新建文件夹至对应路径,放入这个修改过的class文件。
如果操作无误,下次启动游戏时龙梅茶关于流体灌装的配方应该就没有了。如果修改有误,记得在再次更改后启动游戏前将mods文件夹下对应模组的文件改回来,具体操作为删除带有patched后缀的文件,并将disabled后缀改为jar。
示例2:修改Tetra工作台的名称及防止锤子升级工作台(需要mcp混淆与反混淆)
这是两个小问题,Tetra的工作台使用了和原版工作台相同的翻译键,锤子右键原版工作台会将其变为tetra工作台。两个工作台有着极大的不同,如在魔改中需要对其作出区分,可以通过反编译方式修改。同样将tetra的模组jar包拖入recaf左侧框体。该工作台路径为se/mickelus/tetra/blocks/workbench/BlockWorkbench,双击打开。通过github源码得知本地化键名在第一个方法中定义,右键选择编辑汇编代码。
可以看到有些类名被混淆了,这时需要对代码进行反混淆来搞清楚需要修改哪些地方。
回到主界面,选择Mappings>Apply map file>SRG,建议搭建一个1.12.2forge模组开发工作区来获取混淆与反混淆表,在C:\Users\<用户名>\.gradle\caches\minecraft\de\oceanlabs\mcp\mcp_snapshot\20171003\1.12.2\srgs路径下找(也可以通过everything寻找srg-mcp.srg)。选择srg-mcp.srg。
再次编辑汇编代码,此时可以看到代码已经被反混淆了。我们只需要对其物品名做出修改,所以只需要修改setUnlocalizedName方法上的"workbench"里面的内容,随意改成其他内容即可,注意不要占用其他翻译键。关闭这个窗口前也要进行ctrl+s保存。
还需要禁用锤子升级工作台的功能,对第二个方法进行修改。
找到方块判断的部分(此处不进行反混淆完全看不出来),将其修改为其他方块即可。
具体方块名可以在1.12.2forge工作区中的外部库/forgeSrc-1.12.2-<forge版本>.jar/net/minecraft/init/Blocks.java中找到。
此处将工作台改为了原木(LOG),但是实际测试中使用锤子右击原木并不会生效。但是管他呢,反正禁用锤子升级工作台的目的达到了。
修改完成后一定要进行再混淆,否则会导致游戏找不到方法导致崩溃,具体方式和进行反混淆相同,不过这回需要选择的是mcp-srg.srg。保存,导出,将修改后的文件放入创可贴对应的文件夹下。如果修改无误,tetra工作台将会使用独立的翻译键,锤子右键工作台也不会将其更改为tetra工作台而是打开合成界面。