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 启用时:
- Angelica 让
renderGameOverlay整体早退 → Xaeros 钩子不再被触发; - 但 Xaeros transformer 本身仍在运行(每帧扫描字节码);
- 由于 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。
相关条目
- MixinEntityRenderer_Xaeros - Tweaker 移除钩子后由它补回
- ModStatus -
TargetedMod.XAEROS_MINIMAP.modId定义 - PatchesConfig -
patchXaerosMinimap开关 - AngelicaCompatCore - 兄弟启动期入口