From 23dab02cc56f6402c8b3aecffb32343f9d08b1d0 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Thu, 2 May 2024 19:24:15 +0700 Subject: [PATCH] Eliminate unintentional entity tick time increase --- .../world/entities/AbstractEntity.kt | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/world/entities/AbstractEntity.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/world/entities/AbstractEntity.kt index 779b0c1b..8774d7c1 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/world/entities/AbstractEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/world/entities/AbstractEntity.kt @@ -254,17 +254,30 @@ abstract class AbstractEntity : Comparable { } } - // for fast check on completed tasks // This is necessary to cancel tasks when we are removed, so we don't reference ourselves // in event loop after we have been removed - private val scheduledTasks = PriorityQueue>() + private val scheduledTasks = ObjectArrayList>() protected fun scheduleInTicks(ticks: Int, action: Runnable) { - scheduledTasks.add(world.eventLoop.schedule(action, ticks * Starbound.TIMESTEP_NANOS, TimeUnit.NANOSECONDS)) + var task: ScheduledFuture<*>? = null + + task = world.eventLoop.schedule(Runnable { + scheduledTasks.remove(task!!) + action.run() + }, ticks * Starbound.TIMESTEP_NANOS, TimeUnit.NANOSECONDS) + + scheduledTasks.add(task) } protected fun schedule(time: Long, unit: TimeUnit, action: Runnable) { - scheduledTasks.add(world.eventLoop.schedule(action, time, unit)) + var task: ScheduledFuture<*>? = null + + task = world.eventLoop.schedule(Runnable { + scheduledTasks.remove(task!!) + action.run() + }, time, unit) + + scheduledTasks.add(task) } var isRemote: Boolean = false @@ -382,10 +395,6 @@ abstract class AbstractEntity : Comparable { open fun damagedOther(notification: DamageNotificationPacket) {} open fun tick(delta: Double) { - while (scheduledTasks.isNotEmpty() && scheduledTasks.peek().isDone) { - scheduledTasks.poll() - } - if (networkGroup.upstream.isInterpolating) { networkGroup.upstream.tickInterpolation(delta) }