Skip to content

Commit 429d552

Browse files
authored
Perf/optimize packet listener (#252)
2 parents 35973f8 + cddaee4 commit 429d552

9 files changed

Lines changed: 283 additions & 223 deletions

File tree

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=25
88
mcVersion=1.21.11
99
group=dev.slne.surf
10-
version=1.21.11-2.68.0
10+
version=1.21.11-2.69.0
1111
relocationPrefix=dev.slne.surf.surfapi.libs
1212
snapshot=false

surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2073,6 +2073,7 @@ public final class dev/slne/surf/surfapi/bukkit/api/nms/bridges/packets/player/t
20732073

20742074
public abstract interface class dev/slne/surf/surfapi/bukkit/api/nms/listener/NmsClientboundPacketListener : dev/slne/surf/surfapi/bukkit/api/nms/listener/NmsPacketListener {
20752075
public abstract fun handleClientboundPacket (Ldev/slne/surf/surfapi/bukkit/api/nms/listener/packets/NmsPacket;Lorg/bukkit/entity/Player;)Ldev/slne/surf/surfapi/bukkit/api/packet/listener/listener/PacketListenerResult;
2076+
public fun handleEarlyClientboundPacket (Ldev/slne/surf/surfapi/bukkit/api/nms/listener/packets/NmsPacket;Lorg/bukkit/entity/Player;)Ldev/slne/surf/surfapi/bukkit/api/packet/listener/listener/PacketListenerResult;
20762077
}
20772078

20782079
public abstract interface class dev/slne/surf/surfapi/bukkit/api/nms/listener/NmsPacketListener {

surf-api-bukkit/surf-api-bukkit-api/src/main/java/dev/slne/surf/surfapi/bukkit/api/nms/listener/NmsClientboundPacketListener.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,28 @@
44
import dev.slne.surf.surfapi.bukkit.api.nms.listener.packets.NmsPacket;
55
import dev.slne.surf.surfapi.bukkit.api.packet.listener.listener.PacketListenerResult;
66
import org.bukkit.entity.Player;
7+
import org.jetbrains.annotations.ApiStatus;
8+
import org.jspecify.annotations.NullMarked;
9+
import org.jspecify.annotations.Nullable;
710

811
@NmsUseWithCaution
12+
@NullMarked
913
public interface NmsClientboundPacketListener<Packet extends NmsPacket> extends
10-
NmsPacketListener<Packet> {
14+
NmsPacketListener<Packet> {
1115

12-
PacketListenerResult handleClientboundPacket(Packet packet, Player player);
16+
@ApiStatus.OverrideOnly
17+
PacketListenerResult handleClientboundPacket(Packet packet, Player player);
18+
19+
@ApiStatus.OverrideOnly
20+
default PacketListenerResult handleEarlyClientboundPacket(Packet packet, @Nullable Player player) {
21+
if (player != null) {
22+
return handleClientboundPacket(packet, player);
23+
} else {
24+
throw new IllegalStateException(
25+
"No player is available for this clientbound packet yet. " +
26+
"This can happen during early connection phases such as login. " +
27+
"Override handleEarlyClientboundPacket(...) if your listener should handle packets before a Player exists."
28+
);
29+
}
30+
}
1331
}

surf-api-bukkit/surf-api-bukkit-api/src/main/java/dev/slne/surf/surfapi/bukkit/api/nms/listener/NmsPacketListener.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@
33
import com.google.common.reflect.TypeToken;
44
import dev.slne.surf.surfapi.bukkit.api.nms.NmsUseWithCaution;
55
import dev.slne.surf.surfapi.bukkit.api.nms.listener.packets.NmsPacket;
6+
import dev.slne.surf.surfapi.shared.api.util.InternalSurfApi;
7+
import org.jetbrains.annotations.ApiStatus;
8+
import org.jspecify.annotations.NullMarked;
69

710
@NmsUseWithCaution
11+
@NullMarked
812
public interface NmsPacketListener<Packet extends NmsPacket> {
913

10-
default Class<? super Packet> getPacketClass() {
11-
TypeToken<Packet> typeToken = new TypeToken<Packet>(getClass()) {
12-
};
14+
@ApiStatus.Internal
15+
@InternalSurfApi
16+
default Class<? super Packet> getPacketClass() {
17+
TypeToken<Packet> typeToken = new TypeToken<Packet>(getClass()) {
18+
};
1319

14-
return typeToken.getRawType();
15-
}
20+
return typeToken.getRawType();
21+
}
1622
}

surf-api-bukkit/surf-api-bukkit-api/src/main/java/dev/slne/surf/surfapi/bukkit/api/nms/listener/NmsServerboundPacketListener.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
import dev.slne.surf.surfapi.bukkit.api.packet.listener.listener.PacketListenerResult;
66
import org.bukkit.entity.Player;
77
import org.jetbrains.annotations.ApiStatus.OverrideOnly;
8+
import org.jspecify.annotations.NullMarked;
89
import org.jspecify.annotations.Nullable;
910

1011
@NmsUseWithCaution
12+
@NullMarked
1113
public interface NmsServerboundPacketListener<Packet extends NmsPacket> extends
1214
NmsPacketListener<Packet> {
1315

@@ -19,7 +21,11 @@ default PacketListenerResult handleEarlyServerboundPacket(Packet packet, @Nullab
1921
if (player != null) {
2022
return handleServerboundPacket(packet, player);
2123
} else {
22-
return PacketListenerResult.CONTINUE;
24+
throw new IllegalStateException(
25+
"No player is available for this serverbound packet yet. " +
26+
"This can happen during early connection phases such as login. " +
27+
"Override handleEarlyServerboundPacket(...) if your listener should handle packets before a Player exists."
28+
);
2329
}
2430
}
2531
}

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

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,15 @@ class SurfBukkitNmsBridgeImpl : SurfBukkitNmsBridge {
8484
var cancel = false
8585
for (listener in listener) {
8686
listener as NmsServerboundPacketListener<Packet>
87-
val result = listener.handleEarlyServerboundPacket(packet, player)
87+
val result = try {
88+
listener.handleEarlyServerboundPacket(packet, player)
89+
} catch (e: Throwable) {
90+
log.atSevere()
91+
.withCause(e)
92+
.log("Failed to handle serverbound packet")
93+
PacketListenerResult.CONTINUE
94+
}
95+
8896
if (result == PacketListenerResult.CANCEL) {
8997
cancel = true
9098
}
@@ -96,7 +104,7 @@ class SurfBukkitNmsBridgeImpl : SurfBukkitNmsBridge {
96104
@Suppress("UNCHECKED_CAST")
97105
fun <Packet : NmsClientboundPacket> handleClientboundPacket(
98106
packet: Packet,
99-
player: Player,
107+
player: Player?,
100108
): Packet? {
101109
val listeners = clientboundPacketListeners[packet.packetClass] ?: return packet
102110

@@ -105,7 +113,15 @@ class SurfBukkitNmsBridgeImpl : SurfBukkitNmsBridge {
105113
var cancel = false
106114
for (listener in listeners) {
107115
listener as NmsClientboundPacketListener<Packet>
108-
val result = listener.handleClientboundPacket(packet, player)
116+
val result = try {
117+
listener.handleEarlyClientboundPacket(packet, player)
118+
} catch (e: Throwable) {
119+
log.atSevere()
120+
.withCause(e)
121+
.log("Failed to handle clientbound packet")
122+
PacketListenerResult.CONTINUE
123+
}
124+
109125
if (result == PacketListenerResult.CANCEL) {
110126
cancel = true
111127
}

0 commit comments

Comments
 (0)