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

时间:2013-09-02 20:29:35

标签: java minecraft minecraft-forge

我正在尝试向Minecraft源文件中添加一个方法,但是我必须弄清楚如何在不实际编辑源文件的情况下执行此操作,因为重新分发源文件是非法的,这些文件必须包含在mod中我正在创造。我需要将方法setInPortalZub()添加到位于net.minecraft.entity.player的文件“EntityPlayer。我正在使用MCP / Minecraft Forge API。我尝试创建EntityPlayer的实例,但是我我不确定这是怎么回事。

1 个答案:

答案 0 :(得分:7)

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

这是通过利用Object Web发布的ASM字节码操作框架来实现的。这个框架允许你编写可以在加载时读取和操作类的字节码的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和“生产”中处理执行。这就是为什么有两个HashMap s;一个用于MCP执行,另一个用于混淆执行。每个加载的类首先被传递到transform()方法。代码检查它是否是我们想要转换的类,如果它是转换它。

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


提示:

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

我希望有所帮助!

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