AngelicaRedirectorTransformer
基本信息
| 属性 | 值 |
|---|---|
| 类 | com.gtnewhorizons.angelica.loading.fml.transformers.AngelicaRedirectorTransformer |
| 路径 | src/main/java/com/gtnewhorizons/angelica/loading/fml/transformers/AngelicaRedirectorTransformer.java |
| 行数 | 15 |
| 类型 | public class ... implements IClassTransformer(:7) |
| 内部实现 | ModRedirector(glsm 子项目) |
它是什么
3 个「redirector 类」中最薄的包装。整个类体只有一个字段 + 一个方法:
// :9
private final ModRedirector inner = AngelicaRedirector.create();
// :12-14
public byte[] transform(final String className, String transformedName, byte[] basicClass) {
return inner.transform(transformedName, basicClass, this);
}
注意它忽略 className,只传 transformedName。
挂在哪个阶段
LaunchWrapper 类加载期,且不是通过 getASMTransformerClass() 正常注册的。注册路径是 AngelicaClientTweaker.injectData 把类名追加到 Mixin 的 tweak 列表(黑板 key mixin.tweakClasses),理由见该文件 :164-165 注释:
If we were to register them normally in getASMTransformerClass(), they would be sorted at index 0 which we do not want.
这正是 AngelicaTweaker :15-21 注释所描述缺陷的直接后果:同一实现两个接口导致排序索引失效,被迫用非常规路径绕开。
实际注册动作在 AngelicaLateTweaker.getLaunchArguments :55-71:先移除 EarlyRedirectorTransformer,再 Launch.classLoader.registerTransformer("...AngelicaRedirectorTransformer")。RFB 加载时这个 late tweaker 不追加,改由 RFBAngelicaRedirector 承担。
它改写什么
真正的逻辑在 glsm 子项目的 ModRedirector,输入是字符串 com.gtnewhorizons.angelica.transform(见 shared/AngelicaRedirector :8)。职责是:把所有第三方 mod 的 GL 调用重定向到 com.gtnewhorizons.angelica.glsm.GLStateManager,以支持状态跟踪与 core profile 兼容。
配套的 classloader 排除项由 CeleritasBlockTransform.getTransformerExclusions() 提供(见 CeleritasBlockTransform :94-101),其中就包含 com.gtnewhorizons.angelica.transform。
已知问题
- 排序索引缺陷的受害者:正因为 AngelicaTweaker 同时实现
IFMLLoadingPlugin与IEarlyMixinLoader,本类无法通过正常 API 指定排序位置,只能靠 AngelicaLateTweaker 在运行期反射改LaunchClassLoader.transformers。这是一个结构性 workaround,不是配置。 - 无 Javadoc、无注释:15 行的类没有任何说明,不读 FML Transformers 的对照图无法知道它对应 RFB 侧的哪个类。
- 无 dump:
transform把控制权完全交给ModRedirector,不调用 AngelicaClassDump(对比 CeleritasBlockTransformer:56)。ModRedirector内部是否 dump 需看 glsm 子项目。
相关条目
- shared/AngelicaRedirector - 13 行工厂,被本类与 RFB 侧共用
- RFBAngelicaRedirector - RFB 路径的对应包装
- AngelicaClientTweaker - 排序索引绕行方案的发起方
- AngelicaLateTweaker - 实际执行注册与替换的地方
- EarlyRedirectorTransformer - 被本类替换掉的临时版本
- FML Transformers - 5 个 FML 侧 transformer 的总览