StacksOnStacksTransformer

基本信息

属性 值
类名 com.gtnewhorizons.angelicacompat.asm.transformers.specific.StacksOnStacksTransformer
实现接口 net.minecraft.launchwrapper.IClassTransformer
启用条件 PatchesConfig.patchStacksOnStacks == true 且当前类在硬编码列表中
注册方式 StacksOnStacksCompatHandler.extraTransformers() 返回本类全限定名
启用版本 Minecraft 1.7.10(仅客户端)

功能

针对 Stacks on Stacks mod 的特定 transformer。它只作用于两个硬编码类:

类 处理
com.tierzero.stacksonstacks.client.render.RenderTilePile 将原本静态字段 ingotRender / gemRender / dustRender 改为实例字段,并在构造器中初始化实例
com.tierzero.stacksonstacks.util.ClientUtils 在 drawQuad / drawRectangularPrism 中注入局部 Tessellator 引用(与 FieldLevelTessellatorTransformer 相同思路)

transformRenderTilePile(ClassNode cn)

注入 PileRender 初始化器到 <init>:

public RenderTilePile() {
    super();
    this.ingotRender = new PileRender(...);  // 注入:在 super() 后插入构造
    this.gemRender = new PileRender(...);
    this.dustRender = new PileRender(...);
}

实现方式(injectPileRenderInitializer(MethodNode, type)):

  1. 找到方法中第一条 ALOAD 0(this)后,紧接其前的 INVOKESPECIAL java/lang/Object.<init> 后插入。
  2. 注入 3 个相同的 new PileRender(<constants>) 序列,并 PUTFIELD this.ingotRender/gemRender/dustRender。
  3. PileRender 构造参数从原静态初始化器的常量池中复制,避免重新读取静态字段。

staticRemovers = ImmutableList.of("ingotRender", "gemRender", "dustRender"):在 <clinit> 中删除对应的 PUTSTATIC(原先在类加载时初始化一次,导致多线程 ISBRT 路径下渲染污染)。

transformClientUtils(ClassNode cn)

在 drawQuad 和 drawRectangularPrism 方法内做字段级 Tessellator 改写,思路同 FieldLevelTessellatorTransformer。本 transformer 单独实现是因为它需要在 ClassWriter(0) 标志下重写(仅最大栈);不调用通用 transformer 是为了保证覆盖到泛型 transform 可能错过的边角情形(例如方法局部变量中已有同名 Lnet/minecraft/client/renderer/Tessellator; 字段)。

ClassWriter 标志

ClassWriter(0):手工控制最大栈(不自动 COMPUTE_MAXS),保证与原字节码布局兼容。

输出与调试

详见 AngelicaCompatCore — 当 AngelicaCompatCore.DUMP_CLASSES() 为 true 时写出改写前后字节码。

数值

数值 默认 含义
硬编码目标 2 个类 RenderTilePile + ClientUtils
staticRemovers ingotRender, gemRender, dustRender 删除 <clinit> 中对应的 PUTSTATIC
触发开关 PatchesConfig.patchStacksOnStacks 配置关闭则 StacksOnStacksCompatHandler 不装载 → 本 transformer 不装载

限制

  • 硬编码:仅作用于 Stacks on Stacks 的两个特定类;其它 mod 不复用。
  • PileRender 构造器参数常量被复制到注入字节码中,升级 SoS 后若改变这些常量本 transformer 可能崩溃。
  • 不修改 RenderTilePile.renderTileEntityAt(仍走同步路径),仅处理 renderWorldBlock 与静态字段初始化。

第三方 mod 集成

仅针对 com.tierzero.stacksonstacks (Stacks on Stacks) mod。

相关条目