天境地牢生成

基本信息

天境有 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

相关条目