IsbrhTessellatorAbuseTransformer
基本信息
| 属性 | 值 |
|---|---|
| 类 | com.gtnewhorizons.angelica.loading.fml.transformers.IsbrhTessellatorAbuseTransformer |
| 路径 | src/main/java/com/gtnewhorizons/angelica/loading/fml/transformers/IsbrhTessellatorAbuseTransformer.java |
| 行数 | 31 |
| 类型 | public class ... implements IClassTransformer(:12),Javadoc :11 |
| 内部实现 | IsbrhTessellatorAbuseTransform(73 行,shared/) |
它是什么
3 个共享变换逻辑的 FML 侧包装里最独立的一个:只用一个内部对象,没有排除列表,没有多步编排。
// :14
private final IsbrhTessellatorAbuseTransform inner = new IsbrhTessellatorAbuseTransform();
注意它不接受 isObf 参数(对比 CeleritasBlockTransformer :21),而是在 transform 里现问 AngelicaClientTweaker.isObfEnv()(:23)。
挂在哪个阶段
唯一被 getASMTransformerClass() 无条件按类名追加的 transformer(有 RFB 条件),见 AngelicaClientTweaker :123-125:
if (!rfbLoaded) {
transformers.add("com.gtnewhorizons.angelica.loading.fml.transformers.IsbrhTessellatorAbuseTransformer");
}
即:RFB 加载时不注册(改由 RFBIsbrhTessellatorAbuseTransformer 承担),且不受任何 CompatConfig / AngelicaConfig 开关控制。
transform 的 3 个早退(:16-30)
| 行 | 条件 | 行为 |
|---|---|---|
:18 |
!inner.shouldTransform(basicClass) |
返回 basicClass |
:23 |
!inner.transformClassNode(cn, isObf) |
返回 basicClass |
:25 |
变更成功 | ClassWriter(COMPUTE_MAXS) 写出 + dump |
与其他 transformer 的差异:本类不检查 basicClass == null(:17 直接传给 shouldTransform),而 CeleritasBlockTransformer :32 与两个 specific/ transformer :32/:44 都显式判空。这依赖 ClassConstantPoolParser.find() 对 null 的容忍度。
预筛选机制
shouldTransform 走 IsbrhTessellatorAbuseTransform 的常量池解析器,匹配常量 ISBRH = "cpw/mods/fml/client/registry/ISimpleBlockRenderingHandler"(:15)。只处理实现了 ISimpleBlockRenderingHandler 的类——这是本 transformer 的作用范围界定,也是 RFB 侧用 metadata.binaryInterfaceNames.contains(...) 做同一判断的原因。
已知问题
basicClass未判空(:17):ClassConstantPoolParser.find(null)的行为依赖 gtnhlib 实现。三个同目录 transformer 都判空,本类不判,属于不一致而非必然崩溃。ClassWriter(COMPUTE_MAXS)(:25):IsbrhTessellatorAbuseTransform会在draw()前后插入POP与ICONST_*(见该类:48起的popOp逻辑),可能改变栈深度。只重算 maxs 依赖这些插入的净栈效应为 0——源码未加断言。- 无排除前缀:不像 CeleritasBlockTransformer 有
exclusions早退,本类对每个 ISBRH 实现类都进ClassReader。这是预筛选常量池扫描的成本。 - 注册路径的 RFB 分叉写在调用方(
AngelicaClientTweaker:123),本类自身不含任何 RFB 感知——与 RFBCeleritasBlockTransformer 那样显式实现RfbClassTransformer的风格相反。
相关条目
- IsbrhTessellatorAbuseTransform - 73 行核心逻辑
- RFBIsbrhTessellatorAbuseTransformer - RFB 侧对应类
- AngelicaClientTweaker - 唯一无条件注册点(
:123-125) - AngelicaClassDump -
:28的落盘调用 - FML Transformers - 5 个 FML 侧 transformer 的总览