This commit is contained in:
DBotThePony 2024-01-13 12:18:26 +07:00
commit 327963f4e5
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -631,6 +631,7 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
val players = ObjectArraySet<ServerPlayer>(0)
val veto = ObjectArraySet<ServerPlayer>(0)
val blockEntitiesWithObservers = WeakHashSet<MatteryBlockEntity>(linked = true, initialCapacity = 0)
private val player2ResubCount = Reference2IntArrayMap<ServerPlayer>()
operator fun component1() = blockEntities
operator fun component2() = players
@ -659,22 +660,14 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
veto.add(player)
recheckPlayer(player)
} else if (player !in veto) {
LOGGER.debug("{} got subscribed to {} without prior unsubscribing, forcefully resubscribing", player, ChunkPos(chunkPos))
player2ResubCount[player] = player2ResubCount.getInt(player) + 1
unsubscribe(player)
LOGGER.debug("{} got subscribed to {} without prior unsubscribing, forcefully resubscribing (this happened {} times)", player, ChunkPos(chunkPos), player2ResubCount.getInt(player))
unsubscribe(player, false)
subscribe(player)
onceServer(20) {
val rem = player2ResubCount.removeInt(player)
if (rem > 0) {
LOGGER.warn("$player got subscribed to $rem chunks without prior unsubscribing, details in debug log")
}
}
}
}
fun unsubscribe(player: ServerPlayer): Boolean {
fun unsubscribe(player: ServerPlayer, normal: Boolean = true): Boolean {
if (players.remove(player)) {
veto.remove(player)
@ -682,6 +675,10 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
it.synchronizer.removeEndpointFor(player)
}
if (normal) {
player2ResubCount.removeInt(player)
}
return true
}
@ -743,7 +740,6 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
private val playerMap = WeakHashMap<ServerLevel, Long2ObjectOpenHashMap<ChunkSubscribers>>()
private val tickingMap = WeakHashMap<ServerLevel, WeakHashSet<ChunkSubscribers>>()
private val player2ResubCount = Reference2IntArrayMap<ServerPlayer>()
private val vec2Dir = Int2ObjectOpenHashMap<Direction>()
private val LOGGER = LogManager.getLogger()
@ -800,13 +796,11 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
val level = event.level as? ServerLevel ?: return
playerMap.remove(level)
tickingMap.remove(level)
player2ResubCount.clear()
}
fun onServerStopping(event: ServerStoppingEvent) {
playerMap.clear()
tickingMap.clear()
player2ResubCount.clear()
}
fun postLevelTick(event: LevelTickEvent) {
@ -847,8 +841,6 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
}
fun playerDisconnected(event: PlayerEvent.PlayerLoggedOutEvent) {
player2ResubCount.removeInt(event.entity as ServerPlayer)
for (tree in playerMap.values) {
tree.values.removeIf {
it.unsubscribe(event.entity as ServerPlayer)