问题
CoreSwap 会取消原版 NoiseBasedChunkGenerator.buildSurface,导致依赖它应用自身 surface_rule 的 mod 自定义维度永远不会铺上地表规则,只剩 default_block(石头)。后果:这些维度新生成区块地表为裸石,且树/植被也种不出来(需要草/土表面)。
环境
- Minecraft 1.20.1,Forge 47.4.21(CoreSwap 为 Fabric mod,经 Sinytra Connector 加载)
coreswap-1.20.1-1.0.24.jar(replace mode 生效)
- 受影响 mod:
chaospersists(Chaos Persists / OreSpawn 1.20.1-0.3.0)自定义维度(chaospersists:utopia/village 等)
根因(已定位到字节码)
coreswap.mixins.json → wg.bench.mixin.NoiseChunkGeneratorMixin 注入到 NoiseBasedChunkGenerator:
wgPopulateNoise(注入 populateNoise,cancellable):if !CppBridge.enabled return;否则 fillChunk(...) 原生填块 + setReturnValue → 取消原版 populateNoise。
wgBuildSurface(注入 buildSurface):if !CppBridge.enabled return;否则 ci.cancel() → 取消原版 buildSurface。
即一旦 CppBridge.enabled,CoreSwap 就取消原版 buildSurface,改用其原生 surface。而其 worldgen-data/ 仅含原版内容(65 个原版 biome、原版 noise/density/surface),不识别 mod 的 surface_rule/自定义 biome。
矿石菌种自定义维度 = 自定义生成器 chaospersists:plains_terrain(ChaosPlainsChunkGenerator),它包裹一个 minecraft:noise 内层生成器并把 buildSurface 委托给内层。内层是 NoiseBasedChunkGenerator → 被 wgBuildSurface 取消 → 其 surface_rule(草皮)永不执行 → 地表只剩石头。
日志:[BenchMod] CoreSwap replace mode: C++ worldgen active、[CppBridge] init ... enabled=true、[Mixin] buildSurface skipped chunk(...)。
现象(实测)
chaospersists:utopia 新生成区块顶部以 minecraft:stone 为主(抽样 6 块 174–252/256 列),草方块 0–6 列,0 原木/0 树叶/0 水晶树。
- 移除 CoreSwap 后重新生成 → 地表即为草方块(可作对照)。
影响范围
任何「依赖 NoiseBasedChunkGenerator.buildSurface 应用自身 surface_rule」的 mod 维度都会受影响:
- 标准
minecraft:noise 生成器 + 自定义 noise_settings/surface_rule 的维度;
- 自定义 chunk 生成器包裹
minecraft:noise 并委托 buildSurface 的维度(如本 mod);
- 非原版 biome(CoreSwap 的 biome 参数表只有原版,不识别自定义 biome)。
(该整合包里的 aether / twilightforest / tofucraft / grising planet_x / sweet_calamity 等自定义维度同样受影响。)
建议(按优先级)
- 识别并跳过非原版维度:维度若用了非标准生成器(自定义 codec / 非 vanilla generator)、或
noise_settings/surface_rule/biome 非原版 → 禁用原生、回退到原版(Java)世界生成,并打印「跳过非原版维度 xxx」。
- 按维度排除的配置:提供黑/白名单(如
dimension_ids = ["minecraft:overworld","minecraft:the_nether","minecraft:the_end"]),名单外维度不接管。
- 至少:不要无条件取消原版
buildSurface;当 generator / surface_rule 非标准时放行原版。
期望
- 原版/标准维度:CoreSwap 原生加速(保留其价值)。
- mod 自定义维度:交回原版管线 → 正确铺草皮/树/结构,不被破坏。
(如需复现,可用上述 chaospersists + coreswap 组合,进该维度生成一块看地表;移除 CoreSwap 后即为草方块。)
问题
CoreSwap 会取消原版
NoiseBasedChunkGenerator.buildSurface,导致依赖它应用自身surface_rule的 mod 自定义维度永远不会铺上地表规则,只剩default_block(石头)。后果:这些维度新生成区块地表为裸石,且树/植被也种不出来(需要草/土表面)。环境
coreswap-1.20.1-1.0.24.jar(replace mode 生效)chaospersists(Chaos Persists / OreSpawn 1.20.1-0.3.0)自定义维度(chaospersists:utopia/village等)根因(已定位到字节码)
coreswap.mixins.json→wg.bench.mixin.NoiseChunkGeneratorMixin注入到NoiseBasedChunkGenerator:wgPopulateNoise(注入populateNoise,cancellable):if !CppBridge.enabled return;否则fillChunk(...)原生填块 +setReturnValue→ 取消原版 populateNoise。wgBuildSurface(注入buildSurface):if !CppBridge.enabled return;否则ci.cancel()→ 取消原版 buildSurface。即一旦
CppBridge.enabled,CoreSwap 就取消原版buildSurface,改用其原生 surface。而其worldgen-data/仅含原版内容(65 个原版 biome、原版 noise/density/surface),不识别 mod 的surface_rule/自定义 biome。矿石菌种自定义维度 = 自定义生成器
chaospersists:plains_terrain(ChaosPlainsChunkGenerator),它包裹一个minecraft:noise内层生成器并把buildSurface委托给内层。内层是NoiseBasedChunkGenerator→ 被wgBuildSurface取消 → 其surface_rule(草皮)永不执行 → 地表只剩石头。现象(实测)
chaospersists:utopia新生成区块顶部以minecraft:stone为主(抽样 6 块 174–252/256 列),草方块 0–6 列,0 原木/0 树叶/0 水晶树。影响范围
任何「依赖
NoiseBasedChunkGenerator.buildSurface应用自身surface_rule」的 mod 维度都会受影响:minecraft:noise生成器 + 自定义noise_settings/surface_rule的维度;minecraft:noise并委托 buildSurface 的维度(如本 mod);(该整合包里的 aether / twilightforest / tofucraft / grising planet_x / sweet_calamity 等自定义维度同样受影响。)
建议(按优先级)
noise_settings/surface_rule/biome 非原版 → 禁用原生、回退到原版(Java)世界生成,并打印「跳过非原版维度 xxx」。dimension_ids = ["minecraft:overworld","minecraft:the_nether","minecraft:the_end"]),名单外维度不接管。buildSurface;当 generator /surface_rule非标准时放行原版。期望
(如需复现,可用上述
chaospersists+coreswap组合,进该维度生成一块看地表;移除 CoreSwap 后即为草方块。)