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")。
已知问题
- 无 Javadoc:本类与
StacksOnStacksCompatHandler都完全没有类注释,而ICompatHandler也没定义契约。「为什么 8 个类全标false」这个决策在仓库里没有任何注释或文档记录,只能从代码推断。 - 8 个
perThread=false是未经验证的信任:如果上游某个BlockRender*类持有可变状态,多线程共享会产生难以复现的竞态。ThreadSafeISBRH注解的 Javadoc(api/ThreadSafeISBRH.java:30)明确警告「不应在 ISBRH 里存非 final 的状态,因为不保证线程安全」,但本 handler 正是通过 ASM 强行给这些类打上false标注。 renderWorldBlockExclusive变量名暗示的「排他」语义在 TileEntityNullGuardTransformer 里没有对应实现——该 transformer 注入的是通用IFNONNULL跳转,对V(void)返回类型直接RETURN。命名与实现之间存在落差。
相关条目
- ICompatHandler - 本类实现的接口
- CompatHandlers - 枚举项
IMMERSIVE_ENGINEERING(:18) - ImmersiveEngineeringTransformer -
extraTransformers()指向的 transformer - TileEntityNullGuardTransformer - 消费
getTileEntityNullGuard()的通用 transformer - ThreadSafeISBRHAnnotationTransformer - 消费
getThreadSafeISBRHAnnotations() - ThreadSafeISBRHFactory - 需要非默认构造时的替代 API
- CompatConfig -
fixImmersiveEngineering