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)):
- 找到方法中第一条
ALOAD 0(this)后,紧接其前的INVOKESPECIAL java/lang/Object.<init>后插入。 - 注入 3 个相同的
new PileRender(<constants>)序列,并PUTFIELD this.ingotRender/gemRender/dustRender。 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。
相关条目
- StacksOnStacksCompatHandler - 启用本 transformer 的 CompatHandler
- FieldLevelTessellatorTransformer - 在
ClientUtils上做类似事 - GetTileEntityNullGuardTransformer - 在
RenderTilePile.renderWorldBlock上做类似事 - ThreadSafeISBRHAnnotationTransformer - 在
RenderTilePile上加注解 - AngelicaCompatCore - 类转储基础设施
- PatchesConfig - 装载开关