区块生成管线
基本信息
| 属性 | 值 |
|---|---|
| 实现类 | 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 |
交互
该管线全部在服务端运行。玩家可见的影响只有地形本身,以及下列可通过配置关闭的生成内容。