在 JavaScript Nashorn 中重新映射 Java 调用



我目前正在尝试使用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

最新更新