结构

基本信息

属性 值
结构生成器 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,无下划线分隔),与 modid HardcoreEnderExpansion 和资源域 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×3 BlockList.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,属未完成功能,不是缺陷。

相关条目