Ocean Monument

基本信息

属性 值
结构名 "Monument"(MapGenStructureIO.registerStructure,VillageNames.java:173)
主类 astrotibs.villagenames.prismarine.monument.StructureOceanMonument
组件库 StructureOceanMonumentPieces(prismarine/monument/StructureOceanMonumentPieces.java)
世界生成器 MonumentGeneratorIWG(prismarine/monument/MonumentGeneratorIWG.java)
注册条件 GeneralConfig.addOceanMonuments == true
作用维度 仅主世界(dimensionId == 0)

功能

Ocean Monument(海底神殿)是 1.8 海洋更新结构的移植版,是 Guardian 的生成场所。

注册流程

在 preInit 中依次完成三步(VillageNames.java:169-175):

GameRegistry.registerWorldGenerator(new MonumentGeneratorIWG(), 0);
MapGenStructureIO.registerStructure(StructureOceanMonument.StartMonument.class, "Monument");
StructureOceanMonumentPieces.registerOceanMonumentPieces();

EntityRegistry 的守卫者注册被放在 load(初始化)阶段而非 preInit,源码注明 "Guardian registry has been moved to init()"(VillageNames.java:177)。

世界生成

MonumentGeneratorIWG.generate 的完整条件(prismarine/monument/MonumentGeneratorIWG.java:22-26):

条件 要求
维度 world.provider.dimensionId == 0(仅主世界)
地图特性 world.getWorldInfo().isMapFeaturesEnabled()(需开启"地图特性")
坐标 StructureOceanMonument.canSpawnStructureAtCoords(world, chunkX, chunkZ)

与世界生成器的协同

生成器不直接使用自己的 StructureOceanMonument 实例,而是每区块向地形生成系统索取 CUSTOM 类型实例:

oceanMonumentGenerator = (StructureOceanMonument) TerrainGen.getModdedMapGen(new StructureOceanMonument(), CUSTOM);

(prismarine/monument/MonumentGeneratorIWG.java:29)

源码注释强调此块"无论使用原版、替代版还是写实地形生成器都会运行"(:28),因此能与第三方地形生成 mod 协同。

区块偏移

生成时以 chunkOffset = 2 遍历周边 4×4 区块(prismarine/monument/MonumentGeneratorIWG.java:34-36),即 OM_x / OM_z 各取 -2 到 1。

每个区块执行两步(:38-45):

  1. func_151539_a(...) —— 写入结构包围盒(//THIS needed for chunk generation)
  2. generateStructuresInChunk(...) —— 实际放置结构(//THIS needed for chunk generation)

generateStructuresInChunk 被包在 try { } catch (Exception e) { } 中,异常被静默吞掉(:42-44)。同样的空 catch 也出现在 Igloo 的生成器中。

已知限制

源码注释指出实际放置步骤只在原版世界生成器下生效:

// This block only seems to fire with a vanilla world generator :(

(prismarine/monument/MonumentGeneratorIWG.java:31)

相关条目