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)无条件转发。

已知问题

  1. 预筛选与实际变换的判据不完全一致:shouldTransformClass 只检查「是否实现 ISimpleBlockRenderingHandler」,而 IsbrhTessellatorAbuseTransform.transformClassNode 还要在方法表里找 renderWorldBlock + 精确描述符(见该类 :26-33)。即大量被 RFB 询问的类最终不会被变换,白付一次 transformClassIfNeeded 调用。这与 FML 侧的 shouldTransform/transformClassNode 二次早退是同一种冗余。
  2. binaryInterfaceNames 语义未文档化:字段名暗示是「二进制接口名列表」,但 RFB API 未在仓库内。若它返回的是直接接口而非传递接口(不包含父类实现的接口),则继承了 ISimpleBlockRenderingHandler 的间接子类会被漏掉。这是本类最值得警惕的一处。
  3. 无 Javadoc 说明与 FML 侧的对应关系(只有 @see 级别的 1 行),排序约束也未注释。
  4. RFB 路径不提供 GenericCompatTransformer —— 本 transformer 与 RFBCeleritasBlockTransformer 是 RFB 路径仅有能力,代价是全部第三方 mod 兼容补丁缺席。

相关条目