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 使用。
相关条目
- AngelicaTweaker - LaunchWrapper 侧入口,含侧别分叉
- AngelicaClientTweaker - 读
angelica.rfbPluginLoaded黑板标志 - FML Transformers - 另一侧的 5 个 transformer 与
shared/映射关系 - Late Tweakers - RFB 未加载时才追加的两个 late ITweaker