From ab6e3ad87fd4af95e762595c2a0d397907480ffe Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 24 Mar 2025 20:16:57 +0700 Subject: [PATCH] Use sets only for final placements, use lists for intermediate --- .../mc/otm/worldgen/EnhancedPlacedFeature.kt | 10 ++++++---- .../mc/otm/worldgen/EnhancedPlacementContext.kt | 4 ++-- .../worldgen/placement/EnhancedPlacementModifier.kt | 8 ++++---- 3 files changed, 12 insertions(+), 10 deletions(-) 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 b413d6273..949be55a7 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/EnhancedPlacedFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/EnhancedPlacedFeature.kt @@ -11,6 +11,7 @@ import com.mojang.serialization.DynamicOps import com.mojang.serialization.codecs.RecordCodecBuilder import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream import it.unimi.dsi.fastutil.objects.ObjectArraySet +import it.unimi.dsi.fastutil.objects.ObjectRBTreeSet import net.minecraft.Util import net.minecraft.core.BlockPos import net.minecraft.core.Holder @@ -24,6 +25,7 @@ import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfigur import net.minecraft.world.level.levelgen.placement.PlacedFeature import net.minecraft.world.level.levelgen.placement.PlacementModifier import ru.dbotthepony.kommons.util.XXHash64 +import ru.dbotthepony.mc.otm.core.collect.BlockPosHashStrategy import ru.dbotthepony.mc.otm.core.util.GJRAND64RandomSource import ru.dbotthepony.mc.otm.data.codec.minRange import ru.dbotthepony.mc.otm.worldgen.feature.EnhancedFeature @@ -112,10 +114,10 @@ object EnhancedPlacedFeature : Feature( ) { class Node(val children: List, val contents: Either>>){ fun evaluate(context: EnhancedPlacementContext) { - evaluate(context, setOf(BlockPos(context.origin.minBlockX, 0, context.origin.minBlockZ))) + evaluate(context, listOf(BlockPos(context.origin.minBlockX, 0, context.origin.minBlockZ))) } - private fun evaluate(context: EnhancedPlacementContext, positions: Set) { + private fun evaluate(context: EnhancedPlacementContext, positions: List) { val actualPositions = if (contents.left().isPresent) { contents.left().get().evaluate(context, positions) } else { @@ -143,8 +145,8 @@ object EnhancedPlacedFeature : Feature( // TODO: extremely inefficient private val placed = ArrayList() - override fun place(context: EnhancedPlacementContext, positions: Set, feature: EnhancedFeature.Configured<*, *>) { - placed.add(Placement(context, positions, feature)) + override fun place(context: EnhancedPlacementContext, positions: List, feature: EnhancedFeature.Configured<*, *>) { + placed.add(Placement(context, ObjectRBTreeSet(BlockPosHashStrategy).also { it.addAll(positions) }, feature)) } fun place(context: FeaturePlaceContext<*>): Boolean { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/EnhancedPlacementContext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/EnhancedPlacementContext.kt index 1d77163ab..3cdd33f4d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/EnhancedPlacementContext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/EnhancedPlacementContext.kt @@ -15,7 +15,7 @@ import kotlin.collections.HashMap class EnhancedPlacementContext { fun interface Placer { - fun place(context: EnhancedPlacementContext, positions: Set, feature: EnhancedFeature.Configured<*, *>) + fun place(context: EnhancedPlacementContext, positions: List, feature: EnhancedFeature.Configured<*, *>) } val level: WorldGenLevel @@ -79,7 +79,7 @@ class EnhancedPlacementContext { return EnhancedPlacementContext(this) } - fun place(positions: Set, feature: EnhancedFeature.Configured<*, *>) { + fun place(positions: List, feature: EnhancedFeature.Configured<*, *>) { placer.place(this, positions, feature) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/EnhancedPlacementModifier.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/EnhancedPlacementModifier.kt index f9c3858ed..2dbe46ead 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/EnhancedPlacementModifier.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/EnhancedPlacementModifier.kt @@ -20,15 +20,15 @@ interface EnhancedPlacementModifier { val codec: MapCodec } - fun evaluate(context: EnhancedPlacementContext, positions: Set): Set + fun evaluate(context: EnhancedPlacementContext, positions: List): List val type: Type<*> class Wrapper(val parent: PlacementModifier) : EnhancedPlacementModifier { - override fun evaluate(context: EnhancedPlacementContext, positions: Set): Set { + override fun evaluate(context: EnhancedPlacementContext, positions: List): List { return positions.stream() .flatMap { parent.getPositions(context.vanillaContext, context.random, it) } // use Red-Black tree set instead of AVL tree set because we are write-intense - .collect(Collectors.toCollection { ObjectRBTreeSet(BlockPosHashStrategy) }) + .collect(Collectors.toCollection(::ArrayList)) } override val type: Type<*> @@ -40,7 +40,7 @@ interface EnhancedPlacementModifier { } object Passthrough : EnhancedPlacementModifier, Type { - override fun evaluate(context: EnhancedPlacementContext, positions: Set): Set { + override fun evaluate(context: EnhancedPlacementContext, positions: List): List { return positions }