FML Transformers(ASM transformer 实现类)

基本信息

loading/fml/transformers/ 目录共 5 个文件,全部实现 IClassTransformer:

类 路径 行数
AngelicaRedirectorTransformer loading/fml/transformers/AngelicaRedirectorTransformer.java 15
EarlyRedirectorTransformer loading/fml/transformers/EarlyRedirectorTransformer.java 27
IsbrhTessellatorAbuseTransformer loading/fml/transformers/IsbrhTessellatorAbuseTransformer.java 31
CeleritasBlockTransformer loading/fml/transformers/CeleritasBlockTransformer.java 62
GenericCompatTransformer loading/fml/transformers/GenericCompatTransformer.java 91

另有 6 个通用 transformer 在 loading/fml/compat/transformers/(4 个 generic/ + 2 个 specific/),见下。

两套 transformer 体系

Angelica 的 transformer 分成两套,分属不同包、不同注册方式:

体系 位置 数量 注册方式
主 transformer loading/fml/transformers/ 5 AngelicaClientTweaker.getASMTransformerClass() 显式加类名
兼容 transformer loading/fml/compat/transformers/ 6 GenericCompatTransformer 内部按数据表分派

兼容 transformer(6 个)

类 子目录 行数 作用
FieldLevelTessellatorTransformer generic/ 88 注入局部 Tessellator,避免多 mod 共享全局实例
HUDCachingEarlyReturnTransformer generic/ 42 在 renderOverlay 顶部插入 HUDCaching.shouldReturnEarly()
ThreadSafeISBRHAnnotationTransformer generic/ 20 为 RenderBlocks 子类加/改 @ThreadSafeISBRH 注解
TileEntityNullGuardTransformer generic/ 94 在 IBlockAccess.getTileEntity(...) 结果上加 null 守卫
StacksOnStacksTransformer specific/ 166 Stacks on Stacks 特化
ImmersiveEngineeringTransformer specific/ 109 Immersive Engineering 特化

共享变换逻辑(loading/shared/transformers/)

loading/shared/ 下另有 4 个变换类,被 FML 与 RFB 两条路径共用:

类 行数
AngelicaRedirector 13
CeleritasBlockTransform 172
IsbrhTessellatorAbuseTransform 73
TileEntityMarkerTransform 137

命名规律可见两条路径的对应关系:FML 侧是 XxxTransformer(IClassTransformer 包装),RFB 侧是 RFBXxx(RfbClassTransformer 包装),真正的变换逻辑抽在 shared/transformers/XxxTransform。

FML 路径                              RFB 路径
────────────────────────────────     ─────────────────────────────
fml/transformers/AngelicaRedirectorTransformer
        │                                    │
        └── shared/transformers/AngelicaRedirector
                                     ├──►  rfb/transformers/RFBAngelicaRedirector
fml/transformers/CeleritasBlockTransformer
        │
        └── shared/transformers/CeleritasBlockTransform
                                     ├──►  rfb/transformers/RFBCeleritasBlockTransformer
fml/transformers/IsbrhTessellatorAbuseTransformer
        │
        └── shared/transformers/IsbrhTessellatorAbuseTransform
                                     ├──►  rfb/transformers/RFBIsbrhTessellatorAbuseTransformer

注意 TileEntityMarkerTransform 在 shared/ 中没有 FML 侧对应类,只有 RFB 侧的 RFBCeleritasBlockTransformer 会用到它。

唯一无条件注册的 transformer

IsbrhTessellatorAbuseTransformer 是三个来源中唯一被直接按类名追加的:

// AngelicaClientTweaker.java:123-125
if (!rfbLoaded) {
    transformers.add("com.gtnewhorizons.angelica.loading.fml.transformers.IsbrhTessellatorAbuseTransformer");
}

它有条件(RFB 未加载),但不受任何配置开关控制。另外几个(AngelicaRedirectorTransformer、CeleritasBlockTransformer、EarlyRedirectorTransformer、GenericCompatTransformer)分别由不同路径追加。

GenericCompatTransformer 由 CompatHandlers.getTransformers() 在 handler 非空时追加一次。

相关条目