diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/EnhancedPlacedFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/EnhancedPlacedFeature.kt index 3f9483e91..d6eaf6c68 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/EnhancedPlacedFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/EnhancedPlacedFeature.kt @@ -5,7 +5,6 @@ import com.github.benmanes.caffeine.cache.Caffeine import com.github.benmanes.caffeine.cache.Scheduler import com.mojang.serialization.Codec import com.mojang.serialization.codecs.RecordCodecBuilder -import it.unimi.dsi.fastutil.ints.Int2ObjectRBTreeMap import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream import it.unimi.dsi.fastutil.objects.ObjectArrayList import it.unimi.dsi.fastutil.objects.ObjectRBTreeSet @@ -31,6 +30,7 @@ import ru.dbotthepony.mc.otm.worldgen.placement.EnhancedPlacement import java.io.DataOutputStream import java.time.Duration import java.util.* +import kotlin.collections.ArrayList import kotlin.math.sqrt object EnhancedPlacedFeature : Feature( @@ -58,12 +58,12 @@ object EnhancedPlacedFeature : Feature( val root: EnhancedPlacement, ) : FeatureConfiguration { private class GeneratedChunk : EnhancedPlacementContext.Placer { - private data class Placement(val context: EnhancedPlacementContext, val positions: ObjectRBTreeSet, val feature: EnhancedFeature.Configured<*, *>) + private data class Placement(val context: EnhancedPlacementContext, val positions: TreeSet, val feature: EnhancedFeature.Configured<*, *>) private val placed = LinkedList() override fun place(context: EnhancedPlacementContext, positions: List, feature: EnhancedFeature.Configured<*, *>) { if (positions.isNotEmpty()) { - placed.add(Placement(context, ObjectRBTreeSet().also { it.addAll(positions) }, feature)) + placed.add(Placement(context, TreeSet().also { it.addAll(positions) }, feature)) } } @@ -72,12 +72,12 @@ object EnhancedPlacedFeature : Feature( val pos = ChunkPos(context.origin()) for ((eContext, positions, feature) in placed) { - val itr = positions.iterator(PlacementPos(BlockPos(pos.minBlockX, Int.MIN_VALUE, pos.minBlockZ), emptyVariableMap)) + val itr = positions.tailSet(PlacementPos(BlockPos(pos.minBlockX, Int.MIN_VALUE, pos.minBlockZ), emptyVariableMap)).iterator() if (!itr.hasNext()) continue - val result = ObjectRBTreeSet() + val result = TreeSet() for (placementPos in itr) { if (SectionPos.blockToSectionCoord(placementPos.pos.x) != pos.x || SectionPos.blockToSectionCoord(placementPos.pos.z) != pos.z) @@ -155,14 +155,21 @@ object EnhancedPlacedFeature : Feature( // between threads which lookup cache while it is being populated on neighbouring chunks withIndex.shuffle(THREAD_LOCAL_RANDOM) - val instances = Int2ObjectRBTreeMap() + data class P(val i: Int, val v: GeneratedChunk) : Comparable

{ + override fun compareTo(other: P): Int { + return i.compareTo(other.i) + } + } + + val instances = ArrayList

() + instances.sort() withIndex.forEach { (i, it) -> - instances.put(i, cache.get(it) { evaluate(context, it) }) + instances.add(P(i, cache.get(it) { evaluate(context, it) })) } var any = false - instances.values.forEach { any = it.place(context) } + instances.forEach { any = it.v.place(context) } return any } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/EllipsoidPlacement.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/EllipsoidPlacement.kt index 069423002..4c293e12f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/EllipsoidPlacement.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/EllipsoidPlacement.kt @@ -2,7 +2,6 @@ package ru.dbotthepony.mc.otm.worldgen.placement import com.mojang.serialization.MapCodec import com.mojang.serialization.codecs.RecordCodecBuilder -import it.unimi.dsi.fastutil.objects.ObjectRBTreeSet import net.minecraft.core.BlockPos import net.minecraft.util.RandomSource import net.minecraft.util.valueproviders.FloatProvider @@ -14,6 +13,7 @@ import ru.dbotthepony.mc.otm.core.collect.Vec3iHashStrategy import ru.dbotthepony.mc.otm.registry.data.MPlacementModifiers import ru.dbotthepony.mc.otm.worldgen.EnhancedPlacementContext import ru.dbotthepony.mc.otm.worldgen.PlacementPos +import java.util.* import java.util.stream.Stream /** @@ -61,9 +61,9 @@ data class EllipsoidPlacement( require(yLength.minValue >= 1f) { "Bad ellipsoid y minimal size: $yLength" } } - private fun evaluate(random: RandomSource, position: BlockPos): ObjectRBTreeSet { + private fun evaluate(random: RandomSource, position: BlockPos): Set { val count = count.sample(random) - val results = ObjectRBTreeSet(Vec3iHashStrategy) + val results = TreeSet(Vec3iHashStrategy) if (count <= 0) return results