加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何在不编辑源文件的情况下将方法添加到源文件?

发布时间:2020-12-15 04:13:14 所属栏目:Java 来源:网络整理
导读:我正在尝试向Minecraft源文件添加一个方法,但我必须弄清楚如何在不实际编辑源文件的情况下进行,因为重新分发源文件是非法的,这些源文件必须包含在我正在创建的mod中.我需要将方法setInPortalZub()添加到位于net.minecraft.entity.player中的文件“EntityPlay
我正在尝试向Minecraft源文件添加一个方法,但我必须弄清楚如何在不实际编辑源文件的情况下进行,因为重新分发源文件是非法的,这些源文件必须包含在我正在创建的mod中.我需要将方法setInPortalZub()添加到位于net.minecraft.entity.player中的文件“EntityPlayer.我正在使用MCP / Minecraft Forge API.我尝试创建EntityPlayer的实例,但我不确定怎么会这样.

解决方法

你即将进入coremods奇妙而令人沮丧的世界! FML中的Coremod(Forge ModLoader)是将任意代码注入vanilla Minecraft类的“最简单”方法,而不必分发这些类文件的修改版本.

这是通过利用Object Web发布的ASM Bytecode操作框架来实现的.此框架允许您编写可在加载时读取和操作类的字节码的Java代码.

我不可能解释你必须采取的每一步来完成这一壮举,所以我会发布链接到我自己的coremod注入类,并试图解释每一个.

Here is the CorePlugin class.

CorePlugin类告诉Forge ModLoader在哪里找到执行代码注入的转换器类.

FML根据您的.jar文件清单找到此类:

Manifest-Version: 1.0
FMLCorePlugin: bspkrs.treecapitator.fml.asm.TreeCapitatorCorePlugin
FMLCorePluginContainsFMLMod: bspkrs.treecapitator.fml.TreeCapitatorMod
Created-By: 1.7.0 (Oracle Corporation)

FMLCorePlugin指定CorePlugin类的完全限定路径.如果你的.jar文件要包含一个常规的@Mod样式Forge ModLoader mod类,你还需要指定FMLCorePluginContainsFMLMod(尽管期望的值是未知的;我认为它实际上并不重要你为那里的值,但关键必须在那里).

现在为有趣的部分……实际的字节码转换器. Here is a link to the transformer for Treecapitator

在没有详细介绍的情况下,我编写了这个类,以便能够在Eclipse和“生产”中处理执行.这就是为什么有两个HashMaps;一个用于MCP执行,另一个用于混淆执行.每个加载的类首先传递给transform()方法.代码检查它是否是我们想要转换的类,如果是,则转换它.

实现所有这一切的最终结果是,无论何时创建ItemInWorldManager的实例,变换器都会运行,并将一行添加到removeBlock()方法中的特定位置.这一行作为一个廉价的块中断钩子,允许代码在玩家打破一个块时执行.

提示:

>获取Eclipse的ByteCode Outline插件.您可以在Object Web网站上找到它.
>有时,Eclipse / MCP中的类结构与混淆环境中的类结构不同
>这些都不是简单易懂的概念.使用Bytecode Outline插件查看要转换的类,无论是否包含要包含的代码.这应该可以帮助您找出要查找的“标记”以及您需要插入的ASM节点.

我希望有所帮助!

编辑:修复损坏的链接以引用仍包含类的旧分支.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读