Update block entity synchronization to match 1.20.2 chunk queue changes
This commit is contained in:
parent
db6b5e7efc
commit
6fb6687cd0
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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")
|
||||
|
Loading…
Reference in New Issue
Block a user