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 容器
相关条目
- RFB 插件入口 - 注册该 transformer
- CoreModManagerV2 - 自己注入 Mixin 容器
- FMLTransformer - 兄弟 transformer