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 非空时追加一次。
相关条目
- AngelicaClientTweaker - 全部注册逻辑
- CompatHandlers -
GenericCompatTransformer的唯一追加者 - AngelicaRfbPlugin - RFB 侧的 3 个 RFB 包装类
- NotFine AsmTransformers - 另一套独立的 2 项枚举
- CompatConfig - 决定哪些 transformer 被追加
- AngelicaCompat - 下游兼容包,含同名逻辑的独立实现