connection ticker: don't recreate tasks

That allows "3rd party" tickers to be registered
This commit is contained in:
Moritz Zwerger 2023-11-09 15:56:57 +01:00
parent afc7cbd579
commit 10c7d682d5
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4

View File

@ -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