@@ -13,6 +13,7 @@ import net.minecraft.entity.player.PlayerEntity
1313import net.minecraft.util.math.BlockPos
1414import net.minecraft.util.math.Box
1515import net.minecraft.world.World
16+ import java.util.PriorityQueue
1617import java.util.UUID
1718
1819/* *
@@ -26,6 +27,8 @@ object CobbleworkersNavigationUtils {
2627 private val pokemonToPlayerTarget = mutableMapOf<UUID , UUID >()
2728 private val targetedPlayers = mutableMapOf<UUID , Claim >()
2829 private val recentlyExpiredTargets = mutableMapOf<BlockPos , ExpiredTarget >()
30+ private val expiredQueue = PriorityQueue <ExpiredTarget >(compareBy { it.expiryTick })
31+ private var lastCleanUpTick = 0L
2932 private const val CLAIM_TIMEOUT_TICKS = 140L
3033 private const val EXPIRED_TARGET_TIMEOUT_TICKS = 300L
3134
@@ -99,7 +102,9 @@ object CobbleworkersNavigationUtils {
99102 val releasedTarget = pokemonToTarget.remove(pokemonId)
100103 if (releasedTarget != null ) {
101104 targetedBlocks.remove(releasedTarget)
102- recentlyExpiredTargets[releasedTarget] = ExpiredTarget (releasedTarget, world.time)
105+ val expired = ExpiredTarget (releasedTarget, world.time)
106+ recentlyExpiredTargets[releasedTarget] = expired
107+ expiredQueue.add(expired)
103108 }
104109 }
105110
@@ -150,6 +155,10 @@ object CobbleworkersNavigationUtils {
150155 */
151156 private fun releaseExpiredClaims (world : World ) {
152157 val now = world.time
158+
159+ if (now - lastCleanUpTick < 20 ) return
160+ lastCleanUpTick = now
161+
153162 val expiredPokemon = mutableListOf<UUID >()
154163
155164 // Check block claims
@@ -167,7 +176,9 @@ object CobbleworkersNavigationUtils {
167176 releasePlayerTarget(it)
168177 }
169178
170- recentlyExpiredTargets.entries.removeIf { now - it.value.expiryTick > EXPIRED_TARGET_TIMEOUT_TICKS }
179+ while (expiredQueue.isNotEmpty() && now - expiredQueue.peek().expiryTick > EXPIRED_TARGET_TIMEOUT_TICKS ) {
180+ recentlyExpiredTargets.remove(expiredQueue.poll().pos)
181+ }
171182 }
172183
173184 /* *
0 commit comments