From 48a7873133bb8843fd466c5f71f11fee6b96924c Mon Sep 17 00:00:00 2001 From: nextdayy <79922345+nextdayy@users.noreply.github.com> Date: Sat, 15 Jun 2024 16:50:27 +0100 Subject: [PATCH 1/2] change to using functional interface for clientbound packet handling --- .../net/hypixel/modapi/HypixelModAPI.java | 19 +++++++------- .../handler/ClientboundPacketHandler.java | 25 +++---------------- 2 files changed, 13 insertions(+), 31 deletions(-) diff --git a/src/main/java/net/hypixel/modapi/HypixelModAPI.java b/src/main/java/net/hypixel/modapi/HypixelModAPI.java index e732d8c..9bb96cb 100644 --- a/src/main/java/net/hypixel/modapi/HypixelModAPI.java +++ b/src/main/java/net/hypixel/modapi/HypixelModAPI.java @@ -28,7 +28,7 @@ public static HypixelModAPI getInstance() { } private final PacketRegistry registry = new PacketRegistry(); - private final List handlers = new CopyOnWriteArrayList<>(); + private final Map, Collection>> handlers = new ConcurrentHashMap<>(); private final Set subscribedEvents = ConcurrentHashMap.newKeySet(); private Set lastSubscribedEvents = Collections.emptySet(); private Predicate packetSender = null; @@ -71,20 +71,16 @@ private void registerEventPackets() { } private void registerDefaultHandler() { - registerHandler(new ClientboundPacketHandler() { - @Override - public void onHelloEvent(ClientboundHelloPacket packet) { - sendRegisterPacket(true); - } - }); + registerHandler(ClientboundHelloPacket.class, p -> sendRegisterPacket(true)); } public PacketRegistry getRegistry() { return registry; } - public void registerHandler(ClientboundPacketHandler handler) { - handlers.add(handler); + public void registerHandler(Class packetClass, ClientboundPacketHandler handler) { + if (packetClass == null || handler == null) return; + handlers.computeIfAbsent(packetClass, cls -> new CopyOnWriteArrayList<>()).add(handler); } public void subscribeToEventPacket(Class packet) { @@ -135,7 +131,10 @@ public void handle(String identifier, PacketSerializer serializer) { } public void handle(ClientboundHypixelPacket packet) { - for (ClientboundPacketHandler handler : handlers) { + Collection> typedHandlers = handlers.get(packet.getClass()); + // nothing registered for this packet. + if (typedHandlers == null) return; + for (ClientboundPacketHandler handler : typedHandlers) { packet.handle(handler); } } diff --git a/src/main/java/net/hypixel/modapi/handler/ClientboundPacketHandler.java b/src/main/java/net/hypixel/modapi/handler/ClientboundPacketHandler.java index d4c1f66..2b1ea0b 100644 --- a/src/main/java/net/hypixel/modapi/handler/ClientboundPacketHandler.java +++ b/src/main/java/net/hypixel/modapi/handler/ClientboundPacketHandler.java @@ -1,25 +1,8 @@ package net.hypixel.modapi.handler; -import net.hypixel.modapi.packet.impl.clientbound.ClientboundHelloPacket; -import net.hypixel.modapi.packet.impl.clientbound.ClientboundPartyInfoPacket; -import net.hypixel.modapi.packet.impl.clientbound.ClientboundPingPacket; -import net.hypixel.modapi.packet.impl.clientbound.ClientboundPlayerInfoPacket; -import net.hypixel.modapi.packet.impl.clientbound.event.ClientboundLocationPacket; +import net.hypixel.modapi.packet.ClientboundHypixelPacket; -public interface ClientboundPacketHandler { - - default void onHelloEvent(ClientboundHelloPacket packet) { - } - - default void onPingPacket(ClientboundPingPacket packet) { - } - - default void onPartyInfoPacket(ClientboundPartyInfoPacket packet) { - } - - default void onPlayerInfoPacket(ClientboundPlayerInfoPacket packet) { - } - - default void onLocationEvent(ClientboundLocationPacket packet) { - } +@FunctionalInterface +public interface ClientboundPacketHandler { + void handle(T packet); } From 432866d89088d134ff8445bc36e1fe5653838e2d Mon Sep 17 00:00:00 2001 From: nextdayy <79922345+nextdayy@users.noreply.github.com> Date: Sat, 15 Jun 2024 17:10:06 +0100 Subject: [PATCH 2/2] remove remaining excess code --- src/main/java/net/hypixel/modapi/HypixelModAPI.java | 4 +++- .../hypixel/modapi/packet/ClientboundHypixelPacket.java | 5 ----- .../packet/impl/clientbound/ClientboundHelloPacket.java | 7 ------- .../impl/clientbound/ClientboundPartyInfoPacket.java | 6 ------ .../packet/impl/clientbound/ClientboundPingPacket.java | 8 -------- .../impl/clientbound/ClientboundPlayerInfoPacket.java | 8 -------- .../impl/clientbound/event/ClientboundLocationPacket.java | 6 ------ 7 files changed, 3 insertions(+), 41 deletions(-) diff --git a/src/main/java/net/hypixel/modapi/HypixelModAPI.java b/src/main/java/net/hypixel/modapi/HypixelModAPI.java index 9bb96cb..3df9218 100644 --- a/src/main/java/net/hypixel/modapi/HypixelModAPI.java +++ b/src/main/java/net/hypixel/modapi/HypixelModAPI.java @@ -130,12 +130,14 @@ public void handle(String identifier, PacketSerializer serializer) { handle(packet); } + @SuppressWarnings("unchecked") public void handle(ClientboundHypixelPacket packet) { Collection> typedHandlers = handlers.get(packet.getClass()); // nothing registered for this packet. if (typedHandlers == null) return; for (ClientboundPacketHandler handler : typedHandlers) { - packet.handle(handler); + // this cast is safe as we ensure its type when it is added to the handlers list in the first place. + ((ClientboundPacketHandler) handler).handle(packet); } } diff --git a/src/main/java/net/hypixel/modapi/packet/ClientboundHypixelPacket.java b/src/main/java/net/hypixel/modapi/packet/ClientboundHypixelPacket.java index 338455b..d2f0c95 100644 --- a/src/main/java/net/hypixel/modapi/packet/ClientboundHypixelPacket.java +++ b/src/main/java/net/hypixel/modapi/packet/ClientboundHypixelPacket.java @@ -1,9 +1,4 @@ package net.hypixel.modapi.packet; -import net.hypixel.modapi.handler.ClientboundPacketHandler; - public interface ClientboundHypixelPacket extends HypixelPacket { - - void handle(ClientboundPacketHandler handler); - } diff --git a/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundHelloPacket.java b/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundHelloPacket.java index d87cb33..952431c 100644 --- a/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundHelloPacket.java +++ b/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundHelloPacket.java @@ -1,8 +1,6 @@ package net.hypixel.modapi.packet.impl.clientbound; import net.hypixel.data.region.Environment; -import net.hypixel.modapi.annotation.Experimental; -import net.hypixel.modapi.handler.ClientboundPacketHandler; import net.hypixel.modapi.packet.ClientboundHypixelPacket; import net.hypixel.modapi.serializer.PacketSerializer; @@ -24,11 +22,6 @@ public ClientboundHelloPacket(PacketSerializer serializer) { serializer.discardRemaining(); } - @Override - public void handle(ClientboundPacketHandler handler) { - handler.onHelloEvent(this); - } - @Override public void write(PacketSerializer serializer) { serializer.writeVarInt(environment.getId()); diff --git a/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundPartyInfoPacket.java b/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundPartyInfoPacket.java index 7b25452..6dfcfd4 100644 --- a/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundPartyInfoPacket.java +++ b/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundPartyInfoPacket.java @@ -1,6 +1,5 @@ package net.hypixel.modapi.packet.impl.clientbound; -import net.hypixel.modapi.handler.ClientboundPacketHandler; import net.hypixel.modapi.serializer.PacketSerializer; import java.util.*; @@ -84,11 +83,6 @@ protected int getLatestVersion() { return CURRENT_VERSION; } - @Override - public void handle(ClientboundPacketHandler handler) { - handler.onPartyInfoPacket(this); - } - public boolean isInParty() { return inParty; } diff --git a/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundPingPacket.java b/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundPingPacket.java index 3edc21b..90d634a 100644 --- a/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundPingPacket.java +++ b/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundPingPacket.java @@ -1,8 +1,5 @@ package net.hypixel.modapi.packet.impl.clientbound; -import net.hypixel.modapi.handler.ClientboundPacketHandler; -import net.hypixel.modapi.packet.ClientboundHypixelPacket; -import net.hypixel.modapi.packet.impl.VersionedPacket; import net.hypixel.modapi.serializer.PacketSerializer; public class ClientboundPingPacket extends ClientboundVersionedPacket { @@ -40,11 +37,6 @@ protected int getLatestVersion() { return CURRENT_VERSION; } - @Override - public void handle(ClientboundPacketHandler handler) { - handler.onPingPacket(this); - } - public String getResponse() { return response; } diff --git a/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundPlayerInfoPacket.java b/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundPlayerInfoPacket.java index 94af029..52224d5 100644 --- a/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundPlayerInfoPacket.java +++ b/src/main/java/net/hypixel/modapi/packet/impl/clientbound/ClientboundPlayerInfoPacket.java @@ -3,9 +3,6 @@ import net.hypixel.data.rank.MonthlyPackageRank; import net.hypixel.data.rank.PackageRank; import net.hypixel.data.rank.PlayerRank; -import net.hypixel.modapi.handler.ClientboundPacketHandler; -import net.hypixel.modapi.packet.ClientboundHypixelPacket; -import net.hypixel.modapi.packet.impl.VersionedPacket; import net.hypixel.modapi.serializer.PacketSerializer; import org.jetbrains.annotations.Nullable; @@ -59,11 +56,6 @@ protected int getLatestVersion() { return CURRENT_VERSION; } - @Override - public void handle(ClientboundPacketHandler handler) { - handler.onPlayerInfoPacket(this); - } - public PlayerRank getPlayerRank() { return playerRank; } diff --git a/src/main/java/net/hypixel/modapi/packet/impl/clientbound/event/ClientboundLocationPacket.java b/src/main/java/net/hypixel/modapi/packet/impl/clientbound/event/ClientboundLocationPacket.java index 3e1aebb..16ab144 100644 --- a/src/main/java/net/hypixel/modapi/packet/impl/clientbound/event/ClientboundLocationPacket.java +++ b/src/main/java/net/hypixel/modapi/packet/impl/clientbound/event/ClientboundLocationPacket.java @@ -1,7 +1,6 @@ package net.hypixel.modapi.packet.impl.clientbound.event; import net.hypixel.data.type.ServerType; -import net.hypixel.modapi.handler.ClientboundPacketHandler; import net.hypixel.modapi.packet.EventPacket; import net.hypixel.modapi.packet.impl.clientbound.ClientboundVersionedPacket; import net.hypixel.modapi.serializer.PacketSerializer; @@ -64,11 +63,6 @@ protected int getLatestVersion() { return CURRENT_VERSION; } - @Override - public void handle(ClientboundPacketHandler handler) { - handler.onLocationEvent(this); - } - public String getServerName() { return serverName; }