[英]How do I add a method to a source file without editing the source file?
我正在尝试向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注入类,并试图解释每一个。
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
(虽然期望的值是未知的;我认为它实际上并不重要你为那里的值,但关键必须在那里)。
现在为有趣的部分......实际的字节码转换器。 这是Treecapitator变换器的链接
在没有详细介绍的情况下,我编写了这个类,以便能够在Eclipse和“生产”中处理执行。 这就是为什么有两个HashMap
; 一个用于MCP执行,另一个用于混淆执行。 每个加载的类首先传递给transform()
方法。 代码检查它是否是我们想要转换的类,如果是,则转换它。
实现所有这一切的最终结果是,无论何时创建ItemInWorldManager
的实例,变换器都会运行,并将一行添加到removeBlock()
方法中的特定位置。 这一行作为一个廉价的块中断钩子,允许代码在玩家打破一个块时执行。
提示:
我希望有所帮助!
编辑:修复损坏的链接以引用仍包含类的旧分支。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.