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)
|
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() {
|
private val isPausedImpl: Boolean get() {
|
||||||
val server = _server
|
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.network.synchronizer.FieldSynchronizer
|
||||||
import ru.dbotthepony.mc.otm.once
|
import ru.dbotthepony.mc.otm.once
|
||||||
import ru.dbotthepony.mc.otm.onceServer
|
import ru.dbotthepony.mc.otm.onceServer
|
||||||
|
import ru.dbotthepony.mc.otm.sometimeServer
|
||||||
import java.lang.ref.WeakReference
|
import java.lang.ref.WeakReference
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.function.Consumer
|
import java.util.function.Consumer
|
||||||
@ -612,23 +613,32 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
|
|||||||
return blockEntities.any { it.synchronizer.hasObservers }
|
return blockEntities.any { it.synchronizer.hasObservers }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun subscribe(player: ServerPlayer) {
|
private fun recheckPlayer(player: ServerPlayer) {
|
||||||
if (players.add(player)) {
|
sometimeServer {
|
||||||
veto.add(player)
|
if (player in players && !player.hasDisconnected()) {
|
||||||
|
if (player.connection.chunkSender.isPending(chunkPos)) {
|
||||||
onceServer(10) {
|
recheckPlayer(player)
|
||||||
|
} else {
|
||||||
veto.remove(player)
|
veto.remove(player)
|
||||||
blockEntities.forEach { it.playerListUpdated = true }
|
|
||||||
|
|
||||||
if (!player.hasDisconnected() && player in players) {
|
|
||||||
blockEntities.forEach {
|
blockEntities.forEach {
|
||||||
|
it.playerListUpdated = true
|
||||||
it.synchronizeToPlayers(false)
|
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 {
|
fun unsubscribe(player: ServerPlayer): Boolean {
|
||||||
if (players.remove(player)) {
|
if (players.remove(player)) {
|
||||||
veto.remove(player)
|
veto.remove(player)
|
||||||
|
@ -24,6 +24,7 @@ class TickList : ITickable {
|
|||||||
private set
|
private set
|
||||||
var ticks = 0
|
var ticks = 0
|
||||||
private set
|
private set
|
||||||
|
private var nextSometime = 0
|
||||||
|
|
||||||
inner class Timer(val timerTicks: Int, val runnable: Runnable) : Comparable<Timer> {
|
inner class Timer(val timerTicks: Int, val runnable: Runnable) : Comparable<Timer> {
|
||||||
val ringAt = ticks + timerTicks
|
val ringAt = ticks + timerTicks
|
||||||
@ -147,6 +148,18 @@ class TickList : ITickable {
|
|||||||
return Timer(timerTicks, action)
|
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() {
|
override fun tick() {
|
||||||
if (inTicker) {
|
if (inTicker) {
|
||||||
throw ConcurrentModificationException("Already ticking")
|
throw ConcurrentModificationException("Already ticking")
|
||||||
|
Loading…
Reference in New Issue
Block a user