区块生成管线

基本信息

属性 值
实现类 rwg.world.ChunkGeneratorRealistic(implements IChunkProvider,796 行)
挂载点 WorldTypeRealistic.getChunkGenerator()(rwg/world/WorldTypeRealistic.java:18-20)
构造种子 直接取 world.getSeed(),不解析世界种子文本(WorldTypeRealistic.java:19)
自定义方块 / 物品 无
洞穴生成器 TerrainGen.getModdedMapGen(new MapGenCaves(), CAVE)(ChunkGeneratorRealistic.java:108)
要塞生成器 TerrainGen.getModdedMapGen(new MapGenStronghold(), STRONGHOLD)(ChunkGeneratorRealistic.java:124)

功能

生成器把一个区块的生成拆成「地形阶段」与「populate 阶段」两段,之间插入 RWG 自己的群系专属逻辑。

一、地形阶段(generateTerrain 之后的管线)

步骤 说明 行号
1. 地形噪声 generateTerrain(cmr, cx, cy, chunkBlocks, chunkMetadata, biomesForGeneration),逐列取写实群系的地形高度 ChunkGeneratorRealistic.java:174
2. 群系专属 MapGen 遍历 256 个群系槽,凡 mapGenBiomes[k] > 0f 者调用 RealisticBiomeBase.getBiome(k).generateMapGen(...) ChunkGeneratorRealistic.java:176-183
3. 地表涂装 replaceBlocksForBiome(...),按写实群系的 SurfaceBase 把石头/沙子换成群系地表层 ChunkGeneratorRealistic.java:185
4. 洞穴 受 generateCaves 开关控制 ChunkGeneratorRealistic.java:186-188
5. 废弃矿井 受 generateMineshafts 开关控制 ChunkGeneratorRealistic.java:190-192
6. 要塞 不受任何配置开关控制,始终生成 ChunkGeneratorRealistic.java:193
7. 村庄 受 generateVillages 开关控制 ChunkGeneratorRealistic.java:194-196

第 2 步的 generateMapGen 会以当前区块为中心遍历 ±5 区块(rwg/biomes/realistic/RealisticBiomeBase.java:176-185), 并为每个基础区块用 baseX * l + baseY * l1 ^ seed 重新播种随机数,保证跨区块边界的结构可复现。 本仓库中唯一用到该钩子的群系是热带岛屿的火山:MapVolcano.build(...) (rwg/biomes/realistic/ocean/RealisticBiomeIslandTropical.java:71)。

二、populate 阶段

populate 先把 rand 按 i * i1 + j * j1 ^ world.getSeed() 重新播种,再发出 PopulateChunkEvent.Pre(ChunkGeneratorRealistic.java:485),随后依次执行:

顺序 内容 开关 行号
1 废弃矿井 generateStructuresInChunk generateMineshafts 487-489
2 要塞 generateStructuresInChunk 无开关 490
3 村庄 generateStructuresInChunk generateVillages 491-493
4 地下含水湖(WorldGenLakes(Blocks.water)) generateUndergroundLakes 497-505
5 地下熔岩湖(WorldGenLakes(Blocks.lava)) generateUndergroundLavaLakes 507-517
6 地牢(WorldGenDungeons,上限 8 次/区块) 无开关 519-525
7 矿脉(OreGenEvent.Pre → TerrainGen.generateOre) 无开关 527、602-609
8 绿宝石矿 generateEmeralds 611-621
9 OreGenEvent.Post — 623
10 棕/红蘑菇(各 1 次二选一) 无开关 625-635
11 地表装饰 TerrainGen.decorate(SAND、CLAY、SAND_PASS2、TREE、BIG_SHROOM) 无开关 643-650
12 流动熔岩补充(20 次/区块) 无开关 691-696
13 动物生成(SpawnerAnimals.performWorldGenSpawning) 无开关 698-707
14 PopulateChunkEvent.Post — 709
15 结冰 TerrainGen.populate(..., ICE) + 雪盖(snow < 0.59f) 无开关 711 起

其中含水湖与熔岩湖的额外补充并非每区块都发生:

  • 含水湖:TerrainGen.populate(..., LAKE) 返回 true 且 rand.nextInt(10) == 0 时,在 y = rand.nextInt(50) 放一个水湖 (ChunkGeneratorRealistic.java:500-504)
  • 熔岩湖:TerrainGen.populate(..., LAVA) 返回 true 且 rand.nextInt(18) == 0 时,在 y = rand.nextInt(rand.nextInt(45) + 8) 放熔岩湖,且要求 y < 64 或再掷 rand.nextInt(10) == 0 (ChunkGeneratorRealistic.java:510-516)
  • 地牢:TerrainGen.populate(..., DUNGEON) 返回 true 时最多再生成 8 次,y = rand.nextInt(128) (ChunkGeneratorRealistic.java:520-524)

recreateStructures(用于 /locate 一类的结构定位)在重建时同样尊重 generateMineshafts / generateVillages 开关,而要塞始终重建(ChunkGeneratorRealistic.java:787-795)。

数值

数值名 值 行号
群系专属 MapGen 扫描半径 ±5 区块 RealisticBiomeBase.java:176
绿宝石矿每区块尝试次数 4 ChunkGeneratorRealistic.java:613
绿宝石矿 Y 范围 rand.nextInt(28) + 4 → 4–31 ChunkGeneratorRealistic.java:615
绿宝石矿放置条件 目标方块须满足 isReplaceableOreGen(..., Blocks.stone) ChunkGeneratorRealistic.java:617
地牢每区块上限 8 ChunkGeneratorRealistic.java:520
流动熔岩每区块次数 20 ChunkGeneratorRealistic.java:691
含水湖补充概率 nextInt(10) == 0 ChunkGeneratorRealistic.java:500
熔岩湖补充概率 nextInt(18) == 0 ChunkGeneratorRealistic.java:509
蘑菇生成概率 nextInt(5) == 0,棕/红二选一 ChunkGeneratorRealistic.java:625-634
云层高度 256 WorldTypeRealistic.java:23

交互

该管线全部在服务端运行。玩家可见的影响只有地形本身,以及下列可通过配置关闭的生成内容。

相关条目