Add seed mix to enormous placements

This commit is contained in:
DBotThePony 2025-03-02 11:33:28 +07:00
parent cc9ebef018
commit 97d30d3a19
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 8 additions and 2 deletions

View File

@ -121,11 +121,12 @@ fun registerPlacedFeatures(context: BootstrapContext<PlacedFeature>) {
EnormousEllipsoidPlacement( EnormousEllipsoidPlacement(
parameters = AbstractEnormousPlacement.Parameters( parameters = AbstractEnormousPlacement.Parameters(
chunkScanRange = 5, chunkScanRange = 5,
seedMix = 237483209523709234L,
placementModifiers = listOf( placementModifiers = listOf(
RarityFilter.onAverageOnceEvery(120), RarityFilter.onAverageOnceEvery(120),
InSquarePlacement.spread(), InSquarePlacement.spread(),
HeightRangePlacement.of(StandardDeviationHeightProvider(VerticalAnchor.absolute(0), 15.0)), HeightRangePlacement.of(StandardDeviationHeightProvider(VerticalAnchor.absolute(0), 15.0)),
) ),
), ),
x = ringularity, x = ringularity,
y = ringularity, y = ringularity,

View File

@ -34,6 +34,7 @@ abstract class AbstractEnormousPlacement(val parameters: Parameters) : Placement
* Too small value will cause placement cutoffs * Too small value will cause placement cutoffs
*/ */
val chunkScanRange: Int, val chunkScanRange: Int,
val seedMix: Long,
/** /**
* Baseline placement modifiers, dictating how to appear in chunk * Baseline placement modifiers, dictating how to appear in chunk
@ -42,12 +43,14 @@ abstract class AbstractEnormousPlacement(val parameters: Parameters) : Placement
) )
private class GeneratedChunk(positions: Stream<BlockPos>) { private class GeneratedChunk(positions: Stream<BlockPos>) {
// TODO: memory inefficient
private val positions = ArrayList<BlockPos>() private val positions = ArrayList<BlockPos>()
init { init {
positions.forEach { this.positions.add(it) } positions.forEach { this.positions.add(it) }
} }
// TODO: this is primitive implementation, need to implement better one
fun getPositions(pos: ChunkPos): Stream<BlockPos> { fun getPositions(pos: ChunkPos): Stream<BlockPos> {
return positions.stream().filter { return positions.stream().filter {
SectionPos.blockToSectionCoord(it.x) == pos.x && SectionPos.blockToSectionCoord(it.x) == pos.x &&
@ -67,7 +70,8 @@ abstract class AbstractEnormousPlacement(val parameters: Parameters) : Placement
.build<ChunkPos, GeneratedChunk>() .build<ChunkPos, GeneratedChunk>()
private fun computeChunk(context: PlacementContext, pos: ChunkPos): GeneratedChunk { private fun computeChunk(context: PlacementContext, pos: ChunkPos): GeneratedChunk {
val random = RandomSource.create(context.level.seed + HashCommon.murmurHash3(pos.x + pos.z * 31)) // TODO: Maybe switch to something else other than original LCG PRNG? Original form of LCG is kinda bad for this kind of workload
val random = RandomSource.create(context.level.seed + HashCommon.murmurHash3(pos.x + pos.z * 31) + parameters.seedMix)
var stream = Stream.of(BlockPos(pos.minBlockX, 0, pos.minBlockZ)) var stream = Stream.of(BlockPos(pos.minBlockX, 0, pos.minBlockZ))
parameters.placementModifiers.forEach { modifier -> stream = stream.flatMap { modifier.getPositions(context, random, it).sequential() } } parameters.placementModifiers.forEach { modifier -> stream = stream.flatMap { modifier.getPositions(context, random, it).sequential() } }
return GeneratedChunk(stream.flatMap { getPositions(it, random) }) return GeneratedChunk(stream.flatMap { getPositions(it, random) })
@ -97,6 +101,7 @@ abstract class AbstractEnormousPlacement(val parameters: Parameters) : Placement
val PARAMETERS_CODEC: MapCodec<Parameters> = RecordCodecBuilder.mapCodec { val PARAMETERS_CODEC: MapCodec<Parameters> = RecordCodecBuilder.mapCodec {
it.group( it.group(
Codec.INT.minRange(0).fieldOf("chunk_scan_range").forGetter(Parameters::chunkScanRange), Codec.INT.minRange(0).fieldOf("chunk_scan_range").forGetter(Parameters::chunkScanRange),
Codec.LONG.fieldOf("seed_mix").forGetter(Parameters::seedMix),
CODEC.listOf().fieldOf("placement").forGetter(Parameters::placementModifiers), CODEC.listOf().fieldOf("placement").forGetter(Parameters::placementModifiers),
).apply(it, ::Parameters) ).apply(it, ::Parameters)
} }