结构
基本信息
| 属性 | 值 |
|---|---|
| 结构生成器 | 3 个活注册:StructureTower / StructureIsland / TempleGenerator |
| 结构 IO 名 | hardcoreenderdragon_EndTower / ..._EndTowerC / hardcoreenderdragon_EndIsland / ..._EndIslandC |
| 概率工具 | WorldGenChance(5 个曲线 + checkChance) |
| 数据源 | world/structure/(42 个文件)+ world/feature/TempleGenerator.java |
功能
结构 IO 注册(world/DimensionOverride.java:35-41)
| 结构类 | 组件类 | IO 名 |
|---|---|---|
StructureTower |
ComponentTower |
hardcoreenderdragon_EndTower / hardcoreenderdragon_EndTowerC |
StructureIsland |
ComponentIsland |
hardcoreenderdragon_EndIsland / hardcoreenderdragon_EndIslandC |
StructureSanctuary |
ComponentSanctuary |
已注释(DimensionOverride.java:40-41) |
注意 IO 名前缀是
hardcoreenderdragon_(无 e,无下划线分隔),与 modidHardcoreEnderExpansion和资源域hardcoreenderexpansion都不同。
生成参数对比
| 生成器 | 构造参数 | 搜索半径 | 区域大小 | 位置 |
|---|---|---|---|---|
MapGenIsland |
(13, 28, 1600, 208) |
1600 | 208 | world/structure/island/MapGenIsland.java:13 |
MapGenTower |
(9, 15, 350, 32) |
350 | 32 | world/structure/tower/MapGenTower.java:23 |
生成概率
生态岛(MapGenIsland.java:16-20):
return rand.nextInt(7) <= 4 && WorldGenChance
.checkChance(0.65D + 0.35D * WorldGenChance.linear2Incr.calculate(dist, 1600D, 4000D), rand);
硬否决 2/7 ≈ 0.286;软概率从 1600 格的 0.65 线性升到 4000 格的 1.00。
塔(MapGenTower.java:26-56):
if (rand.nextInt(100) > 28 || (dist > 900D && !WorldGenChance
.checkChance(0.25D + 0.75D * WorldGenChance.cubic2Decr.calculate(dist, 900D, 3800D), rand)))
return false;
- 硬否决:
rand.nextInt(100) > 28→ 71% 否决 - 900 格外再叠加软概率
0.25 + 0.75 × cubic2Decr(dist, 900, 3800):900 格 → 1.00,3800 格 → 0.25 - 随后检查 25×25 区块范围内(
x-12..x+12,:37-38)是否有生态岛;塔中心到任一岛中心的距离必须 ≥ceil(featureSize × 0.6F)(:49、:52) - 岛的判定用
IslandSpawnChecker.getIslandBiomeAt(xx, zz, seed1, seed2),其中seed2 = 1 + 末影龙死亡次数(:32-33、:39)—— 塔的位置随末影龙死亡次数改变
概率曲线(world/util/WorldGenChance.java)
| 常量 | 公式 | 行 |
|---|---|---|
linear2Incr |
dist < start ? 0 : dist > end ? 1 : (dist-start)/(end-start) |
:9-15 |
linear2Decr |
dist < start || dist > end ? 0 : 1 - (dist-start)/(end-start) |
:17-23 |
cubic2Incr |
同 linear2Incr 但取 3 次方 | :25-32 |
cubic2Decr |
1 - ((dist-start)/(end-start))³ |
:34-41 |
linear3IncrDecr |
两段拼接:低于 middleDist 用 incr,高于用 decr |
:45-53 |
checkChance(double chance, Random rand) 对 0 和 1 做短路:chance == 0D ? false : chance == 1D ? true : rand.nextDouble() < chance(:55-57)。
龙巢神殿(world/feature/TempleGenerator.java)
TempleGenerator 不是 MapGen 结构,而是末影龙召唤时的程序化建造器,直接用 world.setBlock 铺一个 19×14 的多层建筑。
- 占地:
x..x+19×z..z+13(preloadAndClearArea,:18-27) - 清空范围:
y+7到y(8 层) - 共 7 个命名层:
// LAYER 1(:32)、2(:47)、3(:81)、// LAYER 4(:111)、// LAYER 4 + 5(:121)、5(:151)、6(:160)、// LAYER 7 + 8 (ROOF)(:175) - 主材料:
Blocks.quartz_block(石英块)+Blocks.quartz_stairs(石英楼梯)+Blocks.stone_slab - 传送门核心:临时把
BlockEndPortal.field_149948_a置true,铺 3×3BlockList.temple_end_portal,再还原(:88-91)—— 这是本模组唯一使用反射写原版私有静态字段的方块放置路径 - 顶部屋顶中央留空:
world.setBlockToAir(x + 9, y, z + 6)(:190) - 辅助方法:
block(:193-199)、linex(:201-207)、linez(:209-215)、rect(:217-225),全部用world.setBlock(..., 2)(flag 2 = 不触发邻域更新)
数值
| 数值名 | 值 | 位置 |
|---|---|---|
| 生态岛 MapGen 硬否决率 | 2/7 ≈ 0.2857 | MapGenIsland.java:18 |
| 生态岛软概率区间 | 0.65 → 1.00(1600 → 4000 格) | MapGenIsland.java:19 |
| 塔 MapGen 硬否决率 | 71/100 = 0.71 | MapGenTower.java:28 |
| 塔软概率区间 | 1.00 → 0.25(900 → 3800 格,三次方衰减) | MapGenTower.java:29 |
| 塔与岛的最小间距 | ceil(featureSize × 0.6F) |
MapGenTower.java:49、52 |
| 塔的种子偏移 | 1 + 末影龙死亡次数 |
MapGenTower.java:33 |
| 神殿占地 | 19 × 13 区块,清空 8 层 | TempleGenerator.java:22-26 |
| 神殿传送门 | 3×3 temple_end_portal |
TempleGenerator.java:90 |
| 神殿层数 | 8 层(LAYER 1–8) | TempleGenerator.java:32-190 |
交互
| 触发 | 行为 |
|---|---|
| 末影龙召唤 | TempleGenerator.spawnTemple(x,y,z) 清空区域并建造神殿 |
| 龙蛋放置 | BlockDragonEggCustom(block/BlockDragonEggCustom.java:55)生成 EntityBlockTempleDragonEgg(ID 7,追踪范围 420) |
| 拾取龙蛋 | 原版机制可由 allowVanillaDragonEggPickup 配置重新启用(system/ConfigHandler.java:150-153) |
| 塔生成 | StructureTower → ComponentTower,塔内 TowerEndermanSpawnerLogic 刷末影人 |
| 岛生成 | StructureIsland → ComponentIsland,按内容变体分支 |
调试入口
MapGenTower.java:68-79 有一个 HeeTest 调试钩子 $debugTest,在玩家脚下立即生成一座塔并推送 "Generated tower." 通知。注册于 system/commands/HeeDebugCommand(由 system/UnitTester 体系驱动,见 成就 之外的独立体系)。
未注册内容
world/structure/sanctuary/ 5 个文件(MapGenSanctuary / StructureSanctuary / ComponentSanctuary / SanctuaryConquerPointGen / SanctuaryMazeGen)完全未接入。MapGenSanctuary 在自身文件外零引用。ComponentSanctuary.java:41 与 :43 的 Javadoc 中还残留着对 SanctuaryMazeGen / SanctuaryConquerPointGen 的注释掉的调用示例。仓库有 // TODO SANCTUARY 注释作为 intent evidence,属未完成功能,不是缺陷。