From 44ad965b1fdc0a8166023cb8b29a28840215255c Mon Sep 17 00:00:00 2001 From: Plancke Date: Mon, 15 Apr 2024 00:35:36 +0200 Subject: [PATCH 1/2] feat: Separate registration of client/server packets --- .../net/hypixel/modapi/HypixelModAPI.java | 28 ++++--- .../hypixel/modapi/packet/PacketRegistry.java | 81 +++++++++++++++---- 2 files changed, 81 insertions(+), 28 deletions(-) diff --git a/src/main/java/net/hypixel/modapi/HypixelModAPI.java b/src/main/java/net/hypixel/modapi/HypixelModAPI.java index cf1ad27..0f3ca0e 100644 --- a/src/main/java/net/hypixel/modapi/HypixelModAPI.java +++ b/src/main/java/net/hypixel/modapi/HypixelModAPI.java @@ -29,18 +29,22 @@ public static HypixelModAPI getInstance() { private final List handlers = new CopyOnWriteArrayList<>(); private HypixelModAPI() { - registry.registerPacketType("hypixel:ping", - ClientboundPingPacket.class, ClientboundPingPacket::new, - ServerboundPingPacket.class, ServerboundPingPacket::new); - registry.registerPacketType("hypixel:location", - ClientboundLocationPacket.class, ClientboundLocationPacket::new, - ServerboundLocationPacket.class, ServerboundLocationPacket::new); - registry.registerPacketType("hypixel:party_info", - ClientboundPartyInfoPacket.class, ClientboundPartyInfoPacket::new, - ServerboundPartyInfoPacket.class, ServerboundPartyInfoPacket::new); - registry.registerPacketType("hypixel:player_info", - ClientboundPlayerInfoPacket.class, ClientboundPlayerInfoPacket::new, - ServerboundPlayerInfoPacket.class, ServerboundPlayerInfoPacket::new); + registry.define("hypixel:ping") + .clientbound(ClientboundPingPacket.class, ClientboundPingPacket::new) + .serverbound(ServerboundPingPacket.class, ServerboundPingPacket::new) + .register(); + registry.define("hypixel:location") + .clientbound(ClientboundLocationPacket.class, ClientboundLocationPacket::new) + .serverbound(ServerboundLocationPacket.class, ServerboundLocationPacket::new) + .register(); + registry.define("hypixel:party_info") + .clientbound(ClientboundPartyInfoPacket.class, ClientboundPartyInfoPacket::new) + .serverbound(ServerboundPartyInfoPacket.class, ServerboundPartyInfoPacket::new) + .register(); + registry.define("hypixel:player_info") + .clientbound(ClientboundPlayerInfoPacket.class, ClientboundPlayerInfoPacket::new) + .serverbound(ServerboundPlayerInfoPacket.class, ServerboundPlayerInfoPacket::new) + .register(); } public PacketRegistry getRegistry() { diff --git a/src/main/java/net/hypixel/modapi/packet/PacketRegistry.java b/src/main/java/net/hypixel/modapi/packet/PacketRegistry.java index 6fc9bb6..d6634bb 100644 --- a/src/main/java/net/hypixel/modapi/packet/PacketRegistry.java +++ b/src/main/java/net/hypixel/modapi/packet/PacketRegistry.java @@ -10,23 +10,28 @@ public class PacketRegistry { - private final Map registrations = new ConcurrentHashMap<>(); + private final Map registrations = new ConcurrentHashMap<>(); private final Map, String> classToIdentifier = new ConcurrentHashMap<>(); - public void registerPacketType(String identifier, - Class clientboundClazz, Function clientPacketFactory, - Class serverboundClazz, Function serverPacketFactory) { - registrations.put(identifier, new RegisteredType(clientboundClazz, clientPacketFactory, serverboundClazz, serverPacketFactory)); + private void register( + String identifier, + Class clientboundClazz, Function clientPacketFactory, + Class serverboundClazz, Function serverPacketFactory) { + registrations.put(identifier, new Registration(clientboundClazz, clientPacketFactory, serverboundClazz, serverPacketFactory)); classToIdentifier.put(clientboundClazz, identifier); classToIdentifier.put(serverboundClazz, identifier); } - private RegisteredType getRegisteredType(String identifier) { - RegisteredType registeredType = registrations.get(identifier); - if (registeredType == null) { + public RegistrationBuilder define(String identifier) { + return new RegistrationBuilder(this, identifier); + } + + private Registration getRegistration(String identifier) { + Registration registration = registrations.get(identifier); + if (registration == null) { throw new IllegalArgumentException("Unknown packet identifier: " + identifier); } - return registeredType; + return registration; } public boolean isRegistered(String identifier) { @@ -34,11 +39,11 @@ public boolean isRegistered(String identifier) { } public ClientboundHypixelPacket createClientboundPacket(String identifier, PacketSerializer serializer) { - return getRegisteredType(identifier).clientPacketFactory.apply(serializer); + return getRegistration(identifier).clientPacketFactory.apply(serializer); } public HypixelPacket createServerboundPacket(String identifier, PacketSerializer serializer) { - return getRegisteredType(identifier).serverPacketFactory.apply(serializer); + return getRegistration(identifier).serverPacketFactory.apply(serializer); } public String getIdentifier(Class clazz) { @@ -49,20 +54,64 @@ public Set getIdentifiers() { return Collections.unmodifiableSet(registrations.keySet()); } - private static final class RegisteredType { + public static final class RegistrationBuilder { + private final PacketRegistry registry; + private final String identifier; + + private Class clientboundClazz; + private Function clientPacketFactory; + private Class serverboundClazz; + private Function serverPacketFactory; + + RegistrationBuilder(PacketRegistry registry, String identifier) { + this.registry = registry; + this.identifier = identifier; + } + + public RegistrationBuilder clientbound( + Class clientboundClazz, Function clientPacketFactory) { + this.clientboundClazz = clientboundClazz; + this.clientPacketFactory = clientPacketFactory; + return this; + } + + public RegistrationBuilder serverbound( + Class serverboundClazz, Function serverPacketFactory) { + this.serverboundClazz = serverboundClazz; + this.serverPacketFactory = serverPacketFactory; + return this; + } + + public void register() { + registry.register(identifier, clientboundClazz, clientPacketFactory, serverboundClazz, serverPacketFactory); + } + + } + + private static final class Registration { private final Class clientboundClazz; - private final Function clientPacketFactory; + private final Function clientPacketFactory; private final Class serverboundClazz; - private final Function serverPacketFactory; + private final Function serverPacketFactory; - public RegisteredType(Class clientboundClazz, Function clientPacketFactory, - Class serverboundClazz, Function serverPacketFactory) { + public Registration(Class clientboundClazz, Function clientPacketFactory, + Class serverboundClazz, Function serverPacketFactory) { this.clientboundClazz = clientboundClazz; this.clientPacketFactory = clientPacketFactory; this.serverboundClazz = serverboundClazz; this.serverPacketFactory = serverPacketFactory; } + + @Override + public String toString() { + return "Registration{" + + "clientboundClazz=" + clientboundClazz + + ", clientPacketFactory=" + clientPacketFactory + + ", serverboundClazz=" + serverboundClazz + + ", serverPacketFactory=" + serverPacketFactory + + '}'; + } } } From 7b4ec161ff5a039344a1d014ed55b3516699876f Mon Sep 17 00:00:00 2001 From: Plancke Date: Mon, 15 Apr 2024 00:48:21 +0200 Subject: [PATCH 2/2] fix: Check null before adding class to lookup map --- .../java/net/hypixel/modapi/packet/PacketRegistry.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/hypixel/modapi/packet/PacketRegistry.java b/src/main/java/net/hypixel/modapi/packet/PacketRegistry.java index d6634bb..4362c13 100644 --- a/src/main/java/net/hypixel/modapi/packet/PacketRegistry.java +++ b/src/main/java/net/hypixel/modapi/packet/PacketRegistry.java @@ -18,8 +18,12 @@ private void register( Class clientboundClazz, Function clientPacketFactory, Class serverboundClazz, Function serverPacketFactory) { registrations.put(identifier, new Registration(clientboundClazz, clientPacketFactory, serverboundClazz, serverPacketFactory)); - classToIdentifier.put(clientboundClazz, identifier); - classToIdentifier.put(serverboundClazz, identifier); + if (clientboundClazz != null) { + classToIdentifier.put(clientboundClazz, identifier); + } + if (serverboundClazz != null) { + classToIdentifier.put(serverboundClazz, identifier); + } } public RegistrationBuilder define(String identifier) {