From afe8da56103fb53c2ee7b0d10e542b63be6cbb7c Mon Sep 17 00:00:00 2001 From: Angelina Michalek Date: Tue, 23 Jun 2026 02:36:39 -0400 Subject: [PATCH] Packet stuff --- src/main/java/cam72cam/mod/net/Packet.java | 33 ++++++++++++++----- .../cam72cam/mod/net/PacketDirection.java | 3 +- .../java/cam72cam/mod/net/PacketProtocol.java | 10 ++++++ 3 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 src/main/java/cam72cam/mod/net/PacketProtocol.java diff --git a/src/main/java/cam72cam/mod/net/Packet.java b/src/main/java/cam72cam/mod/net/Packet.java index 4ef36bf6c..6ac6e40cc 100644 --- a/src/main/java/cam72cam/mod/net/Packet.java +++ b/src/main/java/cam72cam/mod/net/Packet.java @@ -33,8 +33,8 @@ public abstract class Packet { private static final SimpleNetworkWrapper net = NetworkRegistry.INSTANCE.newSimpleChannel("cam72cam.mod"); - // Packet class name -> Packet Constructor - private static final Map> types = new HashMap<>(); + // Packet id -> Packet Constructor + private static final Map> packetFactories = new HashMap<>(); static { // Client to server @@ -48,6 +48,8 @@ public abstract class Packet { // Received packet data private TagCompound data; + protected final String id = this.getClass().getName(); + /** * So either forge or minecraft has a bug where it mixes up the player in the context handler... * @@ -59,9 +61,24 @@ public abstract class Packet { @TagField("umcWorld") private World world; + /** + * How to register a packet (do in CONSTRUCT phase) + * Overload that assumes the packet protocol is {@see PacketProtocol.PLAY} + * */ + public static void register(Supplier sup, PacketDirection dir) { + register(sup, dir, PacketProtocol.PLAY); + } + /** How to register a packet (do in CONSTRUCT phase) */ - public static void register(Supplier sup, PacketDirection dir) { - types.put(sup.get().getClass().toString(), sup); + public static void register(Supplier sup, PacketDirection dir, + PacketProtocol protocol) { + Packet packet = sup.get(); + if (packetFactories.containsKey(packet.id)) { + //Already registered, goodbye + return; + } + packetFactories.put(packet.id, sup); + // Packet Directions and Protocols are ignored in 1.12.2. } /** Called after deserialization */ @@ -128,15 +145,15 @@ public Message(Packet pkt) { @Override public void fromBytes(ByteBuf buf) { TagCompound data = new TagCompound(ByteBufUtils.readTag(buf)); - String cls = data.getString("cam72cam.mod.pktid"); - packet = types.get(cls).get(); + String id = data.getString("cam72cam.mod.pktid"); + packet = packetFactories.get(id).get(); packet.data = data; } @Override public void toBytes(ByteBuf buf) { TagCompound data = new TagCompound(); - data.setString("cam72cam.mod.pktid", packet.getClass().toString()); + data.setString("cam72cam.mod.pktid", packet.id); try { TagSerializer.serialize(data, packet); } catch (SerializationException e) { @@ -165,7 +182,7 @@ private void handle(T message, MessageContext ctx) { } if (message.packet.getPlayer() == null) { try { - throw new Exception(String.format("Invalid Packet %s: missing player", message.packet.getClass())); + throw new Exception(String.format("Invalid Packet %s: missing player", message.packet.id)); } catch (Exception e) { ModCore.catching(e); return; diff --git a/src/main/java/cam72cam/mod/net/PacketDirection.java b/src/main/java/cam72cam/mod/net/PacketDirection.java index 86859dd32..c21e5f43e 100644 --- a/src/main/java/cam72cam/mod/net/PacketDirection.java +++ b/src/main/java/cam72cam/mod/net/PacketDirection.java @@ -2,5 +2,6 @@ public enum PacketDirection { ClientToServer, - ServerToClient + ServerToClient, + Bidirectional } diff --git a/src/main/java/cam72cam/mod/net/PacketProtocol.java b/src/main/java/cam72cam/mod/net/PacketProtocol.java new file mode 100644 index 000000000..614bebd3b --- /dev/null +++ b/src/main/java/cam72cam/mod/net/PacketProtocol.java @@ -0,0 +1,10 @@ +package cam72cam.mod.net; + +/** + * If a protocol does not exist it in this version it will be faked during some other protocol. + */ +public enum PacketProtocol { + CONFIGURATION, + LOGIN, + PLAY +}