【问题标题】:Remap Java calls in JavaScript Nashorn在 JavaScript Nashorn 中重新映射 Java 调用
【发布时间】:2025-12-01 02:40:01
【问题描述】:

我目前正在尝试使用Nashorn 为“我的世界”游戏提供 JavaScript 支持。我的目标是让用户能够创建自己的命令和功能。 到目前为止,它大部分工作正常,但问题是 Minecraft 的代码在与Forge 一起使用时被混淆了。

因此,所有字段和方法调用都必须重新映射到它们对应的srg names

示例:mc.thePlayer.swingItem();mc.field_71439_g.func_71038_i();

我可以使用Mixin 将代码注入到 Nashorn 库中,并且我已经为 srg 文件制作了解析器。简而言之,我需要的是在实际执行代码之前,我可以使用将thePlayer 替换为field_71439_gswingItem()V 替换为func_71038_i()V 的方法。

我已经尝试了几个小时找到合适的方法。

https://github.com/CCBlueX/LiquidBounce1.8-Issues/issues/2649

【问题讨论】:

    标签: javascript java minecraft nashorn minecraft-forge


    【解决方案1】:

    你需要 MCPbot

    或者更确切地说,它的映射导出。

    请注意,MCPbot,顾名思义,是一个 bot。 特别是 IRC 频道上的一个,以便模组开发人员可以去“嘿,我知道 func_12345_a 做了什么”并告诉该机器人,给它一个人类可读的名称、命名参数和 javadoc,Forge 的下一个版本将包含这些更新的映射供模组制作者使用。

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

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

    不过,我会指出,在您的模组中包含这些映射可能会侵犯版权,您应该在以这种方式使用它们之前咨询 Mobius 教授。

    【讨论】:

    • 感谢您的回答,但这不是问题所在。我已经有srg了。我只需要将 JavaScript 中的字段和方法从 thePlayer 替换为 field_71439_g。以便脚本可以与“混淆”的 Minecraft 一起使用。
    • 您的问题是:“翻译是什么”或“如何替换字符串?”
    • 不,我的问题是我需要重新映射所有字段和方法调用JavaScript。 JavaScript 文件将被编译为字节码。方法和字段调用将被转换为调用引导方法的 InvokeDynamic 节点。问题是我需要找到一种方法来重新映射它们。我需要字段或方法的目标类)和名称字段或方法名称)。 .. 这足以重新映射它们...
    • 因此,您在 MCPbot 导出中查找名称并进行字符串替换。我不确定是什么问题。
    【解决方案2】:

    解决方案

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

    【讨论】: