在 JavaScript Nashorn 中重新映射 Java 个调用

Remap Java calls in JavaScript Nashorn

我目前正在尝试 JavaScript 使用 Nashorn 支持游戏 "Minecraft"。我的目标是让用户能够创建自己的命令和功能。 在大多数情况下,到目前为止它工作正常,但问题是当与 Forge.

一起使用时,Minecraft 的代码被混淆了

因此,所有字段和方法调用都必须与其相应的 srg names.

重新映射

示例: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,顾名思义,是一个 bot。 特别是 IRC 频道上的一个,这样 mod 开发人员可以说“嘿,我想通了func_12345_a 做”并告诉机器人,给它一个人类可读的名称、命名参数和 javadoc,Forge 的下一个版本将包含这些更新的映射供 mod 用户使用。

(“MCP”部分代表“Minecraft Coder Pack”。)

您可以找到 SRG 名称映射的导出 on the MCPbot website,您需要其中的两个 csv 文件:字段和方法(因为它们是单独导出的)。

不过,我会注意到,在您的 mod 中包含这些映射可能会侵犯版权,您应该在以这种方式使用它们之前咨询莫比乌斯教授。

解决方案

只需注入 "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