Update block entity synchronization to match 1.20.2 chunk queue changes

This commit is contained in:
DBotThePony 2023-11-17 13:19:17 +07:00
parent db6b5e7efc
commit 6fb6687cd0
Signed by: DBot
GPG Key ID: DCC23B5715498507
3 changed files with 44 additions and 8 deletions

View File

@ -67,6 +67,19 @@ fun onceServer(inTicks: Int, callback: Runnable): TickList.Timer? {
return postServerTick.Timer(inTicks, callback)
}
/**
* schedules execution of Runnable somewhere in the future,
* at discretion of tick list
*/
fun sometimeServer(callback: Runnable): TickList.Timer? {
if (!SERVER_IS_LIVE) {
LOGGER.error("Refusing to add ticker $callback while server is dying", IllegalStateException("Server is stopping"))
return null
}
return postServerTick.sometime(callback)
}
private val isPausedImpl: Boolean get() {
val server = _server

View File

@ -56,6 +56,7 @@ import ru.dbotthepony.mc.otm.network.GenericNetworkChannel
import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer
import ru.dbotthepony.mc.otm.once
import ru.dbotthepony.mc.otm.onceServer
import ru.dbotthepony.mc.otm.sometimeServer
import java.lang.ref.WeakReference
import java.util.*
import java.util.function.Consumer
@ -612,23 +613,32 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
return blockEntities.any { it.synchronizer.hasObservers }
}
fun subscribe(player: ServerPlayer) {
if (players.add(player)) {
veto.add(player)
private fun recheckPlayer(player: ServerPlayer) {
sometimeServer {
if (player in players && !player.hasDisconnected()) {
if (player.connection.chunkSender.isPending(chunkPos)) {
recheckPlayer(player)
} else {
veto.remove(player)
onceServer(10) {
veto.remove(player)
blockEntities.forEach { it.playerListUpdated = true }
if (!player.hasDisconnected() && player in players) {
blockEntities.forEach {
it.playerListUpdated = true
it.synchronizeToPlayers(false)
}
}
} else if (player in players && player.hasDisconnected()) {
unsubscribe(player)
}
}
}
fun subscribe(player: ServerPlayer) {
if (players.add(player)) {
veto.add(player)
recheckPlayer(player)
}
}
fun unsubscribe(player: ServerPlayer): Boolean {
if (players.remove(player)) {
veto.remove(player)

View File

@ -24,6 +24,7 @@ class TickList : ITickable {
private set
var ticks = 0
private set
private var nextSometime = 0
inner class Timer(val timerTicks: Int, val runnable: Runnable) : Comparable<Timer> {
val ringAt = ticks + timerTicks
@ -147,6 +148,18 @@ class TickList : ITickable {
return Timer(timerTicks, action)
}
/**
* Schedules execution of Runnable somewhere in the future,
* at discretion of this tick list
*/
fun sometime(action: Runnable): Timer {
if (nextSometime < ticks || nextSometime - ticks >= 40) {
nextSometime = ticks
}
return Timer((++nextSometime) - ticks, action)
}
override fun tick() {
if (inTicker) {
throw ConcurrentModificationException("Already ticking")