use of net.minecraft.world.level.levelgen.structure.StructurePiece in project RepurposedStructures by TelepathicGrunt.
the class BuriableStructure method generatePieces.
public static <CC extends RSBuriableConfig> Optional<PieceGenerator<CC>> generatePieces(PieceGeneratorSupplier.Context<CC> context) {
BlockPos blockpos = new BlockPos(context.chunkPos().getMinBlockX(), context.chunkGenerator().getSeaLevel(), context.chunkPos().getMinBlockZ());
CC config = context.config();
return PieceLimitedJigsawManager.assembleJigsawStructure(context, new JigsawConfiguration(config.startPool, config.size), GeneralUtils.getCsfNameForConfig(config, context.registryAccess()), blockpos, false, false, Integer.MAX_VALUE, Integer.MIN_VALUE, (structurePiecesBuilder, pieces) -> {
GeneralUtils.centerAllPieces(blockpos, pieces);
Heightmap.Types heightMapToUse = config.useOceanHeightmap ? Heightmap.Types.OCEAN_FLOOR_WG : Heightmap.Types.WORLD_SURFACE_WG;
BoundingBox box = pieces.get(0).getBoundingBox();
int highestLandPos = context.chunkGenerator().getFirstOccupiedHeight(box.minX(), box.minZ(), heightMapToUse, context.heightAccessor());
highestLandPos = Math.min(highestLandPos, context.chunkGenerator().getFirstOccupiedHeight(box.minX(), box.maxZ(), heightMapToUse, context.heightAccessor()));
highestLandPos = Math.min(highestLandPos, context.chunkGenerator().getFirstOccupiedHeight(box.maxX(), box.minZ(), heightMapToUse, context.heightAccessor()));
highestLandPos = Math.min(highestLandPos, context.chunkGenerator().getFirstOccupiedHeight(box.maxX(), box.maxZ(), heightMapToUse, context.heightAccessor()));
if (config.useOceanHeightmap) {
int maxHeightForSubmerging = context.chunkGenerator().getSeaLevel() - box.getYSpan();
highestLandPos = Math.min(highestLandPos, maxHeightForSubmerging);
}
WorldgenRandom random = new WorldgenRandom(new LegacyRandomSource(0L));
random.setLargeFeatureSeed(context.seed(), context.chunkPos().x, context.chunkPos().z);
int heightDiff = highestLandPos - box.minY();
for (StructurePiece structurePiece : pieces) {
structurePiece.move(0, heightDiff + (config.offsetAmount), 0);
}
});
}
use of net.minecraft.world.level.levelgen.structure.StructurePiece 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);
}
}
});
}
use of net.minecraft.world.level.levelgen.structure.StructurePiece in project RepurposedStructures by TelepathicGrunt.
the class GeneralUtils method centerAllPieces.
// ////////////////////////////////////////////
public static void centerAllPieces(BlockPos targetPos, List<? extends StructurePiece> pieces) {
if (pieces.isEmpty())
return;
Vec3i structureCenter = pieces.get(0).getBoundingBox().getCenter();
int xOffset = targetPos.getX() - structureCenter.getX();
int zOffset = targetPos.getZ() - structureCenter.getZ();
for (StructurePiece structurePiece : pieces) {
structurePiece.move(xOffset, 0, zOffset);
}
}
use of net.minecraft.world.level.levelgen.structure.StructurePiece in project RepurposedStructures by TelepathicGrunt.
the class AdvancedDistanceJigsawStructure method generateDistancePieces.
public static <CC extends RSAdvancedDistanceConfig> Optional<PieceGenerator<CC>> generateDistancePieces(PieceGeneratorSupplier.Context<CC> context) {
BlockPos.MutableBlockPos blockpos = new BlockPos.MutableBlockPos(context.chunkPos().getMinBlockX(), 0, context.chunkPos().getMinBlockZ());
CC config = context.config();
if (config.maxY - config.minY <= 0) {
RepurposedStructures.LOGGER.error("MinY should always be less than MaxY or else a crash will occur or no pieces will spawn. Problematic structure is:" + config.startPool.unwrapKey().get().location());
}
WorldgenRandom random = new WorldgenRandom(new LegacyRandomSource(0L));
random.setLargeFeatureSeed(context.seed(), context.chunkPos().x, context.chunkPos().z);
int structureStartHeight = random.nextInt(config.maxY - config.minY) + config.minY;
blockpos.move(Direction.UP, structureStartHeight);
int topClipOff;
int bottomClipOff;
if (config.verticalRange.isEmpty()) {
// Help make sure the Jigsaw Blocks have room to spawn new pieces if structure is right on edge of maxY or topYLimit
topClipOff = config.clipOutOfBoundsPieces ? config.maxY + 5 : Integer.MAX_VALUE;
bottomClipOff = config.clipOutOfBoundsPieces ? config.minY - 5 : Integer.MIN_VALUE;
} else {
topClipOff = structureStartHeight + config.verticalRange.get();
bottomClipOff = structureStartHeight - config.verticalRange.get();
}
return PieceLimitedJigsawManager.assembleJigsawStructure(context, new JigsawConfiguration(config.startPool, config.size), GeneralUtils.getCsfNameForConfig(config, context.registryAccess()), blockpos, false, false, topClipOff, bottomClipOff, config.poolsThatIgnoreBoundaries, (structurePiecesBuilder, pieces) -> {
Optional<PoolElementStructurePiece> lowestPiece = pieces.stream().min(Comparator.comparingInt(p -> p.getBoundingBox().minY()));
int minY = lowestPiece.map(poolElementStructurePiece -> poolElementStructurePiece.getBoundingBox().minY()).orElseGet(blockpos::getY);
if (minY < context.chunkGenerator().getMinY()) {
int newOffset = context.chunkGenerator().getMinY() - minY;
for (StructurePiece piece : pieces) {
piece.move(0, newOffset, 0);
}
}
});
}
Aggregations