AngelicaRfbPlugin(RetroFuturaBootstrap 路径)

基本信息

属性 值
类 com.gtnewhorizons.angelica.loading.rfb.AngelicaRfbPlugin
路径 src/main/java/com/gtnewhorizons/angelica/loading/rfb/AngelicaRfbPlugin.java
行数 36
实现接口 com.gtnewhorizons.retrofuturabootstrap.api.RfbPlugin
声明入口 src/main/resources/META-INF/rfb-plugin

loading/rfb/ 目录共 4 个文件(1 个插件 + 3 个 transformer)。

这是 Angelica 的第二条类加载路径

Angelica 同时兼容两套 GTNH 类加载引导:

路径 引导器 插件/类
RFB(RetroFuturaBootstrap) RfbPlugin SPI 本类
经典 LaunchWrapper IFMLLoadingPlugin AngelicaTweaker / AngelicaClientTweaker

RFB 是否启用由黑板标志决定,两条路径互相探测:

// AngelicaRfbPlugin.onConstruction, :18
Launch.blackboard.put("angelica.rfbPluginLoaded", Boolean.TRUE);
// AngelicaClientTweaker.getASMTransformerClass, :122
final boolean rfbLoaded = Launch.blackboard.getOrDefault("angelica.rfbPluginLoaded", Boolean.FALSE) == Boolean.TRUE;

即:RFB 插件先构造并写标志,LaunchWrapper 路径读到 TRUE 就让位;反之若读到 FALSE(RFB 未安装),LaunchWrapper 路径全权负责。

onConstruction(:16-20)

行 动作
:18 Launch.blackboard.put("angelica.rfbPluginLoaded", Boolean.TRUE)
:19 Launch.classLoader.addClassLoaderExclusion("com.gtnewhorizons.angelica.glsm.redirect.")

第二条把 GL 重定向包整体排除在 classloader 之外 —— 源码里的转发器依赖类加载器特判,加载它会破坏转发逻辑。

makeTransformers(:22-35):两道前置判定

final boolean isServer = (null == RetroFuturaBootstrap.API.launchClassLoader()
    .findClassMetadata("net.minecraft.client.main.Main"));
if (isServer) {
    return null;
}

final boolean isObf = RetroFuturaBootstrap.API.launchClassLoader()
    .findClassMetadata("net.minecraft.world.World") == null;
return new RfbClassTransformer[] {
    new RFBAngelicaRedirector(),
    new RFBCeleritasBlockTransformer(isObf),
    new RFBIsbrhTessellatorAbuseTransformer(isObf)
};
判定 依据 结果
isServer(:24-27) 找不到 net.minecraft.client.main.Main 的类元数据 服务端 → 返回 null,不装任何 transformer
isObf(:29) 找不到 net.minecraft.world.World 的类元数据 混淆环境 → 作为构造参数传给后两个 transformer

客户端返回 3 个 transformer:

# 类 行数 共享实现
1 RFBAngelicaRedirector 11 shared/transformers/AngelicaRedirector(13 行)
2 RFBCeleritasBlockTransformer 100 shared/transformers/CeleritasBlockTransform(172 行)
3 RFBIsbrhTessellatorAbuseTransformer 67 shared/transformers/IsbrhTessellatorAbuseTransform(73 行)

三者都是薄包装:真正的字节码变换逻辑放在 loading/shared/transformers/,由 FML 侧与 RFB 侧共享。这是本 mod 内唯一被两条路径真正复用的代码。

与 LaunchWrapper 路径的 transformer 差集

对比 FML Transformers 的 5 个类:

FML 侧 RFB 侧 说明
AngelicaRedirectorTransformer RFBAngelicaRedirector 一一对应
CeleritasBlockTransformer RFBCeleritasBlockTransformer 一一对应
IsbrhTessellatorAbuseTransformer RFBIsbrhTessellatorAbuseTransformer 一一对应
EarlyRedirectorTransformer 无 仅 FML 侧;且会被 Late Tweakers 在运行期移除
GenericCompatTransformer 无 仅 FML 侧;第三方 mod 兼容的 ASM 路径
— — compat/transformers/ 下的 6 个兼容 transformer 全部只在 FML 侧

重要推论:RFB 路径不提供第三方 mod 的 ASM 兼容 transformer。CompatHandlers 驱动的 5 项兼容补丁(含 Thaumcraft / ThaumicHorizons 的 HUDCaching 早退、Extra Utilities 的 @ThreadSafeISBRH)只经由 AngelicaClientTweaker.getASMTransformerClass() 注册。装了 RFB 就拿不到这些补丁。

同时 TileEntityMarkerTransform(137 行)位于 shared/ 且没有 FML 侧对应类 —— 它只被 RFB 侧的 RFBCeleritasBlockTransformer 使用。

相关条目