Add seed mix to enormous placements
This commit is contained in:
parent
cc9ebef018
commit
97d30d3a19
@ -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,
|
||||
|
@ -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)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user