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。

已知问题

  1. 排序索引缺陷的受害者:正因为 AngelicaTweaker 同时实现 IFMLLoadingPlugin 与 IEarlyMixinLoader,本类无法通过正常 API 指定排序位置,只能靠 AngelicaLateTweaker 在运行期反射改 LaunchClassLoader.transformers。这是一个结构性 workaround,不是配置。
  2. 无 Javadoc、无注释:15 行的类没有任何说明,不读 FML Transformers 的对照图无法知道它对应 RFB 侧的哪个类。
  3. 无 dump:transform 把控制权完全交给 ModRedirector,不调用 AngelicaClassDump(对比 CeleritasBlockTransformer :56)。ModRedirector 内部是否 dump 需看 glsm 子项目。

相关条目