Search in sources :

Example 1 with RSMineshaftEndConfig

use of com.telepathicgrunt.repurposedstructures.world.structures.configs.RSMineshaftEndConfig in project RepurposedStructures by TelepathicGrunt.

the class MineshaftEndStructure method generateMineshaftEndPieces.

public static <CC extends RSMineshaftEndConfig> Optional<PieceGenerator<CC>> generateMineshaftEndPieces(PieceGeneratorSupplier.Context<CC> context) {
    CC config = context.config();
    BlockPos.MutableBlockPos blockpos = new BlockPos.MutableBlockPos(context.chunkPos().getMinBlockX(), 0, context.chunkPos().getMinBlockZ());
    BlockPos.MutableBlockPos islandTopBottomThickness = new BlockPos.MutableBlockPos(Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE);
    analyzeLand(context.chunkGenerator(), blockpos.getX(), blockpos.getZ(), islandTopBottomThickness, context.heightAccessor());
    int minThickness = config.minIslandThickness;
    int maxY = 53;
    int minY = 15;
    if (minThickness == 0) {
        blockpos.move(Direction.UP, 35);
    } else {
        WorldgenRandom random = new WorldgenRandom(new LegacyRandomSource(0L));
        random.setLargeFeatureSeed(context.seed(), context.chunkPos().x, context.chunkPos().z);
        int structureStartHeight = random.nextInt(Math.max(islandTopBottomThickness.getZ() - minThickness + 1, 1)) + islandTopBottomThickness.getY() + (minThickness / 2);
        blockpos.move(Direction.UP, structureStartHeight);
        maxY = islandTopBottomThickness.getX() - 5;
        minY = islandTopBottomThickness.getY();
        if (maxY - minY <= 5) {
            minY = maxY - 5;
        }
    }
    int finalMaxY = maxY;
    return PieceLimitedJigsawManager.assembleJigsawStructure(context, new JigsawConfiguration(config.startPool, config.size), GeneralUtils.getCsfNameForConfig(config, context.registryAccess()), blockpos, false, false, maxY, minY, config.poolsThatIgnoreBoundaries, (structurePiecesBuilder, pieces) -> {
        Optional<PoolElementStructurePiece> highestPiece = pieces.stream().max(Comparator.comparingInt(p -> p.getBoundingBox().maxY()));
        int topY = highestPiece.map(poolElementStructurePiece -> poolElementStructurePiece.getBoundingBox().maxY()).orElseGet(blockpos::getY);
        if (topY > finalMaxY) {
            int newOffset = finalMaxY - topY;
            for (StructurePiece piece : pieces) {
                piece.move(0, newOffset, 0);
            }
        }
    });
}
Also used : GeneralUtils(com.telepathicgrunt.repurposedstructures.utils.GeneralUtils) LevelHeightAccessor(net.minecraft.world.level.LevelHeightAccessor) PieceGeneratorSupplier(net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier) Direction(net.minecraft.core.Direction) RSMineshaftEndConfig(com.telepathicgrunt.repurposedstructures.world.structures.configs.RSMineshaftEndConfig) NoiseColumn(net.minecraft.world.level.NoiseColumn) BlockState(net.minecraft.world.level.block.state.BlockState) WorldgenRandom(net.minecraft.world.level.levelgen.WorldgenRandom) LegacyRandomSource(net.minecraft.world.level.levelgen.LegacyRandomSource) Vector3f(com.mojang.math.Vector3f) PieceLimitedJigsawManager(com.telepathicgrunt.repurposedstructures.world.structures.pieces.PieceLimitedJigsawManager) ChunkGenerator(net.minecraft.world.level.chunk.ChunkGenerator) PieceGenerator(net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator) Codec(com.mojang.serialization.Codec) BlockPos(net.minecraft.core.BlockPos) PoolElementStructurePiece(net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece) Heightmap(net.minecraft.world.level.levelgen.Heightmap) Optional(java.util.Optional) JigsawConfiguration(net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration) StructurePiece(net.minecraft.world.level.levelgen.structure.StructurePiece) Comparator(java.util.Comparator) PoolElementStructurePiece(net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece) PoolElementStructurePiece(net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece) StructurePiece(net.minecraft.world.level.levelgen.structure.StructurePiece) LegacyRandomSource(net.minecraft.world.level.levelgen.LegacyRandomSource) JigsawConfiguration(net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration) BlockPos(net.minecraft.core.BlockPos) WorldgenRandom(net.minecraft.world.level.levelgen.WorldgenRandom)

Aggregations

Vector3f (com.mojang.math.Vector3f)1 Codec (com.mojang.serialization.Codec)1 GeneralUtils (com.telepathicgrunt.repurposedstructures.utils.GeneralUtils)1 RSMineshaftEndConfig (com.telepathicgrunt.repurposedstructures.world.structures.configs.RSMineshaftEndConfig)1 PieceLimitedJigsawManager (com.telepathicgrunt.repurposedstructures.world.structures.pieces.PieceLimitedJigsawManager)1 Comparator (java.util.Comparator)1 Optional (java.util.Optional)1 BlockPos (net.minecraft.core.BlockPos)1 Direction (net.minecraft.core.Direction)1 LevelHeightAccessor (net.minecraft.world.level.LevelHeightAccessor)1 NoiseColumn (net.minecraft.world.level.NoiseColumn)1 BlockState (net.minecraft.world.level.block.state.BlockState)1 ChunkGenerator (net.minecraft.world.level.chunk.ChunkGenerator)1 Heightmap (net.minecraft.world.level.levelgen.Heightmap)1 LegacyRandomSource (net.minecraft.world.level.levelgen.LegacyRandomSource)1 WorldgenRandom (net.minecraft.world.level.levelgen.WorldgenRandom)1 JigsawConfiguration (net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration)1 PoolElementStructurePiece (net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece)1 StructurePiece (net.minecraft.world.level.levelgen.structure.StructurePiece)1 PieceGenerator (net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator)1