@@ -2,6 +2,7 @@ package dev.slne.surf.surfapi.bukkit.server.packet.listener
22
33import com.github.benmanes.caffeine.cache.Caffeine
44import com.sksamuel.aedile.core.expireAfterAccess
5+ import dev.slne.surf.surfapi.bukkit.api.extensions.server
56import dev.slne.surf.surfapi.bukkit.api.nms.NmsUseWithCaution
67import dev.slne.surf.surfapi.bukkit.api.nms.nmsBridge
78import dev.slne.surf.surfapi.bukkit.server.impl.nms.SurfBukkitNmsBridgeImpl
@@ -15,7 +16,6 @@ import dev.slne.surf.surfapi.core.api.reflection.SurfProxy
1516import dev.slne.surf.surfapi.core.api.reflection.createProxy
1617import dev.slne.surf.surfapi.core.api.reflection.surfReflection
1718import dev.slne.surf.surfapi.core.api.util.logger
18- import dev.slne.surf.surfapi.core.api.util.mutableObjectSetOf
1919import dev.slne.surf.surfapi.core.api.util.synchronize
2020import io.netty.channel.Channel
2121import io.netty.channel.ChannelDuplexHandler
@@ -25,6 +25,8 @@ import io.papermc.paper.connection.PaperPlayerLoginConnection
2525import io.papermc.paper.connection.ReadablePlayerCookieConnectionImpl
2626import io.papermc.paper.event.connection.PlayerConnectionValidateLoginEvent
2727import io.papermc.paper.network.ChannelInitializeListenerHolder
28+ import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet
29+ import it.unimi.dsi.fastutil.objects.ObjectSet
2830import net.kyori.adventure.key.Key
2931import net.minecraft.network.Connection
3032import net.minecraft.network.HandlerNames
@@ -35,6 +37,7 @@ import org.bukkit.event.EventPriority
3537import org.bukkit.event.Listener
3638import org.bukkit.event.player.PlayerJoinEvent
3739import java.util.*
40+ import java.util.function.Predicate
3841import kotlin.time.Duration.Companion.minutes
3942import dev.slne.surf.surfapi.bukkit.api.event.register as registerListener
4043import dev.slne.surf.surfapi.bukkit.api.event.unregister as unregisterListener
@@ -50,7 +53,62 @@ object PlayerChannelInjector : Listener {
5053 .expireAfterAccess(1 .minutes)
5154 .build<UUID , Connection >()
5255
53- private val injectedChannels = mutableObjectSetOf<Channel >().synchronize()
56+ private val injectedChannels = TempObjectSet <Channel >().synchronize()
57+
58+ private class TempObjectSet <T >(set : ObjectSet <T >? = null ) : ObjectOpenHashSet<T>(set) {
59+ private var added: Long = 0
60+ private var removed: Long = 0
61+
62+ private enum class Operation {
63+ ADD , REMOVE , REMOVE_ALL , REMOVE_IF , ADD_ALL
64+ }
65+
66+ fun printStats (operation : Operation ) {
67+ log.atInfo()
68+ .log(" O:$operation ,A:$added ,R:$removed ,D:${added - removed} ,S:$size ,P:${server.onlinePlayers.size} " )
69+ }
70+
71+ override fun addAll (c : Collection <T ?>): Boolean {
72+ added + = c.size
73+ printStats(Operation .ADD_ALL )
74+
75+ return super .addAll(c)
76+ }
77+
78+ override fun removeAll (c : Collection <T ?>): Boolean {
79+ removed + = c.size
80+ printStats(Operation .REMOVE_ALL )
81+
82+ return super .removeAll(c)
83+ }
84+
85+ override fun add (element : T ? ): Boolean {
86+ added + = 1
87+ printStats(Operation .ADD )
88+
89+ return super .add(element)
90+ }
91+
92+ override fun remove (element : T ? ): Boolean {
93+ removed + = 1
94+ printStats(Operation .REMOVE )
95+
96+ return super .remove(element)
97+ }
98+
99+ override fun removeIf (filter : Predicate <in T >): Boolean {
100+ val removedElements = this .filter(filter::test)
101+
102+ removed + = removedElements.size
103+ printStats(Operation .REMOVE_IF )
104+
105+ return super .removeIf(filter)
106+ }
107+
108+ companion object {
109+ private const val serialVersionUID: Long = - 2618969176232686100L
110+ }
111+ }
54112
55113 fun register () {
56114 ChannelInitializeListenerHolder .addListener(CHANNEL_KEY ) { this .injectChannel(it) }
0 commit comments