我目前正在尝试使用Nashorn为游戏"Minecraft"提供JavaScript支持。我的目标是让用户能够创建自己的命令和功能。 到目前为止,在大多数情况下,它运行良好,但问题是 Minecraft 的代码在与 Forge 一起使用时被混淆了。
因此,所有字段和方法调用都必须使用其相应的 srg 名称重新映射。
示例:mc.thePlayer.swingItem();
到mc.field_71439_g.func_71038_i();
我能够使用 Mixin 将代码注入 Nashorn 库,并且我已经为 srg 文件制作了一个解析器。简而言之,我需要的是我可以用来在实际执行代码之前用field_71439_g
替换thePlayer
或用func_71038_i()V
替换swingItem()V
的方法。
我已经尝试了几个小时寻找合适的方法。
https://github.com/CCBlueX/LiquidBounce1.8-Issues/issues/2649
你需要 MCPbot
或者更确切地说,它的映射导出。
请注意,MCPbot 顾名思义,是一个机器人。特别是一个在 IRC 频道上,这样 mod 开发人员就可以去"嘿,我想出了func_12345_a
做什么"并告诉机器人,给它一个人类可读的名称、命名参数和 javadoc,Forge 的下一个版本将包括这些更新的映射供修改者使用。
("MCP"部分代表"Minecraft Coder Pack"。
您可以在 MCPbot 网站上找到 SRG 名称映射的导出,您需要同时提供 csv 文件:字段和方法(因为它们是单独导出的(。
但是,我会指出,在您的模组中包含这些映射可能会侵犯版权,您应该在以这种方式使用它们之前咨询 Mobius 教授。
解决方案
只需注入到"jdk.internal.dynalink.beans.AbstractJavaLinker"的方法中
即可重映射方法:
addMember(Ljava/lang/String;Ljava/lang/reflect/AccessibleObject;Ljava/util/Map;)V
重映射字段:
addMember(Ljava/lang/String;Ljdk/internal/dynalink/beans/SingleDynamicMethod;Ljava/util/Map;)V
setPropertyGetter(Ljava/lang/String;Ljdk/internal/dynalink/beans/SingleDynamicMethod;Ljdk/internal/dynalink/beans/GuardedInvocationComponent$ValidationType;)V