假高度世界生成兼容

基本信息

属性 值
实现类 com.cardinalstar.cubicchunks.util.CompatHandler(共 284 行)
初始化时机 CubicChunks.postInit → CompatHandler.init()(CubicChunks.java:186)
受影响模组集合 6 个 ImmutableSet 常量
反射构造器 Chunk.class.getConstructor(CubicChunks.class)(:85)

功能

许多 1.7.10 模组在生成或装饰阶段硬编码"世界高度 256",在立方世界(Y 范围可达数十亿)下会越界或生成错位。CompatHandler 的策略是:向这些模组分发事件时临时把世界高度伪装成 256 或 0,让它们以为自己仍在原版世界。

init()(util/CompatHandler.java:81-94)用反射调用私有的 Chunk(CubicChunks) 构造器造一个"未初始化区块",再据此取出 ChunkEvent.Load 的监听器列表中来自特定模组的监听器,存入 fakeChunkLoadListeners(:90-94)。

六个模组集合常量(CompatHandler.java:56-73):

常量 行 模组 modid 作用
IWORLDGENERATOR_FAKE_HEIGHT :56 ic2、thaumcraft、fossil、realistictorches、iceandfire、tg(ThaumicGadgets) 假高度 256
POPULATE_EVENT_PRE_FAKE_HEIGHT :60 reccomplex 群系填充前
DECORATE_EVENT_FAKE_HEIGHT :62 reccomplex 群系装饰
POST_DECORATE_EVENT_FAKE_HEIGHT :64 joshxmas 装饰后
FAKE_CHUNK_LOAD :66 zerocore 伪造区块加载事件
vanillaCompatPopulationFakeHeight :67 biomesoplenty 临时绕过(注释说明 BOSPL 直接触发事件而非走 Forge 事件工厂)

对应的三个公开入口由 mixin 从 ForgeEventFactory 调用(CompatHandler.java:138-140 的方法注释):

  • postChunkPopulatePreWithFakeWorldHeight(:142)
  • postBiomeDecorateWithFakeWorldHeight(:149)
  • postBiomePostDecorateWithFakeWorldHeight(:156)

三者最终都走 postEventPerModFakeHeight(:163-171),把 preEvt 设为 w -> w.fakeWorldHeight(256)(:169)、postEvt 设为 w -> w.fakeWorldHeight(0)(:170),即生成前伪装 256、生成后还原 0。三者开头都会检查 if (!(MinecraftForge.EVENT_BUS instanceof IEventBus)) 再补发一次原生事件(:143,150,157)。

onCubeLoad(ChunkEvent.Load)(:173-179)复用预先抓取的监听器数组手动派发(onChunkLoadImpl,:180-199),异常统一交给 Forge 事件总线的异常处理器,再按 throwIfUnchecked(:276-284)重抛 RuntimeException / Error。

另有两个辅助:

  • getModsForStacktrace(StackTraceElement[])(:119-137)借助 Loader.getActiveModList() 建立的"包名 → modid"映射(getPackageToModId(),:96-114)从崩溃栈里反查第三方 modid,并排除 minecraft、forge、cubicchunks(:126-128)
  • getFakeEventListeners(...)(:234-274)在监听器 toString() 以 ASM: 开头时反射解析其真实 modid,用于规避 ZeroCore 的已知问题(注释指向 ZeroNoRyouki/ZeroCore#28,:251-252)

数值

数值名 值 来源
兼容集合数量 6 CompatHandler.java:56,60,62,64,66,67
假高度上界 256 CompatHandler.java:169
假高度还原值 0 CompatHandler.java:170
假区块加载目标模组 zerocore CompatHandler.java:66
IWORLDGENERATOR_FAKE_HEIGHT 成员数 6 CompatHandler.java:56-59

交互

触发 行为
受影响模组触发世界生成事件 事件分发期间世界高度被伪装为 256,分发后还原为 0
zerocore 监听区块加载 CubicChunks 手动派发一次伪 ChunkEvent.Load
崩溃栈分析 列出除 minecraft/forge/cubicchunks 外的相关 modid
相关模组未安装 集合为空,逻辑无副作用

CompatHandler 内有 2 处 catch (Throwable ...)(:191、:225)用于把事件总线异常统一转交异常处理器(分别见 :193、:227)——这是正确的重抛而非空捕获。真正的空 catch 在同文件 :132(ClassNotFoundException ignored,反查崩溃栈时的良性探测)与 :264(ClassNotFoundException t,反射解析监听器 modid 失败即沿用原值),以及 util/JourneyMapRenderGuard.java:18。全仓仅此 3 处空 catch。

相关条目