Skip to content

Commit c4f579b

Browse files
authored
feat: Separate registration of client/server packets (#15)
1 parent 19ec022 commit c4f579b

File tree

2 files changed

+87
-30
lines changed

2 files changed

+87
-30
lines changed

src/main/java/net/hypixel/modapi/HypixelModAPI.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,22 @@ public static HypixelModAPI getInstance() {
2929
private final List<ClientboundPacketHandler> handlers = new CopyOnWriteArrayList<>();
3030

3131
private HypixelModAPI() {
32-
registry.registerPacketType("hypixel:ping",
33-
ClientboundPingPacket.class, ClientboundPingPacket::new,
34-
ServerboundPingPacket.class, ServerboundPingPacket::new);
35-
registry.registerPacketType("hypixel:location",
36-
ClientboundLocationPacket.class, ClientboundLocationPacket::new,
37-
ServerboundLocationPacket.class, ServerboundLocationPacket::new);
38-
registry.registerPacketType("hypixel:party_info",
39-
ClientboundPartyInfoPacket.class, ClientboundPartyInfoPacket::new,
40-
ServerboundPartyInfoPacket.class, ServerboundPartyInfoPacket::new);
41-
registry.registerPacketType("hypixel:player_info",
42-
ClientboundPlayerInfoPacket.class, ClientboundPlayerInfoPacket::new,
43-
ServerboundPlayerInfoPacket.class, ServerboundPlayerInfoPacket::new);
32+
registry.define("hypixel:ping")
33+
.clientbound(ClientboundPingPacket.class, ClientboundPingPacket::new)
34+
.serverbound(ServerboundPingPacket.class, ServerboundPingPacket::new)
35+
.register();
36+
registry.define("hypixel:location")
37+
.clientbound(ClientboundLocationPacket.class, ClientboundLocationPacket::new)
38+
.serverbound(ServerboundLocationPacket.class, ServerboundLocationPacket::new)
39+
.register();
40+
registry.define("hypixel:party_info")
41+
.clientbound(ClientboundPartyInfoPacket.class, ClientboundPartyInfoPacket::new)
42+
.serverbound(ServerboundPartyInfoPacket.class, ServerboundPartyInfoPacket::new)
43+
.register();
44+
registry.define("hypixel:player_info")
45+
.clientbound(ClientboundPlayerInfoPacket.class, ClientboundPlayerInfoPacket::new)
46+
.serverbound(ServerboundPlayerInfoPacket.class, ServerboundPlayerInfoPacket::new)
47+
.register();
4448
}
4549

4650
public PacketRegistry getRegistry() {

src/main/java/net/hypixel/modapi/packet/PacketRegistry.java

Lines changed: 71 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,44 @@
1010

1111
public class PacketRegistry {
1212

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

16-
public void registerPacketType(String identifier,
17-
Class<? extends ClientboundHypixelPacket> clientboundClazz, Function<PacketSerializer, ClientboundHypixelPacket> clientPacketFactory,
18-
Class<? extends HypixelPacket> serverboundClazz, Function<PacketSerializer, HypixelPacket> serverPacketFactory) {
19-
registrations.put(identifier, new RegisteredType(clientboundClazz, clientPacketFactory, serverboundClazz, serverPacketFactory));
20-
classToIdentifier.put(clientboundClazz, identifier);
21-
classToIdentifier.put(serverboundClazz, identifier);
16+
private void register(
17+
String identifier,
18+
Class<? extends ClientboundHypixelPacket> clientboundClazz, Function<PacketSerializer, ? extends ClientboundHypixelPacket> clientPacketFactory,
19+
Class<? extends HypixelPacket> serverboundClazz, Function<PacketSerializer, ? extends HypixelPacket> serverPacketFactory) {
20+
registrations.put(identifier, new Registration(clientboundClazz, clientPacketFactory, serverboundClazz, serverPacketFactory));
21+
if (clientboundClazz != null) {
22+
classToIdentifier.put(clientboundClazz, identifier);
23+
}
24+
if (serverboundClazz != null) {
25+
classToIdentifier.put(serverboundClazz, identifier);
26+
}
27+
}
28+
29+
public RegistrationBuilder define(String identifier) {
30+
return new RegistrationBuilder(this, identifier);
2231
}
2332

24-
private RegisteredType getRegisteredType(String identifier) {
25-
RegisteredType registeredType = registrations.get(identifier);
26-
if (registeredType == null) {
33+
private Registration getRegistration(String identifier) {
34+
Registration registration = registrations.get(identifier);
35+
if (registration == null) {
2736
throw new IllegalArgumentException("Unknown packet identifier: " + identifier);
2837
}
29-
return registeredType;
38+
return registration;
3039
}
3140

3241
public boolean isRegistered(String identifier) {
3342
return registrations.containsKey(identifier);
3443
}
3544

3645
public ClientboundHypixelPacket createClientboundPacket(String identifier, PacketSerializer serializer) {
37-
return getRegisteredType(identifier).clientPacketFactory.apply(serializer);
46+
return getRegistration(identifier).clientPacketFactory.apply(serializer);
3847
}
3948

4049
public HypixelPacket createServerboundPacket(String identifier, PacketSerializer serializer) {
41-
return getRegisteredType(identifier).serverPacketFactory.apply(serializer);
50+
return getRegistration(identifier).serverPacketFactory.apply(serializer);
4251
}
4352

4453
public String getIdentifier(Class<? extends HypixelPacket> clazz) {
@@ -49,20 +58,64 @@ public Set<String> getIdentifiers() {
4958
return Collections.unmodifiableSet(registrations.keySet());
5059
}
5160

52-
private static final class RegisteredType {
61+
public static final class RegistrationBuilder {
62+
private final PacketRegistry registry;
63+
private final String identifier;
64+
65+
private Class<? extends ClientboundHypixelPacket> clientboundClazz;
66+
private Function<PacketSerializer, ? extends ClientboundHypixelPacket> clientPacketFactory;
67+
private Class<? extends HypixelPacket> serverboundClazz;
68+
private Function<PacketSerializer, ? extends HypixelPacket> serverPacketFactory;
69+
70+
RegistrationBuilder(PacketRegistry registry, String identifier) {
71+
this.registry = registry;
72+
this.identifier = identifier;
73+
}
74+
75+
public <T extends ClientboundHypixelPacket> RegistrationBuilder clientbound(
76+
Class<T> clientboundClazz, Function<PacketSerializer, T> clientPacketFactory) {
77+
this.clientboundClazz = clientboundClazz;
78+
this.clientPacketFactory = clientPacketFactory;
79+
return this;
80+
}
81+
82+
public <T extends HypixelPacket> RegistrationBuilder serverbound(
83+
Class<T> serverboundClazz, Function<PacketSerializer, T> serverPacketFactory) {
84+
this.serverboundClazz = serverboundClazz;
85+
this.serverPacketFactory = serverPacketFactory;
86+
return this;
87+
}
88+
89+
public void register() {
90+
registry.register(identifier, clientboundClazz, clientPacketFactory, serverboundClazz, serverPacketFactory);
91+
}
92+
93+
}
94+
95+
private static final class Registration {
5396

5497
private final Class<? extends ClientboundHypixelPacket> clientboundClazz;
55-
private final Function<PacketSerializer, ClientboundHypixelPacket> clientPacketFactory;
98+
private final Function<PacketSerializer, ? extends ClientboundHypixelPacket> clientPacketFactory;
5699
private final Class<? extends HypixelPacket> serverboundClazz;
57-
private final Function<PacketSerializer, HypixelPacket> serverPacketFactory;
100+
private final Function<PacketSerializer, ? extends HypixelPacket> serverPacketFactory;
58101

59-
public RegisteredType(Class<? extends ClientboundHypixelPacket> clientboundClazz, Function<PacketSerializer, ClientboundHypixelPacket> clientPacketFactory,
60-
Class<? extends HypixelPacket> serverboundClazz, Function<PacketSerializer, HypixelPacket> serverPacketFactory) {
102+
public Registration(Class<? extends ClientboundHypixelPacket> clientboundClazz, Function<PacketSerializer, ? extends ClientboundHypixelPacket> clientPacketFactory,
103+
Class<? extends HypixelPacket> serverboundClazz, Function<PacketSerializer, ? extends HypixelPacket> serverPacketFactory) {
61104
this.clientboundClazz = clientboundClazz;
62105
this.clientPacketFactory = clientPacketFactory;
63106
this.serverboundClazz = serverboundClazz;
64107
this.serverPacketFactory = serverPacketFactory;
65108
}
109+
110+
@Override
111+
public String toString() {
112+
return "Registration{" +
113+
"clientboundClazz=" + clientboundClazz +
114+
", clientPacketFactory=" + clientPacketFactory +
115+
", serverboundClazz=" + serverboundClazz +
116+
", serverPacketFactory=" + serverPacketFactory +
117+
'}';
118+
}
66119
}
67120

68121
}

0 commit comments

Comments
 (0)