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..4362c13 100644 --- a/src/main/java/net/hypixel/modapi/packet/PacketRegistry.java +++ b/src/main/java/net/hypixel/modapi/packet/PacketRegistry.java @@ -10,23 +10,32 @@ 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)); - classToIdentifier.put(clientboundClazz, identifier); - classToIdentifier.put(serverboundClazz, identifier); + private void register( + String identifier, + Class clientboundClazz, Function clientPacketFactory, + Class serverboundClazz, Function serverPacketFactory) { + registrations.put(identifier, new Registration(clientboundClazz, clientPacketFactory, serverboundClazz, serverPacketFactory)); + if (clientboundClazz != null) { + classToIdentifier.put(clientboundClazz, identifier); + } + if (serverboundClazz != null) { + classToIdentifier.put(serverboundClazz, identifier); + } + } + + public RegistrationBuilder define(String identifier) { + return new RegistrationBuilder(this, identifier); } - private RegisteredType getRegisteredType(String identifier) { - RegisteredType registeredType = registrations.get(identifier); - if (registeredType == null) { + 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 +43,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 +58,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 + + '}'; + } } }