MixinCompatHackTweaker

基本信息

属性 值
类名 com.gtnewhorizons.angelicacompat.loading.MixinCompatHackTweaker
实现接口 net.minecraft.launchwrapper.ITweaker
触发时点 LaunchWrapper 在 JVM 启动早期(甚至早于 AngelicaCompatCore 初始化)
触发条件 AngelicaConfig.enableHudCaching == true && PatchesConfig.patchXaerosMinimap == true
注册方式 manifest(META-INF/MANIFEST.MF 内 TweakClass/Tweakers 字段),无参数列表依赖

功能

Xaeros Minimap 通过 xaero.common.core.transformer.GuiIngameForgeTransformer(一个 LaunchWrapper IClassTransformer)在 GuiIngame.renderGameOverlay 调用前插入 XaeroMinimapCore.beforeIngameGuiRender(partialTicks) 钩子。在 Angelica 的 HUDCaching 启用时:

  1. Angelica 让 renderGameOverlay 整体早退 → Xaeros 钩子不再被触发;
  2. 但 Xaeros transformer 本身仍在运行(每帧扫描字节码);
  3. 由于 Xaeros transformer 在原版 Forge 中插入的钩子代码与 Angelica HUDCaching 接管逻辑会重复写入 HUD,还会引起 minimap 双绘制 / 闪烁。

本 Tweaker 通过反射移除 Xaeros 的 transformer:

@Override
public void acceptOptions(List<String> args, File gameDir, File assetsDir, File profile) {
    if (AngelicaConfig.enableHudCaching && PatchesConfig.patchXaerosMinimap) {
        disableXaerosMinimapWaypointTransformer();
    }
}

private void disableXaerosMinimapWaypointTransformer() {
    try {
        LaunchClassLoader lcl = Launch.classLoader;
        Field xformersField = lcl.getClass().getDeclaredField("transformers");
        xformersField.setAccessible(true);
        @SuppressWarnings("unchecked")
        List<IClassTransformer> xformers = (List<IClassTransformer>) xformersField.get(lcl);
        for (int idx = xformers.size() - 1; idx >= 0; idx--) {
            final String name = xformers.get(idx).getClass().getName();
            if (name.startsWith("xaero.common.core.transformer.GuiIngameForgeTransformer")) {
                Common.log.info("Removing transformer " + name);
                xformers.remove(idx);
            }
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

反向遍历(从尾到头)避免 ConcurrentModificationException,删除所有以 xaero.common.core.transformer.GuiIngameForgeTransformer 开头的 transformer(Xaeros 可能在不同版本下用不同子类)。

由于钩子被移除,MixinEntityRenderer_Xaeros 必须在 EntityRenderer.updateCameraAndRender 中补回 XaeroMinimapCore.beforeIngameGuiRender(partialTicks) 调用——这就是 early Mixin 的存在意义。

第三方 mod 集成

依赖 包 用途
xaero.common.core.transformer.GuiIngameForgeTransformer xaero.common.core 被反射移除的 transformer
net.minecraft.launchwrapper.Launch LaunchWrapper Launch.classLoader

限制

  • 仅在 enableHudCaching 与 patchXaerosMinimap 同时启用时才执行;任一开关为 false 时 Xaeros transformer 保留,HUDCaching 不接管 → 无需补偿 Mixin 也会跳过。
  • 反射访问私有字段 LaunchClassLoader.transformers;LaunchWrapper 升级后字段名变更会让本类运行时崩溃。
  • 若 Xaeros 升级后 transformer 类名改为不以 xaero.common.core.transformer.GuiIngameForgeTransformer 开头的形式,本 Tweaker 静默失效。

第三方 mod 集成

仅 Xaeros Minimap。

相关条目