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(
|
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,
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user