From 10c7d682d50f06e43099d4afd3b2e41ce640b9f9 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Thu, 9 Nov 2023 15:56:57 +0100 Subject: [PATCH] connection ticker: don't recreate tasks That allows "3rd party" tickers to be registered --- .../connection/play/tick/ConnectionTicker.kt | 38 +++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/tick/ConnectionTicker.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/tick/ConnectionTicker.kt index dd94d6361..b0da1630e 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/tick/ConnectionTicker.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/tick/ConnectionTicker.kt @@ -32,6 +32,7 @@ class ConnectionTicker(private val connection: PlayConnection) { fun init() { + addDefault() connection::state.observe(this) { if (it != PlayConnectionStates.PLAYING) { unregister() @@ -43,16 +44,7 @@ class ConnectionTicker(private val connection: PlayConnection) { } } - - private fun register() { - if (registered) { - return - } - lock.lock() - if (registered || connection.state != PlayConnectionStates.PLAYING) { - lock.unlock() - return - } + private fun addDefault() { tasks += RepeatedTask(INTERVAL, maxDelay = MAX_DELAY) { connection.world.entities.tick() } @@ -77,10 +69,23 @@ class ConnectionTicker(private val connection: PlayConnection) { connection.world.time = WorldTime(time + offset, connection.world.time.age + offset) } } + } + + + private fun register() { + if (registered) { + return + } + lock.lock() + if (registered || connection.state != PlayConnectionStates.PLAYING) { + lock.unlock() + return + } for (task in tasks) { TaskScheduler += task } + registered = true lock.unlock() } @@ -94,11 +99,22 @@ class ConnectionTicker(private val connection: PlayConnection) { for (task in tasks) { TaskScheduler -= task } - tasks.clear() registered = false lock.unlock() } + fun register(runnable: Runnable) { + lock.lock() + val task = RepeatedTask(INTERVAL, maxDelay = MAX_DELAY, runnable = runnable) + this.tasks += task + if (registered) { + TaskScheduler += task + } + lock.unlock() + } + + operator fun plusAssign(runnable: Runnable) = register(runnable) + private companion object { const val INTERVAL = ProtocolDefinition.TICK_TIME const val MAX_DELAY = INTERVAL / 2