Map Star Fissures to modern world minimum Y (#58)
Build / build (push) Canceled after 0s

This commit is contained in:
dnorberg committed 2026-10-08 02:20:33 -04:00
1 parent 0c89cfc464
commit 4f1d458897
5 files changed
+26 -14

No files matched your search

@@ -103,7 +103,8 @@ public final class AgeDimensionService {
.anyMatch(choice -> choice.id().equals(AgeFeatureSelection.STAR_FISSURES))
|| definition.randomFeatures().stream()
.anyMatch(choice -> choice.id().equals(AgeFeatureSelection.STAR_FISSURES))) {
StarFissureFeature.generate(level, definition.seed(), spawn);
StarFissureFeature.generate(level, definition.seed(), spawn,
AgeBiomeSelection.isCave(runtimeProfile(definition)));
}
definition = AgeRegistrySavedData.get(level).setSpawn(definition.id(), spawn);
}
@@ -155,6 +155,8 @@ public final class AgeFlatChunkGenerator extends ChunkGenerator {
@Override public void applyCarvers(WorldGenRegion level, long seed, RandomState random, BiomeManager biomes,
StructureManager structures, ChunkAccess chunk, GenerationStep.Carving step) { }
@Override public void spawnOriginalMobs(WorldGenRegion level) { }
// Keep vanilla FlatLevelSource's generator API values. Actual layer
// placement uses chunk.getMinBuildHeight() above, not this metadata value.
@Override public int getMinY() { return 0; }
@Override public int getGenDepth() { return 384; }
@Override public int getSeaLevel() { return -63; }
@@ -49,29 +49,38 @@ public final class StarFissureFeature {
private static void addRow(List<BlockPos> columns, int originX, int originZ, int row, int left, int right) {
for (int x = left; x <= right; x++) {
// Footprint is a 2D column map; this placeholder Y is never used
// for placement. generate() resolves the real floor from the level.
columns.add(new BlockPos(originX + x, 0, originZ + row * 2));
columns.add(new BlockPos(originX + x, 0, originZ + row * 2 + 1));
}
}
public static void generate(ServerLevel level, long ageSeed, BlockPos spawn) {
public static void generate(ServerLevel level, long ageSeed, BlockPos spawn, boolean caveTerrain) {
List<BlockPos> columns = footprint(ageSeed, spawn);
BlockPos first = columns.getFirst();
// 1.12 worlds began at y=0. Modern superflat can sit below it, so use the
// modern world floor there. Empty Void columns keep Legacy's y=0 portal.
int surface = level.getHeight(Heightmap.Types.WORLD_SURFACE, first.getX(), first.getZ());
int minY = level.getMinBuildHeight();
int floorY = surface > minY && surface <= 0 ? minY + 1 : Math.max(0, minY + 1);
// Legacy's y=0 was its minimum build height. The equivalent in 1.21.1
// is the dimension's minimum Y, including the bedrock layer itself.
int floorY = level.getMinBuildHeight();
BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos();
for (BlockPos column : columns) {
int top = level.getHeight(Heightmap.Types.WORLD_SURFACE, column.getX(), column.getZ());
level.setBlock(mutable.set(column.getX(), floorY, column.getZ()),
ModBlocks.STAR_FISSURE.get().defaultBlockState(), 2);
// Legacy clears all blocks above each portal tile to the sky. Heightmap
// bounds the same work without iterating already-empty world height.
if (caveTerrain) {
// Cave terrain has a bedrock roof. Open the fissure into the
// cavern, but never punch through its upper boundary.
for (int y = Math.max(spawn.getY(), floorY + 1); y < top; y++) {
if (level.getBlockState(mutable.set(column.getX(), y, column.getZ())).is(Blocks.BEDROCK)) {
top = y;
break;
}
}
}
// Clear the full column first, including water. Place the portal
// last so an existing fluid cannot occupy its block during carving.
for (int y = floorY + 1; y < top; y++) {
level.setBlock(mutable.set(column.getX(), y, column.getZ()), Blocks.AIR.defaultBlockState(), 2);
}
level.setBlock(mutable.set(column.getX(), floorY, column.getZ()),
ModBlocks.STAR_FISSURE.get().defaultBlockState(), 2);
}
}
}