ImmersiveEngineeringCompatHandler

基本信息

属性 值
类 com.gtnewhorizons.angelica.loading.fml.compat.handlers.ImmersiveEngineeringCompatHandler
路径 src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/handlers/ImmersiveEngineeringCompatHandler.java
行数 44
类型 public class ... implements ICompatHandler(:11)
门控 CompatConfig.fixImmersiveEngineering(CompatHandlers.java:18)

它是什么

Immersive Engineering(blusunrize)的兼容数据提供者。5 个 handler 里数据量最大的一个:2 张表、14 个类名条目(6 + 8)。

覆写的 3 个方法

getTileEntityNullGuard(:14-25)

6 个类共享同一个 ImmutableList 实例:

目标类 补丁方法
...client.render.BlockRenderClothDevices renderWorldBlock
...client.render.BlockRenderMetalDecoration renderWorldBlock
...client.render.BlockRenderMetalDevices renderWorldBlock
...client.render.BlockRenderMetalDevices2 renderWorldBlock
...client.render.BlockRenderWoodenDecoration renderWorldBlock
...client.render.BlockRenderWoodenDevices renderWorldBlock

renderWorldBlockExclusive 变量名里的 “Exclusive” 暗示这层守卫是排他的:一旦 getTileEntity 返回 null 就直接放弃整个方块的 ISBRH 渲染,而不是降级。

getThreadSafeISBRHAnnotations(:27-38)

8 个类全部标 false(perThread=false)。这是本 handler 的关键决定:IE 的 8 个 BlockRender* 类不创建线程本地实例,主线程实例被所有线程共享。源码层面这要求这些类无可变状态——本 handler 未做此校验,属于信任上游。

BlockRenderMetalMultiblocks(:34)与 BlockRenderStoneDevices(:35)只出现在这张表里,不在 null 守卫表里。

extraTransformers(:40-42)

ImmutableList.of("...transformers.specific.ImmersiveEngineeringTransformer")。

已知问题

  1. 无 Javadoc:本类与 StacksOnStacksCompatHandler 都完全没有类注释,而 ICompatHandler 也没定义契约。「为什么 8 个类全标 false」这个决策在仓库里没有任何注释或文档记录,只能从代码推断。
  2. 8 个 perThread=false 是未经验证的信任:如果上游某个 BlockRender* 类持有可变状态,多线程共享会产生难以复现的竞态。ThreadSafeISBRH 注解的 Javadoc(api/ThreadSafeISBRH.java:30)明确警告「不应在 ISBRH 里存非 final 的状态,因为不保证线程安全」,但本 handler 正是通过 ASM 强行给这些类打上 false 标注。
  3. renderWorldBlockExclusive 变量名暗示的「排他」语义在 TileEntityNullGuardTransformer 里没有对应实现——该 transformer 注入的是通用 IFNONNULL 跳转,对 V(void)返回类型直接 RETURN。命名与实现之间存在落差。

相关条目