Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 16 additions & 12 deletions src/main/java/net/hypixel/modapi/HypixelModAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,22 @@ public static HypixelModAPI getInstance() {
private final List<ClientboundPacketHandler> 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() {
Expand Down
89 changes: 71 additions & 18 deletions src/main/java/net/hypixel/modapi/packet/PacketRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,35 +10,44 @@

public class PacketRegistry {

private final Map<String, RegisteredType> registrations = new ConcurrentHashMap<>();
private final Map<String, Registration> registrations = new ConcurrentHashMap<>();
private final Map<Class<? extends HypixelPacket>, String> classToIdentifier = new ConcurrentHashMap<>();

public void registerPacketType(String identifier,
Class<? extends ClientboundHypixelPacket> clientboundClazz, Function<PacketSerializer, ClientboundHypixelPacket> clientPacketFactory,
Class<? extends HypixelPacket> serverboundClazz, Function<PacketSerializer, HypixelPacket> serverPacketFactory) {
registrations.put(identifier, new RegisteredType(clientboundClazz, clientPacketFactory, serverboundClazz, serverPacketFactory));
classToIdentifier.put(clientboundClazz, identifier);
classToIdentifier.put(serverboundClazz, identifier);
private void register(
String identifier,
Class<? extends ClientboundHypixelPacket> clientboundClazz, Function<PacketSerializer, ? extends ClientboundHypixelPacket> clientPacketFactory,
Class<? extends HypixelPacket> serverboundClazz, Function<PacketSerializer, ? extends HypixelPacket> 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) {
return registrations.containsKey(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<? extends HypixelPacket> clazz) {
Expand All @@ -49,20 +58,64 @@ public Set<String> 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<? extends ClientboundHypixelPacket> clientboundClazz;
private Function<PacketSerializer, ? extends ClientboundHypixelPacket> clientPacketFactory;
private Class<? extends HypixelPacket> serverboundClazz;
private Function<PacketSerializer, ? extends HypixelPacket> serverPacketFactory;

RegistrationBuilder(PacketRegistry registry, String identifier) {
this.registry = registry;
this.identifier = identifier;
}

public <T extends ClientboundHypixelPacket> RegistrationBuilder clientbound(
Class<T> clientboundClazz, Function<PacketSerializer, T> clientPacketFactory) {
this.clientboundClazz = clientboundClazz;
this.clientPacketFactory = clientPacketFactory;
return this;
}

public <T extends HypixelPacket> RegistrationBuilder serverbound(
Class<T> serverboundClazz, Function<PacketSerializer, T> 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<? extends ClientboundHypixelPacket> clientboundClazz;
private final Function<PacketSerializer, ClientboundHypixelPacket> clientPacketFactory;
private final Function<PacketSerializer, ? extends ClientboundHypixelPacket> clientPacketFactory;
private final Class<? extends HypixelPacket> serverboundClazz;
private final Function<PacketSerializer, HypixelPacket> serverPacketFactory;
private final Function<PacketSerializer, ? extends HypixelPacket> serverPacketFactory;

public RegisteredType(Class<? extends ClientboundHypixelPacket> clientboundClazz, Function<PacketSerializer, ClientboundHypixelPacket> clientPacketFactory,
Class<? extends HypixelPacket> serverboundClazz, Function<PacketSerializer, HypixelPacket> serverPacketFactory) {
public Registration(Class<? extends ClientboundHypixelPacket> clientboundClazz, Function<PacketSerializer, ? extends ClientboundHypixelPacket> clientPacketFactory,
Class<? extends HypixelPacket> serverboundClazz, Function<PacketSerializer, ? extends HypixelPacket> 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 +
'}';
}
}

}