minecraft-src/net/minecraft/world/level/levelgen/structure/structures/OceanMonumentStructure.java
2025-07-04 03:15:13 +03:00

78 lines
3.5 KiB
Java

package net.minecraft.world.level.levelgen.structure.structures;
import com.mojang.serialization.MapCodec;
import java.util.Objects;
import java.util.Optional;
import net.minecraft.core.Direction;
import net.minecraft.core.Holder;
import net.minecraft.core.Direction.Plane;
import net.minecraft.tags.BiomeTags;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.levelgen.LegacyRandomSource;
import net.minecraft.world.level.levelgen.RandomSupport;
import net.minecraft.world.level.levelgen.WorldgenRandom;
import net.minecraft.world.level.levelgen.Heightmap.Types;
import net.minecraft.world.level.levelgen.structure.BoundingBox;
import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.structure.StructurePiece;
import net.minecraft.world.level.levelgen.structure.StructureType;
import net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder;
public class OceanMonumentStructure extends Structure {
public static final MapCodec<OceanMonumentStructure> CODEC = simpleCodec(OceanMonumentStructure::new);
public OceanMonumentStructure(Structure.StructureSettings structureSettings) {
super(structureSettings);
}
@Override
public Optional<Structure.GenerationStub> findGenerationPoint(Structure.GenerationContext context) {
int i = context.chunkPos().getBlockX(9);
int j = context.chunkPos().getBlockZ(9);
for (Holder<Biome> holder : context.biomeSource().getBiomesWithin(i, context.chunkGenerator().getSeaLevel(), j, 29, context.randomState().sampler())) {
if (!holder.is(BiomeTags.REQUIRED_OCEAN_MONUMENT_SURROUNDING)) {
return Optional.empty();
}
}
return onTopOfChunkCenter(context, Types.OCEAN_FLOOR_WG, structurePiecesBuilder -> generatePieces(structurePiecesBuilder, context));
}
private static StructurePiece createTopPiece(ChunkPos chunkPos, WorldgenRandom random) {
int i = chunkPos.getMinBlockX() - 29;
int j = chunkPos.getMinBlockZ() - 29;
Direction direction = Plane.HORIZONTAL.getRandomDirection(random);
return new OceanMonumentPieces.MonumentBuilding(random, i, j, direction);
}
private static void generatePieces(StructurePiecesBuilder builder, Structure.GenerationContext context) {
builder.addPiece(createTopPiece(context.chunkPos(), context.random()));
}
public static PiecesContainer regeneratePiecesAfterLoad(ChunkPos chunkPos, long seed, PiecesContainer piecesContainer) {
if (piecesContainer.isEmpty()) {
return piecesContainer;
} else {
WorldgenRandom worldgenRandom = new WorldgenRandom(new LegacyRandomSource(RandomSupport.generateUniqueSeed()));
worldgenRandom.setLargeFeatureSeed(seed, chunkPos.x, chunkPos.z);
StructurePiece structurePiece = (StructurePiece)piecesContainer.pieces().get(0);
BoundingBox boundingBox = structurePiece.getBoundingBox();
int i = boundingBox.minX();
int j = boundingBox.minZ();
Direction direction = Plane.HORIZONTAL.getRandomDirection(worldgenRandom);
Direction direction2 = (Direction)Objects.requireNonNullElse(structurePiece.getOrientation(), direction);
StructurePiece structurePiece2 = new OceanMonumentPieces.MonumentBuilding(worldgenRandom, i, j, direction2);
StructurePiecesBuilder structurePiecesBuilder = new StructurePiecesBuilder();
structurePiecesBuilder.addPiece(structurePiece2);
return structurePiecesBuilder.build();
}
}
@Override
public StructureType<?> type() {
return StructureType.OCEAN_MONUMENT;
}
}