RFBIsbrhTessellatorAbuseTransformer
基本信息
| 属性 | 值 |
|---|---|
| 类 | com.gtnewhorizons.angelica.loading.rfb.transformers.RFBIsbrhTessellatorAbuseTransformer |
| 路径 | src/main/java/com/gtnewhorizons/angelica/loading/rfb/transformers/RFBIsbrhTessellatorAbuseTransformer.java |
| 行数 | 67 |
| 类型 | public class ... implements RfbClassTransformer(:16) |
id() |
"isbrh-tessellator-abuse"(:28-30) |
| Javadoc | :15「RfbClassTransformer wrapper for IsbrhTessellatorAbuseTransform」 |
它是什么
3 个 RFB transformer 里最简单的:两个字段 + 4 个接口方法,没有跟踪/排除/多步编排。与 FML 侧 IsbrhTessellatorAbuseTransformer(31 行)驱动同一个 IsbrhTessellatorAbuseTransform(73 行)。
字段与构造(:18-24)
private final IsbrhTessellatorAbuseTransform inner;
private final boolean isObf; // :19 存字段
public RFBIsbrhTessellatorAbuseTransformer(boolean isObf) {
this.inner = new IsbrhTessellatorAbuseTransform();
this.isObf = isObf;
}
与 FML 侧的关键结构差异:RFB 侧把 isObf 存为字段,FML 侧每次 transform 现问 AngelicaClientTweaker.isObfEnv()(:23)。原因是 RFB 的 shouldTransformClass / transformClassIfNeeded 之间没有可靠的 injectData 时序,静态标志可能尚未就绪——必须在构造期(plugin 阶段)就把值固定下来。
排序声明(:32-40)
与 RFBCeleritasBlockTransformer :34-42 完全相同:
| 方法 | 返回 |
|---|---|
sortAfter() |
{"*", "mixin:mixin"} |
sortBefore() |
{"lwjgl3ify:redirect"} |
预筛选方式与 FML 侧本质不同(:42-49)
if (!classNode.isPresent()) return false;
final ClassHeaderMetadata metadata = classNode.getOriginalMetadata();
return metadata != null && metadata.binaryInterfaceNames.contains(IsbrhTessellatorAbuseTransform.ISBRH);
| RFB 侧 | FML 侧 | |
|---|---|---|
| 手段 | 类头元数据的 binaryInterfaceNames 直接读接口表 |
ClassConstantPoolParser.find() 扫常量池 |
| 常量池扫描 | 无 | 有 |
null 处理 |
两级判空(:46-47) |
无判空(见 FML 侧条目) |
RFB 侧更精确(读的是解析后的接口名表,不是常量池里的字符串引用),也更便宜。
transformClassIfNeeded(:51-60)
单步:inner.transformClassNode(classNode.getNode(), this.isObf) → 变更时 classNode.computeMaxs() + dumpRFBClass。transformClass(:62-66)无条件转发。
已知问题
- 预筛选与实际变换的判据不完全一致:
shouldTransformClass只检查「是否实现ISimpleBlockRenderingHandler」,而IsbrhTessellatorAbuseTransform.transformClassNode还要在方法表里找renderWorldBlock+ 精确描述符(见该类:26-33)。即大量被 RFB 询问的类最终不会被变换,白付一次transformClassIfNeeded调用。这与 FML 侧的shouldTransform/transformClassNode二次早退是同一种冗余。 binaryInterfaceNames语义未文档化:字段名暗示是「二进制接口名列表」,但 RFB API 未在仓库内。若它返回的是直接接口而非传递接口(不包含父类实现的接口),则继承了ISimpleBlockRenderingHandler的间接子类会被漏掉。这是本类最值得警惕的一处。- 无 Javadoc 说明与 FML 侧的对应关系(只有
@see级别的 1 行),排序约束也未注释。 - RFB 路径不提供
GenericCompatTransformer—— 本 transformer 与 RFBCeleritasBlockTransformer 是 RFB 路径仅有能力,代价是全部第三方 mod 兼容补丁缺席。
相关条目
- IsbrhTessellatorAbuseTransform - 73 行核心逻辑
- IsbrhTessellatorAbuseTransformer - FML 侧对应类
- AngelicaRfbPlugin - 构造点与
isObf来源 - RFBCeleritasBlockTransformer - 排序声明完全相同的孪生类
- FML Transformers - 两条路径的差集分析