天境地牢生成
基本信息
天境有 4 类地牢 / 特殊结构,在 ChunkProviderAether.populateChunk 中逐个调用(ChunkProviderAether.java:263-269):
| 结构 | 生成器 | 生成方式 | 源码行 |
|---|---|---|---|
| 巨大寒风境云 | MapGenLargeColdAercloud |
generateStructuresInChunk |
ChunkProviderAether.java:263 |
| 白银地牢 | MapGenSilverDungeon |
generateStructuresInChunk |
:264 |
| 黄金地牢 | MapGenGoldenDungeon |
generateStructuresInChunk |
:265 |
| 青铜地牢 | BronzeDungeon(extends WorldGenerator) |
generate(...) 直接调用 |
:269 |
生成顺序(ChunkProviderAether.java:263-271):4 个结构 → biome.decorate(境云/矿脉/树)→ 青铜地牢 → 生物群系刷怪。
重要区别:白银、黄金地牢与巨大境云走原版
MapGenStructure机制(有StructureStart与MapGenStructureIO注册),而青铜地牢不走 —— 它是AetherDungeon extends WorldGenerator(AetherDungeon.java:10)的直接调用,没有StructureStart、没有MapGenStructureIO注册、没有独立的地图标记。这是模组中唯一的非 MapGen 地牢。
结构注册
3 个 MapGenStructure 与 5 个组件在 AetherWorld.initialization() 中注册(AetherWorld.java:22-36):
| 类别 | 类 | 注册 ID |
|---|---|---|
| 起始点 | MapGenSilverDungeon.Start |
aether_legacy:silver_dungeon_start(:23) |
| 起始点 | MapGenGoldenDungeon.Start |
aether_legacy:golden_dungeon_start(:24) |
| 起始点 | MapGenLargeColdAercloud.Start |
aether_legacy:large_cold_aercloud_start(:26-27) |
| 组件 | ComponentLargeColdAercloud |
aether_legacy:large_cold_aercloud_component(:29-30) |
| 组件 | ComponentSilverDungeon |
aether_legacy:silver_dungeon_component(:32) |
| 组件 | ComponentGoldenDungeon |
aether_legacy:golden_dungeon_component(:34) |
| 组件 | ComponentGoldenIsland |
aether_legacy:golden_island_component(:35) |
| 组件 | ComponentGoldenIslandStub |
aether_legacy:golden_island_stub_component(:36) |
起始点用 MapGenStructureIO.registerStructure,组件用混淆方法 MapGenStructureIO.func_143031_a(MCP 映射名)。
地牢生成逻辑
确定性种子
白银与黄金地牢的 Start.create 使用基于世界种子 + 区块坐标的确定性随机(MapGenSilverDungeon.java:54-58、MapGenGoldenDungeon.java:57-62):
random.setSeed(worldIn.getSeed());
long i = random.nextLong();
long j = random.nextLong();
random.setSeed((long) chunkX * i + (long) chunkZ * j ^ worldIn.getSeed());
因此同一存档中同一区块的地牢布局恒定,重新生成区块不会改变。MapGenLargeColdAercloud.Start.create(:44-48)不设种子,直接用传入的 random。
白银地牢
MapGenSilverDungeon.Start.create(:52 起)创建 ComponentSilverDungeon,坐标为 (chunkX << 4) + 2, (chunkZ << 4) + 2(:61),并随机化 3 个楼梯位置与 2 个延伸倾向:
| 字段 | 生成方式 | 来源 |
|---|---|---|
firstStaircaseZ |
random.nextInt(3) |
MapGenSilverDungeon.java:63 |
secondStaircaseZ |
random.nextInt(3) |
:64 |
finalStaircaseZ |
random.nextInt(3) |
:65 |
xTendency |
random.nextInt(3) - 1 → -1 / 0 / 1 |
:67 |
zTendency |
random.nextInt(3) - 1 → -1 / 0 / 1 |
:68 |
白银地牢使用的方块是 locked_angelic_stone 与 locked_light_angelic_stone(ComponentSilverDungeon.java:24、:26)。
黄金地牢
黄金地牢结构最复杂 —— 除主地牢外还生成多个附属小岛(MapGenGoldenDungeon.java:64-86):
| 字段 | 生成方式 | 来源 |
|---|---|---|
dungeonDirection |
random.nextInt(4) → 0–3 |
:66 |
stubIslandCount |
8 + random.nextInt(5) → 8–12 个 |
:67 |
| 附属岛角度 | random.nextFloat() * 360F |
:73 |
| 附属岛距离 | ((random.nextFloat() * 0.125F) + 0.7F) * 24.0F |
:74 |
| 附属岛高度 | -MathHelper.floor_double(24.0D * random.nextFloat() * 0.3D) |
:75 |
customOffset |
random.nextInt(64) |
:89 |
每个附属岛固定 y = 0 偏移为 8(:79 的最后一个参数 8)。
黄金地牢使用的方块是 locked_hellfire_stone 与 locked_light_hellfire_stone(ComponentGoldenDungeon.java:38、:106-107、:125-126、:138)。
青铜地牢
BronzeDungeon extends AetherDungeon(BronzeDungeon.java:21),在 ChunkProviderAether 中作为字段持有(ChunkProviderAether.java:38):
protected AetherDungeon dungeon_bronze = new BronzeDungeon();
生成调用(ChunkProviderAether.java:269):
this.dungeon_bronze.generate(this.worldObj, this.rand, x, this.rand.nextInt(48) + 24, z);
Y 高度为 nextInt(48) + 24 → 24–71。使用 BlocksAether.locked_sentry_stone 作为锁定发光方块(BronzeDungeon.java:687 的 lockedLightBlock()),普通锁定方块为 locked_carved_stone(:691)。
BronzeDungeon 内部以房间为单位递归生成:generateBossRoom(:44)→ generateEmptyRoom(:79)→ determineRoomPosition(:199)→ generateRoomWithSide(:227)→ generateNextRoom(:263),形成连通的房间网络。房间摆放通过 AetherDungeon 基类的 rand.nextInt(this.chance) == 0 判定(AetherDungeon.java:51、:71、:91、:112、:135、:158、:232、:293)。
战利品
三级地牢的战利品在藏宝箱被钥匙解锁时生成,由 TileEntityTreasureChest.unlock(int kind) 分派(TileEntityTreasureChest.java:41-72):
| kind | 等级 | 战利品函数 | 件数 | 来源 |
|---|---|---|---|---|
| 0 | 青铜 | BronzeDungeon.getBronzeLoot(random) |
5–5 | TileEntityTreasureChest.java:46-51 |
| 1 | 白银 | ComponentSilverDungeon.getSilverLoot(random) |
5–5 | :54-59 |
| 2 | 黄金 | ComponentGoldenDungeon.getGoldLoot(random) |
5–5 | :62-67 |
三者件数公式都是 5 + random.nextInt(1),即恒为 5 件(random.nextInt(1) 永远返回 0)。每件放入随机槽位(random.nextInt(this.getSizeInventory()))。
解锁后 this.locked = false(:69)并向所有客户端同步(:71-74)。
青铜地牢战利品表
BronzeDungeon.getBronzeLoot(BronzeDungeon.java:660-681)用 random.nextInt(10) 分 10 档:
| 档位 | 物品 | 数量 |
|---|---|---|
| 0 | 史维特果冻 gummy_swet |
1–7,meta 随机 |
| 1 | 凤舞长弓 phoenix_bow |
1 |
| 2 | 烈焰宝剑 flaming_sword |
1 |
| 3 | Notch飞锤 notch_hammer |
1 |
| 4 | 惊雷飞刀 lightning_knife |
1–20 |
| 5 | 武神长枪 valkyrie_lance |
1 |
| 6 | 敏捷披风 agility_cape |
1 |
| 7 | 哨卫长靴 sentry_boots |
1 |
| 8 | 反击之盾 repulsion_shield |
1 |
| 兜底(9) | 境云权杖 cloud_staff |
1 |
其中 switch 只覆盖 0–8,档位 9 落到兜底分支返回境云权杖。
白银与黄金的战利品表分别在 ComponentSilverDungeon.getSilverLoot(:537)与 ComponentGoldenDungeon.getGoldLoot(:186),具体条目本次未逐条展开。
数值
| 数值名 | 值 | 来源 |
|---|---|---|
| 注册的结构起始点 | 3 | AetherWorld.java:23、:24、:26-27 |
| 注册的结构组件 | 5 | AetherWorld.java:29-36 |
| 青铜地牢 Y 范围 | 24–71 | ChunkProviderAether.java:269 |
| 黄金地牢附属岛数 | 8–12 | MapGenGoldenDungeon.java:67 |
| 黄金地牢附属岛距离系数 | 0.7–0.825 × 24 | MapGenGoldenDungeon.java:74 |
| 藏宝箱战利品件数 | 5(三级相同) | TileEntityTreasureChest.java:47、:55、:63 |
| 青铜战利品档位 | 10(0–9) | BronzeDungeon.java:661 |
| 白银地牢楼梯位置档数 | 3 | MapGenSilverDungeon.java:63-65 |
| 黄金地牢方向档数 | 4 | MapGenGoldenDungeon.java:66 |