MixinPlatformAgentTransformer

基本信息

属性 值
类 com.mitchej123.jarjar.rfb.transformer.MixinPlatformAgentTransformer
Transformer ID jarjar-mixinplatformmanager-transformer
目标类 org.spongepowered.asm.launch.platform.MixinPlatformAgentFMLLegacy
改写方法 initFMLCoreMod

MixinPlatformAgentFMLLegacy 是 SpongePowered Mixin 为 1.7.10 FML 写的兼容 adapter,原版逻辑是解析 FML 的 Coremod manifest 并调 Class.forName(coremod, ...).initFMLCoreMod(...)。JarJar 自己接管了 coremod/mods 加载,所以让该方法直接返回 null,让 Mixin 不再单独维护一份 Coremod 列表。

shouldTransformClass

private static final String[] CLASS_CONSTANTS = new String[] { MIXIN_PLATFORM_AGENT };
private static final ClassConstantPoolParser cstPoolParser = new ClassConstantPoolParser(CLASS_CONSTANTS);

public boolean shouldTransformClass(...) {
    return cstPoolParser.find(classNode.getOriginalBytes(), false);
}

transformClass

public void transformClass(loader, context, manifest, className, classNode) {
    final ClassNode cn = classNode.getNode();
    if (cn == null || cn.methods == null) return;
    for (final MethodNode mn : cn.methods) {
        if (mn.instructions == null || mn.instructions.size() == 0) continue;
        if (mn.name.equals("initFMLCoreMod")) {
            mn.tryCatchBlocks.clear();
            mn.instructions.clear();
            mn.instructions.add(new InsnNode(Opcodes.ACONST_NULL));
            mn.instructions.add(new InsnNode(Opcodes.ARETURN));
        }
    }
}

把 initFMLCoreMod 方法体清空,插入 return null。tryCatchBlocks 也清空避免悬空跳转。

启动效果

  • Mixin 内部维持一份 rootPlugins / mixinConfig 注册容器;JarJar 在 CoreModManagerV2.loadTweakersAndCoreMods 通过 injectMixinAndTweaker(modFile, classLoader, mcDir, FMLInjectionData.mccversion) 自己注入 MixinTweaker 和 ContainerHandleURI:
if ("org.spongepowered.asm.launch.MixinTweaker".equals(candidate.getTweaker())) {
    IContainerHandle handler = (IContainerHandle)injectMixinAndTweaker(modFile, classLoader, mcDir, FMLInjectionData.mccversion);
    if (handler != null) mixinHandlers.add(handler);
}
  • 所以 Mixin 不需要 FMLLegacy 兼容层的二次注入;禁用 initFMLCoreMod 避免重复把同一 jar 注入 Mixin 容器

相关条目