From 8987dc5270d903472cde865ecfe9b01f7fb3bc69 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Tue, 9 Apr 2024 10:59:20 +0700 Subject: [PATCH] Use linked map and linked set so placements appear in the same order as they were supplied by dungeon parts --- .../kstarbound/defs/dungeon/DungeonWorld.kt | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/dungeon/DungeonWorld.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/dungeon/DungeonWorld.kt index b6f48478..d806b8fd 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/dungeon/DungeonWorld.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/dungeon/DungeonWorld.kt @@ -30,6 +30,7 @@ import ru.dbotthepony.kstarbound.world.entities.tile.TileEntity import ru.dbotthepony.kstarbound.world.entities.tile.WorldObject import ru.dbotthepony.kstarbound.world.physics.Poly import java.util.Collections +import java.util.LinkedHashSet import java.util.concurrent.CompletableFuture import java.util.function.Consumer import java.util.random.RandomGenerator @@ -148,11 +149,11 @@ class DungeonWorld(val parent: ServerWorld, val random: RandomGenerator, val mar private val pendingLiquids = HashMap(8192, 0.5f) - private val openLocalWires = HashMap>() - private val globalWires = HashMap>() + private val openLocalWires = LinkedHashMap>() + private val globalWires = LinkedHashMap>() private val localWires = ArrayList>() - private val placedObjects = HashMap() + private val placedObjects = LinkedHashMap() var playerStart: Vector2d? = null @@ -172,7 +173,7 @@ class DungeonWorld(val parent: ServerWorld, val random: RandomGenerator, val mar fun placeWiring(x: Int, y: Int, group: String, partLocal: Boolean) { val table = if (partLocal) openLocalWires else globalWires - table.computeIfAbsent(group) { HashSet() }.add(geometry.wrap(Vector2i(x, y))) + table.computeIfAbsent(group) { LinkedHashSet() }.add(geometry.wrap(Vector2i(x, y))) } fun requestLiquid(x: Int, y: Int, liquid: AbstractLiquidState) { @@ -481,14 +482,11 @@ class DungeonWorld(val parent: ServerWorld, val random: RandomGenerator, val mar if (playerStart != null) parent.setPlayerSpawn(playerStart!!, false) - val placedObjects = placedObjects.entries.stream() - .sorted { o1, o2 -> o1.key.y.compareTo(o2.key.y) } // place objects from bottom to top - // so objects stacked on each other can be properly placed + val placedObjects = placedObjects.entries .map { (pos, data) -> WorldObject.create(data.prototype, pos, data.parameters) to data.direction } .filter { it.first != null } - .toList() parent.eventLoop.supplyAsync { for ((obj, direction) in placedObjects) {