Adapted Structures to 1.19

This commit is contained in:
Frank 2022-05-17 19:04:44 +02:00
parent e3953167ba
commit 3d93b8607b
11 changed files with 142 additions and 76 deletions

View file

@ -39,7 +39,7 @@ import net.minecraft.util.RandomSource;
public class VentBubbleColumnBlock extends Block implements BucketPickup, LiquidBlockContainer { public class VentBubbleColumnBlock extends Block implements BucketPickup, LiquidBlockContainer {
public VentBubbleColumnBlock() { public VentBubbleColumnBlock() {
super(FabricBlockSettings.of(Material.BUBBLE_COLUMN).noOcclusion().noCollission().noDrops()); super(FabricBlockSettings.of(Material.BUBBLE_COLUMN).nonOpaque().noCollision().noLootTable());
} }
@Override @Override

View file

@ -31,49 +31,49 @@ public class EndStructures {
public static final StructurePieceType PAINTED_MOUNTAIN_PIECE = register("painted_mountain_piece", PaintedMountainPiece::new); public static final StructurePieceType PAINTED_MOUNTAIN_PIECE = register("painted_mountain_piece", PaintedMountainPiece::new);
public static final StructurePieceType NBT_PIECE = register("nbt_piece", NBTPiece::new); public static final StructurePieceType NBT_PIECE = register("nbt_piece", NBTPiece::new);
public static final BCLStructure<GiantMossyGlowshroomStructure> GIANT_MOSSY_GLOWSHROOM = new BCLStructure( public static final BCLStructure<GiantMossyGlowshroomStructure> GIANT_MOSSY_GLOWSHROOM = new BCLStructure<>(
BetterEnd.makeID("giant_mossy_glowshroom"), BetterEnd.makeID("giant_mossy_glowshroom"),
GiantMossyGlowshroomStructure::new, GiantMossyGlowshroomStructure::new,
Decoration.SURFACE_STRUCTURES, Decoration.SURFACE_STRUCTURES,
16, 16,
8 8
); );
public static final BCLStructure<MegaLakeStructure> MEGALAKE = new BCLStructure( public static final BCLStructure<MegaLakeStructure> MEGALAKE = new BCLStructure<>(
BetterEnd.makeID("megalake"), BetterEnd.makeID("megalake"),
MegaLakeStructure::new, MegaLakeStructure::new,
Decoration.RAW_GENERATION, Decoration.RAW_GENERATION,
4, 4,
1 1
); );
public static final BCLStructure<MegaLakeSmallStructure> MEGALAKE_SMALL = new BCLStructure( public static final BCLStructure<MegaLakeSmallStructure> MEGALAKE_SMALL = new BCLStructure<>(
BetterEnd.makeID("megalake_small"), BetterEnd.makeID("megalake_small"),
MegaLakeSmallStructure::new, MegaLakeSmallStructure::new,
Decoration.RAW_GENERATION, Decoration.RAW_GENERATION,
4, 4,
1 1
); );
public static final BCLStructure<MountainStructure> MOUNTAIN = new BCLStructure( public static final BCLStructure<MountainStructure> MOUNTAIN = new BCLStructure<>(
BetterEnd.makeID("mountain"), BetterEnd.makeID("mountain"),
MountainStructure::new, MountainStructure::new,
Decoration.RAW_GENERATION, Decoration.RAW_GENERATION,
3, 3,
2 2
); );
public static final BCLStructure<PaintedMountainStructure> PAINTED_MOUNTAIN = new BCLStructure( public static final BCLStructure<PaintedMountainStructure> PAINTED_MOUNTAIN = new BCLStructure<>(
BetterEnd.makeID("painted_mountain"), BetterEnd.makeID("painted_mountain"),
PaintedMountainStructure::new, PaintedMountainStructure::new,
Decoration.RAW_GENERATION, Decoration.RAW_GENERATION,
3, 3,
2 2
); );
public static final BCLStructure<EternalPortalStructure> ETERNAL_PORTAL = new BCLStructure( public static final BCLStructure<EternalPortalStructure> ETERNAL_PORTAL = new BCLStructure<>(
BetterEnd.makeID("eternal_portal"), BetterEnd.makeID("eternal_portal"),
EternalPortalStructure::new, EternalPortalStructure::new,
Decoration.SURFACE_STRUCTURES, Decoration.SURFACE_STRUCTURES,
16, 16,
6 6
); );
public static final BCLStructure<GiantIceStarStructure> GIANT_ICE_STAR = new BCLStructure( public static final BCLStructure<GiantIceStarStructure> GIANT_ICE_STAR = new BCLStructure<>(
BetterEnd.makeID("giant_ice_star"), BetterEnd.makeID("giant_ice_star"),
GiantIceStarStructure::new, GiantIceStarStructure::new,
Decoration.SURFACE_STRUCTURES, Decoration.SURFACE_STRUCTURES,

View file

@ -8,6 +8,8 @@ import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.Heightmap.Types;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.structure.StructureType;
import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator;
import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder;
@ -15,24 +17,26 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemp
import ru.bclib.util.StructureHelper; import ru.bclib.util.StructureHelper;
import ru.bclib.world.structures.BCLStructure; import ru.bclib.world.structures.BCLStructure;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.registry.EndStructures;
import ru.betterend.world.structures.piece.NBTPiece; import ru.betterend.world.structures.piece.NBTPiece;
import java.util.Optional;
import java.util.Random; import java.util.Random;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import javax.swing.text.html.Option;
public class EternalPortalStructure extends FeatureBaseStructure { public class EternalPortalStructure extends FeatureBaseStructure {
private static final ResourceLocation STRUCTURE_ID = BetterEnd.makeID("portal/eternal_portal"); private static final ResourceLocation STRUCTURE_ID = BetterEnd.makeID("portal/eternal_portal");
private static final StructureTemplate STRUCTURE = StructureHelper.readStructure(STRUCTURE_ID); private static final StructureTemplate STRUCTURE = StructureHelper.readStructure(STRUCTURE_ID);
public EternalPortalStructure() { public EternalPortalStructure(StructureSettings s) {
super(PieceGeneratorSupplier.simple( super(s);
EternalPortalStructure::checkLocation,
EternalPortalStructure::generatePieces)
);
} }
protected static boolean checkLocation(PieceGeneratorSupplier.Context<NoneFeatureConfiguration> context) { @Override
if (!BCLStructure.isValidBiome(context)) return false; public Optional<GenerationStub> findGenerationPoint(GenerationContext context) {
if (!BCLStructure.isValidBiome(context)) return Optional.empty();
final ChunkPos chunkPos = context.chunkPos(); final ChunkPos chunkPos = context.chunkPos();
final ChunkGenerator chunkGenerator = context.chunkGenerator(); final ChunkGenerator chunkGenerator = context.chunkGenerator();
@ -41,27 +45,33 @@ public class EternalPortalStructure extends FeatureBaseStructure {
long x = (long) chunkPos.x * (long) chunkPos.x; long x = (long) chunkPos.x * (long) chunkPos.x;
long z = (long) chunkPos.z * (long) chunkPos.z; long z = (long) chunkPos.z * (long) chunkPos.z;
if (x + z < 1024L) { if (x + z < 1024L) {
return false; return Optional.empty();
} }
if (chunkGenerator.getBaseHeight( if (chunkGenerator.getBaseHeight(
chunkPos.getBlockX(8), chunkPos.getBlockX(8),
chunkPos.getBlockZ(8), chunkPos.getBlockZ(8),
Heightmap.Types.WORLD_SURFACE_WG, Heightmap.Types.WORLD_SURFACE_WG,
levelHeightAccessor levelHeightAccessor,
context.randomState()
) < 5) { ) < 5) {
return false; return Optional.empty();
} }
return FeatureBaseStructure.checkLocation(context); return super.findGenerationPoint(context);
} }
protected static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context<NoneFeatureConfiguration> context) { @Override
public StructureType<EternalPortalStructure> type() {
return EndStructures.ETERNAL_PORTAL.structureType;
}
protected void generatePieces(StructurePiecesBuilder structurePiecesBuilder, GenerationContext context) {
final RandomSource random = context.random(); final RandomSource random = context.random();
final ChunkPos chunkPos = context.chunkPos(); final ChunkPos chunkPos = context.chunkPos();
final ChunkGenerator chunkGenerator = context.chunkGenerator(); final ChunkGenerator chunkGenerator = context.chunkGenerator();
final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); final LevelHeightAccessor levelHeightAccessor = context.heightAccessor();
int x = chunkPos.getBlockX(8); int x = chunkPos.getBlockX(8);
int z = chunkPos.getBlockZ(8); int z = chunkPos.getBlockZ(8);
int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor, context.randomState());
structurePiecesBuilder.addPiece(new NBTPiece( structurePiecesBuilder.addPiece(new NBTPiece(
STRUCTURE_ID, STRUCTURE_ID,
STRUCTURE, STRUCTURE,

View file

@ -1,7 +1,10 @@
package ru.betterend.world.structures.features; package ru.betterend.world.structures.features;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.LevelHeightAccessor;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.Rotation;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
@ -14,22 +17,37 @@ import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier;
import ru.bclib.world.structures.BCLStructure; import ru.bclib.world.structures.BCLStructure;
import java.util.Optional;
import java.util.Random; import java.util.Random;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder;
public abstract class FeatureBaseStructure extends Structure { public abstract class FeatureBaseStructure extends Structure {
protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); protected static final BlockState AIR = Blocks.AIR.defaultBlockState();
public FeatureBaseStructure(PieceGeneratorSupplier<NoneFeatureConfiguration> pieceGeneratorSupplier) { public FeatureBaseStructure(Structure.StructureSettings structureSettings) {
super(NoneFeatureConfiguration.CODEC, pieceGeneratorSupplier); super(structureSettings);
} }
protected static boolean checkLocation(PieceGeneratorSupplier.Context<NoneFeatureConfiguration> context) { @Override
return getGenerationHeight(context.chunkPos(), context.chunkGenerator(), context.heightAccessor(), context.randomState()) >= 20 && BCLStructure.isValidBiome(context); public Optional<GenerationStub> findGenerationPoint(GenerationContext context) {
BlockPos pos = getGenerationHeight(context.chunkPos(), context.chunkGenerator(), context.heightAccessor(), context.randomState());
if (pos.getZ() >= 20 && BCLStructure.isValidBiome(context)){
return Optional.of(new Structure.GenerationStub(pos, (structurePiecesBuilder) -> {
generatePieces(structurePiecesBuilder, context);
}));
}
return Optional.empty();
} }
private static int getGenerationHeight(ChunkPos chunkPos, ChunkGenerator chunkGenerator, LevelHeightAccessor levelHeightAccessor, RandomState rState) { protected Holder<Biome> getNoiseBiome(ChunkGenerator cg, RandomState rState, int i, int j, int k) {
LegacyRandomSource random = new LegacyRandomSource((long) (chunkPos.x + chunkPos.z * 10387313)); return cg.getBiomeSource().getNoiseBiome(i, j, k, rState.sampler());
}
protected abstract void generatePieces(StructurePiecesBuilder structurePiecesBuilder, Structure.GenerationContext context);
private static BlockPos getGenerationHeight(ChunkPos chunkPos, ChunkGenerator chunkGenerator, LevelHeightAccessor levelHeightAccessor, RandomState rState) {
LegacyRandomSource random = new LegacyRandomSource(chunkPos.x + chunkPos.z * 10387313);
Rotation blockRotation = Rotation.getRandom(random); Rotation blockRotation = Rotation.getRandom(random);
int i = 5; int i = 5;
@ -56,6 +74,6 @@ public abstract class FeatureBaseStructure extends Structure {
Heightmap.Types.WORLD_SURFACE_WG, Heightmap.Types.WORLD_SURFACE_WG,
levelHeightAccessor, rState levelHeightAccessor, rState
); );
return Math.min(Math.min(m, n), Math.min(o, p)); return new BlockPos(k, l, Math.min(Math.min(m, n), Math.min(o, p)));
} }
} }

View file

@ -7,6 +7,7 @@ import net.minecraft.world.level.LevelHeightAccessor;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
import net.minecraft.world.level.levelgen.structure.StructureType;
import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder;
import ru.bclib.sdf.SDF; import ru.bclib.sdf.SDF;
@ -16,6 +17,7 @@ import ru.bclib.sdf.operator.SDFUnion;
import ru.bclib.sdf.primitive.SDFCappedCone; import ru.bclib.sdf.primitive.SDFCappedCone;
import ru.bclib.util.MHelper; import ru.bclib.util.MHelper;
import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndStructures;
import ru.betterend.world.structures.piece.VoxelPiece; import ru.betterend.world.structures.piece.VoxelPiece;
import java.util.ArrayList; import java.util.ArrayList;
@ -29,8 +31,13 @@ public class GiantIceStarStructure extends SDFStructureFeature {
private static final int minCount = 25; private static final int minCount = 25;
private static final int maxCount = 40; private static final int maxCount = 40;
public GiantIceStarStructure() { public GiantIceStarStructure(StructureSettings s) {
super(GiantIceStarStructure::generatePieces); super(s);
}
@Override
public StructureType<GiantIceStarStructure> type() {
return EndStructures.GIANT_ICE_STAR.structureType;
} }
protected static SDF getSDF(BlockPos pos, RandomSource random) { protected static SDF getSDF(BlockPos pos, RandomSource random) {
@ -105,7 +112,7 @@ public class GiantIceStarStructure extends SDFStructureFeature {
return result; return result;
} }
public static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context<NoneFeatureConfiguration> context) { public void generatePieces(StructurePiecesBuilder structurePiecesBuilder, GenerationContext context) {
final RandomSource random = context.random(); final RandomSource random = context.random();
final ChunkPos chunkPos = context.chunkPos(); final ChunkPos chunkPos = context.chunkPos();
final ChunkGenerator chunkGenerator = context.chunkGenerator(); final ChunkGenerator chunkGenerator = context.chunkGenerator();

View file

@ -4,6 +4,7 @@ import com.mojang.math.Vector3f;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
import net.minecraft.world.level.levelgen.structure.StructureType;
import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder;
import ru.bclib.sdf.SDF; import ru.bclib.sdf.SDF;
@ -27,17 +28,20 @@ import ru.betterend.blocks.MossyGlowshroomCapBlock;
import ru.betterend.blocks.basis.FurBlock; import ru.betterend.blocks.basis.FurBlock;
import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.noise.OpenSimplexNoise;
import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndStructures;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
public class GiantMossyGlowshroomStructure extends SDFStructureFeature { public class GiantMossyGlowshroomStructure extends SDFStructureFeature {
public GiantMossyGlowshroomStructure() { public GiantMossyGlowshroomStructure(StructureSettings s) {
super(GiantMossyGlowshroomStructure::generatePieces); super(s);
} }
public static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context<NoneFeatureConfiguration> context) {
@Override
protected void generatePieces(StructurePiecesBuilder structurePiecesBuilder, GenerationContext context) {
SDFStructureFeature.generatePieces(structurePiecesBuilder, context, GiantMossyGlowshroomStructure::getSDF); SDFStructureFeature.generatePieces(structurePiecesBuilder, context, GiantMossyGlowshroomStructure::getSDF);
} }
@ -156,4 +160,10 @@ public class GiantMossyGlowshroomStructure extends SDFStructureFeature {
return info.getState(); return info.getState();
}); });
} }
@Override
public StructureType<GiantMossyGlowshroomStructure> type() {
return EndStructures.GIANT_MOSSY_GLOWSHROOM.structureType;
}
} }

View file

@ -7,36 +7,42 @@ import net.minecraft.world.level.LevelHeightAccessor;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.Heightmap.Types;
import net.minecraft.world.level.levelgen.RandomState;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
import net.minecraft.world.level.levelgen.structure.StructureType;
import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator;
import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder;
import ru.bclib.util.MHelper; import ru.bclib.util.MHelper;
import ru.betterend.registry.EndStructures;
import ru.betterend.world.structures.piece.LakePiece; import ru.betterend.world.structures.piece.LakePiece;
import java.util.Random; import java.util.Random;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
public class MegaLakeSmallStructure extends FeatureBaseStructure { public class MegaLakeSmallStructure extends FeatureBaseStructure {
public MegaLakeSmallStructure() { public MegaLakeSmallStructure(StructureSettings s) {
super(PieceGeneratorSupplier.simple( super(s);
FeatureBaseStructure::checkLocation,
MegaLakeSmallStructure::generatePieces
));
} }
protected static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context<NoneFeatureConfiguration> context) { @Override
public StructureType<MegaLakeSmallStructure> type() {
return EndStructures.MEGALAKE_SMALL.structureType;
}
protected void generatePieces(StructurePiecesBuilder structurePiecesBuilder, GenerationContext context) {
final RandomSource random = context.random(); final RandomSource random = context.random();
final ChunkPos chunkPos = context.chunkPos(); final ChunkPos chunkPos = context.chunkPos();
final ChunkGenerator chunkGenerator = context.chunkGenerator(); final ChunkGenerator chunkGenerator = context.chunkGenerator();
final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); final LevelHeightAccessor levelHeightAccessor = context.heightAccessor();
final RandomState rState = context.randomState();
int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random));
int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random));
int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor, rState);
Holder<Biome> biome = chunkGenerator.getNoiseBiome(x >> 2, y >> 2, z >> 2); Holder<Biome> biome = getNoiseBiome(chunkGenerator, rState,x >> 2, y >> 2, z >> 2);
if (y > 5) { if (y > 5) {
float radius = MHelper.randRange(20, 40, random); float radius = MHelper.randRange(20, 40, random);
float depth = MHelper.randRange(5, 10, random); float depth = MHelper.randRange(5, 10, random);

View file

@ -7,11 +7,15 @@ import net.minecraft.world.level.LevelHeightAccessor;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.Heightmap.Types;
import net.minecraft.world.level.levelgen.RandomState;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.structure.StructureType;
import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator;
import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder;
import ru.bclib.util.MHelper; import ru.bclib.util.MHelper;
import ru.betterend.registry.EndStructures;
import ru.betterend.world.structures.piece.LakePiece; import ru.betterend.world.structures.piece.LakePiece;
import java.util.Random; import java.util.Random;
@ -20,33 +24,35 @@ import net.minecraft.util.RandomSource;
public class MegaLakeStructure extends FeatureBaseStructure { public class MegaLakeStructure extends FeatureBaseStructure {
public MegaLakeStructure() { public MegaLakeStructure(Structure.StructureSettings structureSettings){
super(PieceGeneratorSupplier.simple( super(structureSettings);
FeatureBaseStructure::checkLocation,
MegaLakeStructure::generatePieces
));
} }
protected static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context<NoneFeatureConfiguration> context) { @Override
public StructureType<MegaLakeStructure> type() {
return EndStructures.MEGALAKE.structureType;
}
protected void generatePieces(StructurePiecesBuilder structurePiecesBuilder, Structure.GenerationContext context) {
final RandomSource random = context.random(); final RandomSource random = context.random();
final ChunkPos chunkPos = context.chunkPos(); final ChunkPos chunkPos = context.chunkPos();
final ChunkGenerator chunkGenerator = context.chunkGenerator(); final ChunkGenerator chunkGenerator = context.chunkGenerator();
final RandomState rState = context.randomState();
final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); final LevelHeightAccessor levelHeightAccessor = context.heightAccessor();
int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random));
int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random));
int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor, rState);
if (y > 5) { if (y > 5) {
Holder<Biome> biome = chunkGenerator.getNoiseBiome(x >> 2, y >> 2, z >> 2); Holder<Biome> biome = getNoiseBiome(chunkGenerator, rState, x >> 2, y >> 2, z >> 2);
float radius = MHelper.randRange(32, 64, random); float radius = MHelper.randRange(32, 64, random);
float depth = MHelper.randRange(7, 15, random); float depth = MHelper.randRange(7, 15, random);
LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome);
structurePiecesBuilder.addPiece(piece); structurePiecesBuilder.addPiece(piece);
} }
//this.calculateBoundingBox();
} }
} }

View file

@ -7,11 +7,14 @@ import net.minecraft.world.level.LevelHeightAccessor;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.Heightmap.Types;
import net.minecraft.world.level.levelgen.RandomState;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
import net.minecraft.world.level.levelgen.structure.StructureType;
import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator;
import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder;
import ru.bclib.util.MHelper; import ru.bclib.util.MHelper;
import ru.betterend.registry.EndStructures;
import ru.betterend.world.structures.piece.CrystalMountainPiece; import ru.betterend.world.structures.piece.CrystalMountainPiece;
import java.util.Random; import java.util.Random;
@ -19,24 +22,27 @@ import net.minecraft.util.RandomSource;
public class MountainStructure extends FeatureBaseStructure { public class MountainStructure extends FeatureBaseStructure {
public MountainStructure() { public MountainStructure(StructureSettings s) {
super(PieceGeneratorSupplier.simple( super(s);
FeatureBaseStructure::checkLocation,
MountainStructure::generatePieces
));
} }
protected static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context<NoneFeatureConfiguration> context) { @Override
public StructureType<MountainStructure> type() {
return EndStructures.MOUNTAIN.structureType;
}
protected void generatePieces(StructurePiecesBuilder structurePiecesBuilder, GenerationContext context) {
final RandomSource random = context.random(); final RandomSource random = context.random();
final ChunkPos chunkPos = context.chunkPos(); final ChunkPos chunkPos = context.chunkPos();
final ChunkGenerator chunkGenerator = context.chunkGenerator(); final ChunkGenerator chunkGenerator = context.chunkGenerator();
final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); final LevelHeightAccessor levelHeightAccessor = context.heightAccessor();
final RandomState rState = context.randomState();
int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random));
int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random));
int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor, rState);
if (y > 5) { if (y > 5) {
Holder<Biome> biome = chunkGenerator.getNoiseBiome(x >> 2, y >> 2, z >> 2); Holder<Biome> biome = getNoiseBiome(chunkGenerator, rState,x >> 2, y >> 2, z >> 2);
float radius = MHelper.randRange(50, 100, random); float radius = MHelper.randRange(50, 100, random);
float height = radius * MHelper.randRange(0.8F, 1.2F, random); float height = radius * MHelper.randRange(0.8F, 1.2F, random);
CrystalMountainPiece piece = new CrystalMountainPiece( CrystalMountainPiece piece = new CrystalMountainPiece(

View file

@ -9,12 +9,15 @@ import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.Heightmap.Types;
import net.minecraft.world.level.levelgen.RandomState;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
import net.minecraft.world.level.levelgen.structure.StructureType;
import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator;
import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder;
import ru.bclib.util.MHelper; import ru.bclib.util.MHelper;
import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndStructures;
import ru.betterend.world.structures.piece.PaintedMountainPiece; import ru.betterend.world.structures.piece.PaintedMountainPiece;
import java.util.Random; import java.util.Random;
@ -23,24 +26,27 @@ import net.minecraft.util.RandomSource;
public class PaintedMountainStructure extends FeatureBaseStructure { public class PaintedMountainStructure extends FeatureBaseStructure {
private static final BlockState[] VARIANTS; private static final BlockState[] VARIANTS;
public PaintedMountainStructure() { public PaintedMountainStructure(StructureSettings s) {
super(PieceGeneratorSupplier.simple( super(s);
FeatureBaseStructure::checkLocation,
PaintedMountainStructure::generatePieces
));
} }
protected static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context<NoneFeatureConfiguration> context) { @Override
public StructureType<PaintedMountainStructure> type() {
return EndStructures.PAINTED_MOUNTAIN.structureType;
}
protected void generatePieces(StructurePiecesBuilder structurePiecesBuilder, GenerationContext context) {
final RandomSource random = context.random(); final RandomSource random = context.random();
final ChunkPos chunkPos = context.chunkPos(); final ChunkPos chunkPos = context.chunkPos();
final ChunkGenerator chunkGenerator = context.chunkGenerator(); final ChunkGenerator chunkGenerator = context.chunkGenerator();
final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); final LevelHeightAccessor levelHeightAccessor = context.heightAccessor();
final RandomState rState = context.randomState();
int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random));
int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random));
int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor,rState);
if (y > 50) { if (y > 50) {
Holder<Biome> biome = chunkGenerator.getNoiseBiome(x >> 2, y >> 2, z >> 2); Holder<Biome> biome = getNoiseBiome(chunkGenerator, rState, x >> 2, y >> 2, z >> 2);
float radius = MHelper.randRange(50, 100, random); float radius = MHelper.randRange(50, 100, random);
float height = radius * MHelper.randRange(0.4F, 0.6F, random); float height = radius * MHelper.randRange(0.4F, 0.6F, random);
int count = MHelper.floor(height * MHelper.randRange(0.1F, 0.35F, random) + 1); int count = MHelper.floor(height * MHelper.randRange(0.1F, 0.35F, random) + 1);

View file

@ -18,21 +18,18 @@ import net.minecraft.util.RandomSource;
import java.util.function.BiFunction; import java.util.function.BiFunction;
public abstract class SDFStructureFeature extends FeatureBaseStructure { public abstract class SDFStructureFeature extends FeatureBaseStructure {
public SDFStructureFeature(PieceGenerator<NoneFeatureConfiguration> generator) { public SDFStructureFeature(StructureSettings s) {
super(PieceGeneratorSupplier.simple( super(s);
FeatureBaseStructure::checkLocation,
generator
));
} }
public static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context<NoneFeatureConfiguration> context, BiFunction<BlockPos, Random, SDF> sdf) { public static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, GenerationContext context, BiFunction<BlockPos, RandomSource, SDF> sdf) {
final RandomSource random = context.random(); final RandomSource random = context.random();
final ChunkPos chunkPos = context.chunkPos(); final ChunkPos chunkPos = context.chunkPos();
final ChunkGenerator chunkGenerator = context.chunkGenerator(); final ChunkGenerator chunkGenerator = context.chunkGenerator();
final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); final LevelHeightAccessor levelHeightAccessor = context.heightAccessor();
int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random));
int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random));
int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor, context.randomState());
if (y > 5) { if (y > 5) {
BlockPos start = new BlockPos(x, y, z); BlockPos start = new BlockPos(x, y, z);
VoxelPiece piece = new VoxelPiece((world) -> { VoxelPiece piece = new VoxelPiece((world) -> {