From 97d30d3a19dd61352fdb693680e2167e4b01aedf Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sun, 2 Mar 2025 11:33:28 +0700 Subject: [PATCH] Add seed mix to enormous placements --- src/data/kotlin/ru/dbotthepony/mc/otm/datagen/WorldGen.kt | 3 ++- .../mc/otm/worldgen/placement/AbstractEnormousPlacement.kt | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/WorldGen.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/WorldGen.kt index a2e805f68..df638c7d2 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/WorldGen.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/WorldGen.kt @@ -121,11 +121,12 @@ fun registerPlacedFeatures(context: BootstrapContext) { 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, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/AbstractEnormousPlacement.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/AbstractEnormousPlacement.kt index 6c453cda4..4180a3afc 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/AbstractEnormousPlacement.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/AbstractEnormousPlacement.kt @@ -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) { + // TODO: memory inefficient private val positions = ArrayList() init { positions.forEach { this.positions.add(it) } } + // TODO: this is primitive implementation, need to implement better one fun getPositions(pos: ChunkPos): Stream { return positions.stream().filter { SectionPos.blockToSectionCoord(it.x) == pos.x && @@ -67,7 +70,8 @@ abstract class AbstractEnormousPlacement(val parameters: Parameters) : Placement .build() 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 = 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) }