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(
parameters = AbstractEnormousPlacement.Parameters(
chunkScanRange = 5,
seedMix = 237483209523709234L,
placementModifiers = listOf(
RarityFilter.onAverageOnceEvery(120),
InSquarePlacement.spread(),
HeightRangePlacement.of(StandardDeviationHeightProvider(VerticalAnchor.absolute(0), 15.0)),
)
),
),
x = ringularity,
y = ringularity,

View File

@ -34,6 +34,7 @@ abstract class AbstractEnormousPlacement(val parameters: Parameters) : Placement
* Too small value will cause placement cutoffs
*/
val chunkScanRange: Int,
val seedMix: Long,
/**
* 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>) {
// TODO: memory inefficient
private val positions = ArrayList<BlockPos>()
init {
positions.forEach { this.positions.add(it) }
}
// TODO: this is primitive implementation, need to implement better one
fun getPositions(pos: ChunkPos): Stream<BlockPos> {
return positions.stream().filter {
SectionPos.blockToSectionCoord(it.x) == pos.x &&
@ -67,7 +70,8 @@ abstract class AbstractEnormousPlacement(val parameters: Parameters) : Placement
.build<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))
parameters.placementModifiers.forEach { modifier -> stream = stream.flatMap { modifier.getPositions(context, random, it).sequential() } }
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 {
it.group(
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),
).apply(it, ::Parameters)
}