假高度世界生成兼容
基本信息
| 属性 | 值 |
|---|---|
| 实现类 | 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。