Skip to content

Commit bedcfaa

Browse files
committed
refactor: optimize packet listener storage and processing for concurrency
1 parent 4d3f6ae commit bedcfaa

File tree

3 files changed

+26
-17
lines changed

3 files changed

+26
-17
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled
77
javaVersion=21
88
mcVersion=1.21.11
99
group=dev.slne.surf
10-
version=1.21.11-2.45.1
10+
version=1.21.11-2.45.2
1111
relocationPrefix=dev.slne.surf.surfapi.libs
1212
snapshot=false

surf-api-bukkit/surf-api-bukkit-server/src/main/kotlin/dev/slne/surf/surfapi/bukkit/server/impl/nms/SurfBukkitNmsBridgeImpl.kt

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,21 @@ import dev.slne.surf.surfapi.bukkit.api.nms.listener.NmsServerboundPacketListene
99
import dev.slne.surf.surfapi.bukkit.api.nms.listener.packets.clientbound.NmsClientboundPacket
1010
import dev.slne.surf.surfapi.bukkit.api.nms.listener.packets.serverbound.NmsServerboundPacket
1111
import dev.slne.surf.surfapi.bukkit.api.packet.listener.listener.PacketListenerResult
12-
import dev.slne.surf.surfapi.core.api.util.*
13-
import it.unimi.dsi.fastutil.objects.ObjectSet
12+
import dev.slne.surf.surfapi.core.api.util.checkInstantiationByServiceLoader
13+
import dev.slne.surf.surfapi.core.api.util.logger
1414
import org.bukkit.entity.Player
15+
import java.util.concurrent.ConcurrentHashMap
16+
import java.util.concurrent.CopyOnWriteArraySet
1517

1618
@AutoService(SurfBukkitNmsBridge::class)
1719
@NmsUseWithCaution
1820
class SurfBukkitNmsBridgeImpl : SurfBukkitNmsBridge {
1921
private val log = logger()
2022

2123
private val serverboundPacketListeners =
22-
mutableObject2ObjectMapOf<Class<*>, ObjectSet<NmsServerboundPacketListener<*>>>().synchronize()
24+
ConcurrentHashMap<Class<*>, CopyOnWriteArraySet<NmsServerboundPacketListener<*>>>()
2325
private val clientboundPacketListeners =
24-
mutableObject2ObjectMapOf<Class<*>, ObjectSet<NmsClientboundPacketListener<*>>>().synchronize()
26+
ConcurrentHashMap<Class<*>, CopyOnWriteArraySet<NmsClientboundPacketListener<*>>>()
2527

2628
init {
2729
checkInstantiationByServiceLoader()
@@ -30,7 +32,7 @@ class SurfBukkitNmsBridgeImpl : SurfBukkitNmsBridge {
3032
override fun registerServerboundPacketListener(listener: NmsServerboundPacketListener<*>) {
3133
val packetClass = listener.packetClass
3234
val added =
33-
serverboundPacketListeners.computeIfAbsent(packetClass) { mutableObjectSetOf() }.add(listener)
35+
serverboundPacketListeners.computeIfAbsent(packetClass) { CopyOnWriteArraySet() }.add(listener)
3436

3537
if (!added) {
3638
log.atWarning()
@@ -52,7 +54,7 @@ class SurfBukkitNmsBridgeImpl : SurfBukkitNmsBridge {
5254
override fun registerClientboundPacketListener(listener: NmsClientboundPacketListener<*>) {
5355
val packetClass = listener.packetClass
5456
val added =
55-
clientboundPacketListeners.computeIfAbsent(packetClass) { mutableObjectSetOf() }.add(listener)
57+
clientboundPacketListeners.computeIfAbsent(packetClass) { CopyOnWriteArraySet() }.add(listener)
5658

5759
if (!added) {
5860
log.atWarning()
@@ -77,13 +79,16 @@ class SurfBukkitNmsBridgeImpl : SurfBukkitNmsBridge {
7779
player: Player,
7880
): Packet? {
7981
val clazz = packet.packetClass
80-
8182
val listener = serverboundPacketListeners[clazz] ?: return packet
8283

83-
val cancel = listener.asSequence()
84-
.map { it as NmsServerboundPacketListener<Packet> }
85-
.map { it.handleServerboundPacket(packet, player) }
86-
.any { it == PacketListenerResult.CANCEL }
84+
var cancel = false
85+
for (listener in listener) {
86+
listener as NmsServerboundPacketListener<Packet>
87+
val result = listener.handleServerboundPacket(packet, player)
88+
if (result == PacketListenerResult.CANCEL) {
89+
cancel = true
90+
}
91+
}
8792

8893
return if (cancel) null else packet
8994
}
@@ -97,10 +102,14 @@ class SurfBukkitNmsBridgeImpl : SurfBukkitNmsBridge {
97102

98103
if (listeners.isEmpty()) return packet
99104

100-
val cancel = listeners.asSequence()
101-
.map { it as NmsClientboundPacketListener<Packet> }
102-
.map { it.handleClientboundPacket(packet, player) }
103-
.any { it == PacketListenerResult.CANCEL }
105+
var cancel = false
106+
for (listener in listeners) {
107+
listener as NmsClientboundPacketListener<Packet>
108+
val result = listener.handleClientboundPacket(packet, player)
109+
if (result == PacketListenerResult.CANCEL) {
110+
cancel = true
111+
}
112+
}
104113

105114
return if (cancel) null else packet
106115
}

surf-api-core/surf-api-core-api/src/main/kotlin/dev/slne/surf/surfapi/core/api/messages/ComponentMessage.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import java.util.*
1010
class ComponentMessage(private val message: ComponentLike) : Message, ComponentLike {
1111
override fun getString(): String {
1212
return (COMPONENT_MESSAGE_PREFIX + GsonComponentSerializer.gson()
13-
.serialize(message.asComponent()))
13+
.serialize(message.asComponent().compact()))
1414
}
1515

1616
override fun asComponent(): Component {

0 commit comments

Comments
 (0)