From f59b0d877a4a98ed3a2c526cc2dde1d032e54e20 Mon Sep 17 00:00:00 2001 From: Rubenicos <44579213+Rubenicos@users.noreply.github.com> Date: Sun, 19 Nov 2023 08:22:20 -0600 Subject: [PATCH 1/7] Add functional packet listener --- .../api/listener/AbstractPacketEvent.java | 49 ++++++++++++++ .../api/listener/AbstractPacketListener.java | 33 +++++++++- .../api/listener/PacketReceiveEvent.java | 30 ++------- .../api/listener/PacketSendEvent.java | 30 +-------- .../AbstractPacketListenerProvider.java | 66 +++++++++++++++++++ .../api/providers/PacketListenerProvider.java | 13 +++- .../BungeeCordPacketListenerProvider.java | 45 ++----------- .../VelocityPacketListenerProvider.java | 45 ++----------- 8 files changed, 172 insertions(+), 139 deletions(-) create mode 100644 protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/AbstractPacketEvent.java create mode 100644 protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/AbstractPacketListenerProvider.java diff --git a/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/AbstractPacketEvent.java b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/AbstractPacketEvent.java new file mode 100644 index 00000000..78c6423f --- /dev/null +++ b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/AbstractPacketEvent.java @@ -0,0 +1,49 @@ +package dev.simplix.protocolize.api.listener; + +import dev.simplix.protocolize.api.player.ProtocolizePlayer; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +/** + * This class is containing information about the packet event. + *

+ * Date: 19.11.2023 + * + * @author Rubenicos + */ +@Getter +@Setter +@Accessors(fluent = true) +@AllArgsConstructor +@ToString +public abstract class AbstractPacketEvent { + + protected final ProtocolizePlayer player; + protected final Object server; + protected T packet; + protected boolean cancelled; + + /** + * The protocolize player instance. + * + * @return The player instance or null if Protocolize was unable to track down the player + * during early communication phases like HANDSHAKE or STATUS. + */ + public ProtocolizePlayer player() { + return player; + } + + /** + * The platform dependent server info instance. + * + * @param The type of the server info + * @return The platform dependent server info instance or null if Protocolize was unable to track down the server + * during early communication phases like HANDSHAKE or STATUS. + */ + public S server() { + return (S) server; + } +} diff --git a/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/AbstractPacketListener.java b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/AbstractPacketListener.java index 7b11daf9..95edfa3b 100644 --- a/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/AbstractPacketListener.java +++ b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/AbstractPacketListener.java @@ -2,8 +2,11 @@ import dev.simplix.protocolize.api.Direction; import lombok.Getter; +import lombok.Setter; import lombok.experimental.Accessors; +import java.util.function.Consumer; + /** * Used for listening to incoming and outgoing packets. *

@@ -13,6 +16,7 @@ * @author Exceptionflug */ @Getter +@Setter @Accessors(fluent = true) public abstract class AbstractPacketListener { @@ -20,6 +24,11 @@ public abstract class AbstractPacketListener { private final Direction direction; private final int priority; + private Consumer> onReceive; + private Consumer> onSend; + + private transient boolean registered; + /** * Creates an instance of your listener. * @@ -38,13 +47,33 @@ protected AbstractPacketListener(Class type, Direction direction, int priorit * * @param event The event containing information about the packet */ - public abstract void packetReceive(PacketReceiveEvent event); + public void packetReceive(PacketReceiveEvent event) { + if (onReceive == null) { + packetEvent(event); + } else { + onReceive.accept(event); + } + } /** * Gets called when a packet has been processed by the Protocolize encoder handler. * * @param event The event containing information about the packet */ - public abstract void packetSend(PacketSendEvent event); + public void packetSend(PacketSendEvent event) { + if (onSend == null) { + packetEvent(event); + } else { + onSend.accept(event); + } + } + /** + * Gets called when a packet has been processed by any Protocolize handler. + * + * @param event The event containing information about the packet + */ + public void packetEvent(AbstractPacketEvent event) { + // empty default method + } } diff --git a/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketReceiveEvent.java b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketReceiveEvent.java index 3dfc8f52..74254652 100644 --- a/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketReceiveEvent.java +++ b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketReceiveEvent.java @@ -1,7 +1,6 @@ package dev.simplix.protocolize.api.listener; import dev.simplix.protocolize.api.player.ProtocolizePlayer; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -17,35 +16,14 @@ @Getter @Setter @Accessors(fluent = true) -@AllArgsConstructor @ToString -public class PacketReceiveEvent { +public class PacketReceiveEvent extends AbstractPacketEvent { - private final ProtocolizePlayer player; - private final Object server; - private T packet; - private boolean cancelled; private boolean dirty; - /** - * The platform {@link ProtocolizePlayer} instance. - * - * @return The player instance or null if Protocolize was unable to track down the player - * during early communication phases like HANDSHAKE or STATUS. - */ - public ProtocolizePlayer player() { - return player; - } - - /** - * The platform dependent server info instance. - * - * @param The type of the server info - * @return The platform dependent server info instance or null if Protocolize was unable to track down the server - * during early communication phases like HANDSHAKE or STATUS. - */ - public S server() { - return (S) server; + public PacketReceiveEvent(ProtocolizePlayer player, Object server, T packet, boolean cancelled, boolean dirty) { + super(player, server, packet, cancelled); + this.dirty = dirty; } /** diff --git a/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketSendEvent.java b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketSendEvent.java index 3ba6950e..86e97776 100644 --- a/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketSendEvent.java +++ b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketSendEvent.java @@ -1,7 +1,6 @@ package dev.simplix.protocolize.api.listener; import dev.simplix.protocolize.api.player.ProtocolizePlayer; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -17,34 +16,11 @@ @Getter @Setter @Accessors(fluent = true) -@AllArgsConstructor @ToString -public class PacketSendEvent { +public class PacketSendEvent extends AbstractPacketEvent { - private final ProtocolizePlayer player; - private final Object server; - private T packet; - private boolean cancelled; - - /** - * The protocolize player instance. - * - * @return The player instance or null if Protocolize was unable to track down the player - * during early communication phases like HANDSHAKE or STATUS. - */ - public ProtocolizePlayer player() { - return player; - } - - /** - * The platform dependent server info instance. - * - * @param The type of the server info - * @return The platform dependent server info instance or null if Protocolize was unable to track down the server - * during early communication phases like HANDSHAKE or STATUS. - */ - public S server() { - return (S) server; + public PacketSendEvent(ProtocolizePlayer player, Object server, T packet, boolean cancelled) { + super(player, server, packet, cancelled); } /** diff --git a/protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/AbstractPacketListenerProvider.java b/protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/AbstractPacketListenerProvider.java new file mode 100644 index 00000000..c421b77a --- /dev/null +++ b/protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/AbstractPacketListenerProvider.java @@ -0,0 +1,66 @@ +package dev.simplix.protocolize.api.providers; + +import com.google.common.base.Preconditions; +import dev.simplix.protocolize.api.listener.AbstractPacketListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * Date: 19.11.2023 + * + * @author Rubenicos + */ +public abstract class AbstractPacketListenerProvider implements PacketListenerProvider { + + protected final List> listeners = new ArrayList<>(); + + @Override + public > A registerListener(A listener) { + Preconditions.checkNotNull(listener, "The listener cannot be null!"); + if (listeners.contains(listener)) { + throw new IllegalStateException("Listener already registered."); + } + addListener(listener); + return listener; + } + + protected void addListener(AbstractPacketListener listener) { + listeners.add(listener); + listener.registered(true); + } + + @Override + public > A unregisterListener(A listener) throws IllegalArgumentException { + if (listeners.contains(listener)) { + listeners.remove(listener); + listener.registered(false); + return listener; + } else { + throw new IllegalArgumentException("Did not find " + listener.getClass().getName() + " as a registered listener"); + } + } + + @Override + public String debugInformation() { + StringBuilder builder = new StringBuilder("Generated export of " + getClass().getName() + ":\n\n"); + for (AbstractPacketListener listener : listeners) { + builder.append(" - ").append(listener.getClass().getName()).append(" listening for ") + .append(listener.type().getName()).append(" on ").append(listener.direction().name()) + .append(" with priority ").append(listener.priority()).append("\n"); + } + return builder.toString(); + } + + @Override + public List> listenersForType(Class clazz) { + Preconditions.checkNotNull(clazz, "The clazz cannot be null!"); + List> out = new ArrayList<>(); + for (AbstractPacketListener listener : listeners) { + if (listener.type().equals(clazz)) { + out.add(listener); + } + } + return out; + } +} diff --git a/protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/PacketListenerProvider.java b/protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/PacketListenerProvider.java index 25470af8..973589ce 100644 --- a/protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/PacketListenerProvider.java +++ b/protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/PacketListenerProvider.java @@ -1,5 +1,6 @@ package dev.simplix.protocolize.api.providers; +import dev.simplix.protocolize.api.Direction; import dev.simplix.protocolize.api.listener.AbstractPacketListener; import java.util.List; @@ -11,9 +12,17 @@ */ public interface PacketListenerProvider { - void registerListener(AbstractPacketListener listener); + default AbstractPacketListener registerListener(Class packet, Direction direction) { + return registerListener(packet, direction, 0); + } - void unregisterListener(AbstractPacketListener listener) throws IllegalArgumentException; + default AbstractPacketListener registerListener(Class packet, Direction direction, int priority) { + return registerListener(new AbstractPacketListener(packet, direction, priority) { }); + } + + > A registerListener(A listener); + + > A unregisterListener(A listener) throws IllegalArgumentException; List> listenersForType(Class type); diff --git a/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/providers/BungeeCordPacketListenerProvider.java b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/providers/BungeeCordPacketListenerProvider.java index 738f7843..1cdb6175 100644 --- a/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/providers/BungeeCordPacketListenerProvider.java +++ b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/providers/BungeeCordPacketListenerProvider.java @@ -7,7 +7,7 @@ import dev.simplix.protocolize.api.listener.PacketReceiveEvent; import dev.simplix.protocolize.api.listener.PacketSendEvent; import dev.simplix.protocolize.api.packet.AbstractPacket; -import dev.simplix.protocolize.api.providers.PacketListenerProvider; +import dev.simplix.protocolize.api.providers.AbstractPacketListenerProvider; import dev.simplix.protocolize.api.providers.ProtocolizePlayerProvider; import dev.simplix.protocolize.bungee.packet.BungeeCordProtocolizePacket; import dev.simplix.protocolize.bungee.util.ReflectionUtil; @@ -28,41 +28,16 @@ * * @author Exceptionflug */ -public final class BungeeCordPacketListenerProvider implements PacketListenerProvider { +public final class BungeeCordPacketListenerProvider extends AbstractPacketListenerProvider { private static final ProtocolizePlayerProvider PLAYER_PROVIDER = Protocolize.playerProvider(); - private final List> listeners = new ArrayList<>(); @Override - public void registerListener(AbstractPacketListener listener) { - Preconditions.checkNotNull(listener, "The listener cannot be null!"); - if (listeners.contains(listener)) { - throw new IllegalStateException("Listener already registered."); - } + protected void addListener(AbstractPacketListener listener) { if (!AbstractPacket.class.isAssignableFrom(listener.type()) && !DefinedPacket.class.isAssignableFrom(listener.type())) { throw new IllegalStateException("The packet type is not a valid packet type. Allowed: AbstractPacket and DefinedPacket"); } - listeners.add(listener); - } - - @Override - public void unregisterListener(AbstractPacketListener listener) throws IllegalArgumentException { - if (listeners.contains(listener)) { - listeners.remove(listener); - } else { - throw new IllegalArgumentException("Did not find " + listener.getClass().getName() + " as a registered listener"); - } - } - - @Override - public String debugInformation() { - StringBuilder builder = new StringBuilder("Generated export of " + getClass().getName() + ":\n\n"); - for (AbstractPacketListener listener : listeners) { - builder.append(" - ").append(listener.getClass().getName()).append(" listening for ") - .append(listener.type().getName()).append(" on ").append(listener.direction().name()) - .append(" with priority ").append(listener.priority()).append("\n"); - } - return builder.toString(); + super.addListener(listener); } /** @@ -216,16 +191,4 @@ private ProxiedPlayer player(Connection connection) { return null; } - @Override - public List> listenersForType(Class clazz) { - Preconditions.checkNotNull(clazz, "The clazz cannot be null!"); - List> out = new ArrayList<>(); - for (AbstractPacketListener listener : listeners) { - if (listener.type().equals(clazz)) { - out.add(listener); - } - } - return out; - } - } diff --git a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/providers/VelocityPacketListenerProvider.java b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/providers/VelocityPacketListenerProvider.java index e5d96d0b..94dfbe38 100644 --- a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/providers/VelocityPacketListenerProvider.java +++ b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/providers/VelocityPacketListenerProvider.java @@ -15,7 +15,7 @@ import dev.simplix.protocolize.api.listener.PacketReceiveEvent; import dev.simplix.protocolize.api.listener.PacketSendEvent; import dev.simplix.protocolize.api.packet.AbstractPacket; -import dev.simplix.protocolize.api.providers.PacketListenerProvider; +import dev.simplix.protocolize.api.providers.AbstractPacketListenerProvider; import dev.simplix.protocolize.api.providers.ProtocolRegistrationProvider; import dev.simplix.protocolize.api.providers.ProtocolizePlayerProvider; import dev.simplix.protocolize.api.util.ReflectionUtil; @@ -36,11 +36,10 @@ * @author Exceptionflug */ @Slf4j -public final class VelocityPacketListenerProvider implements PacketListenerProvider { +public final class VelocityPacketListenerProvider extends AbstractPacketListenerProvider { private static final ProtocolizePlayerProvider PLAYER_PROVIDER = Protocolize.playerProvider(); private final ProtocolRegistrationProvider registrationProvider = Protocolize.protocolRegistration(); - private final List> listeners = new ArrayList<>(); private Field packetIdToSupplierField; private Field serverboundField; @@ -63,11 +62,7 @@ public final class VelocityPacketListenerProvider implements PacketListenerProvi } @Override - public void registerListener(AbstractPacketListener listener) { - Preconditions.checkNotNull(listener, "The listener cannot be null!"); - if (listeners.contains(listener)) { - throw new IllegalStateException("Listener already registered."); - } + protected void addListener(AbstractPacketListener listener) { if (!AbstractPacket.class.isAssignableFrom(listener.type()) && !MinecraftPacket.class.isAssignableFrom(listener.type())) { throw new IllegalStateException("The packet type is not a valid packet type. Allowed: AbstractPacket and MinecraftPacket"); } @@ -78,7 +73,7 @@ public void registerListener(AbstractPacketListener listener) { log.error("Unable to register additional suppliers for velocity packet " + listener.type().getName(), e); } } - listeners.add(listener); + super.addListener(listener); } private void ensureAlsoEncode(Class type) throws Exception { @@ -118,26 +113,6 @@ private void addDefaultSupplier(StateRegistry.PacketRegistry.ProtocolRegistry re }); } - @Override - public void unregisterListener(AbstractPacketListener listener) throws IllegalArgumentException { - if (listeners.contains(listener)) { - listeners.remove(listener); - } else { - throw new IllegalArgumentException("Did not find " + listener.getClass().getName() + " as a registered listener"); - } - } - - @Override - public String debugInformation() { - StringBuilder builder = new StringBuilder("Generated export of " + getClass().getName() + ":\n\n"); - for (AbstractPacketListener listener : listeners) { - builder.append(" - ").append(listener.getClass().getName()).append(" listening for ") - .append(listener.type().getName()).append(" on ").append(listener.direction().name()) - .append(" with priority ").append(listener.priority()).append("\n"); - } - return builder.toString(); - } - public Map.Entry handleInboundPacket(MinecraftPacket packet, ServerConnection serverConnection, InboundConnection connection) { Preconditions.checkNotNull(packet, "Packet cannot be null"); boolean sentByServer = serverConnection != null; @@ -189,18 +164,6 @@ private PacketReceiveEvent createReceiveEvent(InboundConnection connection, S } } - @Override - public List> listenersForType(Class clazz) { - Preconditions.checkNotNull(clazz, "The clazz cannot be null!"); - List> out = new ArrayList<>(); - for (AbstractPacketListener listener : listeners) { - if (listener.type().equals(clazz)) { - out.add(listener); - } - } - return out; - } - public MinecraftPacket handleOutboundPacket(MinecraftPacket packet, InboundConnection inboundConnection, ServerConnection serverConnection) { Preconditions.checkNotNull(packet, "Packet cannot be null"); Class clazz; From a90ea348d03fe9f83fe5d467a09ce452a60f603f Mon Sep 17 00:00:00 2001 From: Rubenicos <44579213+Rubenicos@users.noreply.github.com> Date: Sun, 19 Nov 2023 09:44:08 -0600 Subject: [PATCH 2/7] Add protocol type to sending packets --- .../api/player/ProtocolizePlayer.java | 16 +++++++++++----- .../player/BungeeCordProtocolizePlayer.java | 8 ++++---- ...nitialInboundConnectionProtocolizePlayer.java | 9 +++++++-- .../player/VelocityProtocolizePlayer.java | 8 ++++---- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/protocolize-api/src/main/java/dev/simplix/protocolize/api/player/ProtocolizePlayer.java b/protocolize-api/src/main/java/dev/simplix/protocolize/api/player/ProtocolizePlayer.java index b6c64f02..5b31f0d2 100644 --- a/protocolize-api/src/main/java/dev/simplix/protocolize/api/player/ProtocolizePlayer.java +++ b/protocolize-api/src/main/java/dev/simplix/protocolize/api/player/ProtocolizePlayer.java @@ -1,9 +1,7 @@ package dev.simplix.protocolize.api.player; import com.google.common.collect.Lists; -import dev.simplix.protocolize.api.Location; -import dev.simplix.protocolize.api.PlayerInteract; -import dev.simplix.protocolize.api.SoundCategory; +import dev.simplix.protocolize.api.*; import dev.simplix.protocolize.api.inventory.Inventory; import dev.simplix.protocolize.api.inventory.PlayerInventory; import dev.simplix.protocolize.api.item.BaseItemStack; @@ -28,9 +26,17 @@ public interface ProtocolizePlayer { PlayerInventory proxyInventory(); - void sendPacket(Object packet); + default void sendPacket(Object packet) { + sendPacket(packet, Protocol.PLAY); + } + + void sendPacket(Object packet, Protocol protocol); + + default void sendPacketToServer(Object packet) { + sendPacketToServer(packet, Protocol.PLAY); + } - void sendPacketToServer(Object packet); + void sendPacketToServer(Object packet, Protocol protocol); Map registeredInventories(); diff --git a/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/player/BungeeCordProtocolizePlayer.java b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/player/BungeeCordProtocolizePlayer.java index ff86d7ae..035ca38e 100644 --- a/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/player/BungeeCordProtocolizePlayer.java +++ b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/player/BungeeCordProtocolizePlayer.java @@ -45,10 +45,10 @@ public BungeeCordProtocolizePlayer(UUID uniqueId) { } @Override - public void sendPacket(Object packet) { + public void sendPacket(Object packet, Protocol protocol) { if (packet instanceof AbstractPacket) { BungeeCordProtocolizePacket pack = (BungeeCordProtocolizePacket) REGISTRATION_PROVIDER.createPacket((Class) packet.getClass(), - Protocol.PLAY, PacketDirection.CLIENTBOUND, protocolVersion()); + protocol, PacketDirection.CLIENTBOUND, protocolVersion()); pack.wrapper((AbstractPacket) packet); packet = pack; } @@ -59,10 +59,10 @@ public void sendPacket(Object packet) { } @Override - public void sendPacketToServer(Object packet) { + public void sendPacketToServer(Object packet, Protocol protocol) { if (packet instanceof AbstractPacket) { BungeeCordProtocolizePacket pack = (BungeeCordProtocolizePacket) REGISTRATION_PROVIDER.createPacket((Class) packet.getClass(), - Protocol.PLAY, PacketDirection.SERVERBOUND, protocolVersion()); + protocol, PacketDirection.SERVERBOUND, protocolVersion()); pack.wrapper((AbstractPacket) packet); packet = pack; } diff --git a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/InitialInboundConnectionProtocolizePlayer.java b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/InitialInboundConnectionProtocolizePlayer.java index d56cd5a7..cc6c5cbe 100644 --- a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/InitialInboundConnectionProtocolizePlayer.java +++ b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/InitialInboundConnectionProtocolizePlayer.java @@ -50,9 +50,14 @@ public PlayerInventory proxyInventory() { @Override public void sendPacket(Object packet) { + sendPacket(packet, Protocol.STATUS); + } + + @Override + public void sendPacket(Object packet, Protocol protocol) { if (packet instanceof AbstractPacket) { VelocityProtocolizePacket pack = (VelocityProtocolizePacket) REGISTRATION_PROVIDER.createPacket((Class) packet.getClass(), - Protocol.STATUS, PacketDirection.CLIENTBOUND, protocolVersion()); + protocol, PacketDirection.CLIENTBOUND, protocolVersion()); if (pack == null) { throw new IllegalStateException("Cannot send " + packet.getClass().getName() + " to players with protocol version " + protocolVersion()); } @@ -69,7 +74,7 @@ public void sendPacket(Object packet) { } @Override - public void sendPacketToServer(Object packet) { + public void sendPacketToServer(Object packet, Protocol protocol) { throw new IllegalStateException("Not possible for initial inbound connections"); } diff --git a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/VelocityProtocolizePlayer.java b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/VelocityProtocolizePlayer.java index 2392ffec..c18b6eda 100644 --- a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/VelocityProtocolizePlayer.java +++ b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/VelocityProtocolizePlayer.java @@ -46,10 +46,10 @@ public VelocityProtocolizePlayer(ProxyServer proxyServer, UUID uniqueId) { } @Override - public void sendPacket(Object packet) { + public void sendPacket(Object packet, Protocol protocol) { if (packet instanceof AbstractPacket) { VelocityProtocolizePacket pack = (VelocityProtocolizePacket) REGISTRATION_PROVIDER.createPacket((Class) packet.getClass(), - Protocol.PLAY, PacketDirection.CLIENTBOUND, protocolVersion()); + protocol, PacketDirection.CLIENTBOUND, protocolVersion()); if (pack == null) { throw new IllegalStateException("Cannot send " + packet.getClass().getName() + " to players with protocol version " + protocolVersion()); } @@ -63,10 +63,10 @@ public void sendPacket(Object packet) { } @Override - public void sendPacketToServer(Object packet) { + public void sendPacketToServer(Object packet, Protocol protocol) { if (packet instanceof AbstractPacket) { VelocityProtocolizePacket pack = (VelocityProtocolizePacket) REGISTRATION_PROVIDER.createPacket((Class) packet.getClass(), - Protocol.PLAY, PacketDirection.SERVERBOUND, protocolVersion()); + protocol, PacketDirection.SERVERBOUND, protocolVersion()); if (pack == null) { throw new IllegalStateException("Cannot send " + packet.getClass().getName() + " to players with protocol version " + protocolVersion()); } From 4c42e6de9b23f44884e3d887d6bb7c833267bc0b Mon Sep 17 00:00:00 2001 From: Rubenicos <44579213+Rubenicos@users.noreply.github.com> Date: Sun, 19 Nov 2023 11:11:30 -0600 Subject: [PATCH 3/7] Add player protocol getter --- .../api/player/ProtocolizePlayer.java | 4 ++ .../ProtocolizeDecoderChannelHandler.java | 19 +------ .../player/BungeeCordProtocolizePlayer.java | 13 +++++ ...ungeeCordProtocolRegistrationProvider.java | 26 ++-------- .../bungee/util/ConversionUtils.java | 47 +++++++++++++++++ .../bungee/util/ReflectionUtil.java | 46 +++++++++++++---- ...ialInboundConnectionProtocolizePlayer.java | 30 +++++++++++ .../player/VelocityProtocolizePlayer.java | 50 +++++++++++++++++++ .../VelocityProtocolRegistrationProvider.java | 39 +++------------ .../velocity/util/ConversionUtils.java | 18 ++++++- 10 files changed, 210 insertions(+), 82 deletions(-) create mode 100644 protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/util/ConversionUtils.java diff --git a/protocolize-api/src/main/java/dev/simplix/protocolize/api/player/ProtocolizePlayer.java b/protocolize-api/src/main/java/dev/simplix/protocolize/api/player/ProtocolizePlayer.java index 5b31f0d2..d8b7aaa1 100644 --- a/protocolize-api/src/main/java/dev/simplix/protocolize/api/player/ProtocolizePlayer.java +++ b/protocolize-api/src/main/java/dev/simplix/protocolize/api/player/ProtocolizePlayer.java @@ -44,6 +44,10 @@ default void sendPacketToServer(Object packet) { int protocolVersion(); + Protocol decodeProtocol(); + + Protocol encodeProtocol(); + T handle(); Location location(); diff --git a/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/netty/ProtocolizeDecoderChannelHandler.java b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/netty/ProtocolizeDecoderChannelHandler.java index f7e0e8cf..93bcbce0 100644 --- a/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/netty/ProtocolizeDecoderChannelHandler.java +++ b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/netty/ProtocolizeDecoderChannelHandler.java @@ -7,6 +7,7 @@ import dev.simplix.protocolize.bungee.ProtocolizePlugin; import dev.simplix.protocolize.bungee.providers.BungeeCordPacketListenerProvider; import dev.simplix.protocolize.bungee.util.CancelSendSignal; +import dev.simplix.protocolize.bungee.util.ConversionUtils; import dev.simplix.protocolize.bungee.util.ReflectionUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; @@ -86,7 +87,7 @@ protected void decode(final ChannelHandlerContext ctx, final PacketWrapper msg, try { // Try packet rewrite final ByteBuf buf = Unpooled.directBuffer(); - int packetID = REGISTRATION_PROVIDER.packetId(packet, protocolizeProtocol(), + int packetID = REGISTRATION_PROVIDER.packetId(packet, ConversionUtils.protocolizeProtocol(protocol), direction == Direction.TO_CLIENT ? PacketDirection.CLIENTBOUND : PacketDirection.SERVERBOUND, protocolVersion); if (packetID != -1) { @@ -107,22 +108,6 @@ protected void decode(final ChannelHandlerContext ctx, final PacketWrapper msg, } } - private dev.simplix.protocolize.api.Protocol protocolizeProtocol() { - switch (protocol) { - case GAME: - return dev.simplix.protocolize.api.Protocol.PLAY; - case LOGIN: - return dev.simplix.protocolize.api.Protocol.LOGIN; - case STATUS: - return dev.simplix.protocolize.api.Protocol.STATUS; - case HANDSHAKE: - return dev.simplix.protocolize.api.Protocol.HANDSHAKE; - case CONFIGURATION: - return dev.simplix.protocolize.api.Protocol.CONFIGURATION; - } - return null; - } - @Override public void exceptionCaught(final ChannelHandlerContext ctx, final Throwable cause) throws Exception { if (cause.getClass().equals(CancelSendSignal.INSTANCE.getClass())) diff --git a/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/player/BungeeCordProtocolizePlayer.java b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/player/BungeeCordProtocolizePlayer.java index 035ca38e..4caaa3aa 100644 --- a/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/player/BungeeCordProtocolizePlayer.java +++ b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/player/BungeeCordProtocolizePlayer.java @@ -7,6 +7,7 @@ import dev.simplix.protocolize.api.player.ProtocolizePlayer; import dev.simplix.protocolize.api.providers.ProtocolRegistrationProvider; import dev.simplix.protocolize.bungee.packet.BungeeCordProtocolizePacket; +import dev.simplix.protocolize.bungee.util.ConversionUtils; import dev.simplix.protocolize.bungee.util.ReflectionUtil; import lombok.Getter; import lombok.experimental.Accessors; @@ -91,6 +92,18 @@ public int protocolVersion() { return ReflectionUtil.getProtocolVersion(player()); } + @Override + public Protocol decodeProtocol() { + net.md_5.bungee.protocol.Protocol protocol = ReflectionUtil.getDecodeProtocol(player()); + return protocol == null ? null : ConversionUtils.protocolizeProtocol(protocol); + } + + @Override + public Protocol encodeProtocol() { + net.md_5.bungee.protocol.Protocol protocol = ReflectionUtil.getEncodeProtocol(player()); + return protocol == null ? null : ConversionUtils.protocolizeProtocol(protocol); + } + @Override public T handle() { return (T) player(); diff --git a/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/providers/BungeeCordProtocolRegistrationProvider.java b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/providers/BungeeCordProtocolRegistrationProvider.java index d216342a..ba8bb7a7 100644 --- a/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/providers/BungeeCordProtocolRegistrationProvider.java +++ b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/providers/BungeeCordProtocolRegistrationProvider.java @@ -12,6 +12,7 @@ import dev.simplix.protocolize.api.util.ReflectionUtil; import dev.simplix.protocolize.bungee.packet.BungeeCordProtocolizePacket; import dev.simplix.protocolize.bungee.strategy.PacketRegistrationStrategy; +import dev.simplix.protocolize.bungee.util.ConversionUtils; import gnu.trove.map.TIntObjectMap; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -19,16 +20,13 @@ import net.bytebuddy.implementation.MethodDelegation; import net.bytebuddy.implementation.bind.annotation.RuntimeType; import net.bytebuddy.matcher.ElementMatchers; -import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.protocol.DefinedPacket; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.AbstractMap; import java.util.List; -import java.util.logging.Level; /** * Date: 20.08.2021 @@ -91,7 +89,7 @@ public void registerPacket(List mappings, Protocol protocol, try { Class definedPacketClass = generateBungeePacket(packetClass); TIntObjectMap protocols = (TIntObjectMap) protocolsField - .get(getDirectionData(bungeeCordProtocol(protocol), direction)); + .get(getDirectionData(ConversionUtils.bungeeCordProtocol(protocol), direction)); for (ProtocolIdMapping mapping : mappings) { mappingProvider.registerMapping(new RegisteredPacket(direction, packetClass), mapping); for (int i = mapping.protocolRangeStart(); i <= mapping.protocolRangeEnd(); i++) { @@ -118,7 +116,7 @@ public int packetId(Object packet, Protocol protocol, PacketDirection direction, } } } else { - Object data = getDirectionData(bungeeCordProtocol(protocol), direction); + Object data = getDirectionData(ConversionUtils.bungeeCordProtocol(protocol), direction); try { return (int) getIdMethod.invoke(data, packet.getClass(), protocolVersion); } catch (final IllegalAccessException | InvocationTargetException e) { @@ -140,7 +138,7 @@ public Object createPacket(Class clazz, Protocol proto Preconditions.checkNotNull(protocol, "Protocol cannot be null"); Preconditions.checkNotNull(direction, "Direction cannot be null"); Preconditions.checkNotNull(clazz, "Clazz cannot be null"); - Object directionData = getDirectionData(bungeeCordProtocol(protocol), direction); + Object directionData = getDirectionData(ConversionUtils.bungeeCordProtocol(protocol), direction); ProtocolIdMapping protocolIdMapping = mappingProvider.mapping(new RegisteredPacket(direction, clazz), protocolVersion); int id; @@ -157,22 +155,6 @@ public String debugInformation() { return "Strategy = " + strategy.getClass().getName() + "\nPacket listing not supported on this platform"; } - private net.md_5.bungee.protocol.Protocol bungeeCordProtocol(Protocol protocol) { - switch (protocol) { - case HANDSHAKE: - return net.md_5.bungee.protocol.Protocol.HANDSHAKE; - case STATUS: - return net.md_5.bungee.protocol.Protocol.STATUS; - case LOGIN: - return net.md_5.bungee.protocol.Protocol.LOGIN; - case PLAY: - return net.md_5.bungee.protocol.Protocol.GAME; - case CONFIGURATION: - return net.md_5.bungee.protocol.Protocol.CONFIGURATION; - } - return null; - } - private Class generateBungeePacket(Class c) { return new ByteBuddy().subclass(BungeeCordProtocolizePacket.class) .method(ElementMatchers.named("obtainProtocolizePacketClass")) diff --git a/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/util/ConversionUtils.java b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/util/ConversionUtils.java new file mode 100644 index 00000000..68997ef8 --- /dev/null +++ b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/util/ConversionUtils.java @@ -0,0 +1,47 @@ +package dev.simplix.protocolize.bungee.util; + +import dev.simplix.protocolize.api.Protocol; + +/** + * Date: 19.11.2023 + * + * @author Rubenicos + */ +public final class ConversionUtils { + + private ConversionUtils() { + } + + public static net.md_5.bungee.protocol.Protocol bungeeCordProtocol(Protocol protocol) { + switch (protocol) { + case HANDSHAKE: + return net.md_5.bungee.protocol.Protocol.HANDSHAKE; + case STATUS: + return net.md_5.bungee.protocol.Protocol.STATUS; + case LOGIN: + return net.md_5.bungee.protocol.Protocol.LOGIN; + case PLAY: + return net.md_5.bungee.protocol.Protocol.GAME; + case CONFIGURATION: + return net.md_5.bungee.protocol.Protocol.CONFIGURATION; + } + return null; + } + + public static Protocol protocolizeProtocol(net.md_5.bungee.protocol.Protocol protocol) { + switch (protocol) { + case GAME: + return dev.simplix.protocolize.api.Protocol.PLAY; + case LOGIN: + return dev.simplix.protocolize.api.Protocol.LOGIN; + case STATUS: + return dev.simplix.protocolize.api.Protocol.STATUS; + case HANDSHAKE: + return dev.simplix.protocolize.api.Protocol.HANDSHAKE; + case CONFIGURATION: + return dev.simplix.protocolize.api.Protocol.CONFIGURATION; + } + return null; + } + +} diff --git a/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/util/ReflectionUtil.java b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/util/ReflectionUtil.java index baa4be16..ec8376ac 100644 --- a/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/util/ReflectionUtil.java +++ b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/util/ReflectionUtil.java @@ -8,10 +8,7 @@ import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.Server; -import net.md_5.bungee.protocol.AbstractPacketHandler; -import net.md_5.bungee.protocol.KickStringWriter; -import net.md_5.bungee.protocol.MinecraftDecoder; -import net.md_5.bungee.protocol.PacketWrapper; +import net.md_5.bungee.protocol.*; import java.lang.reflect.Field; import java.util.logging.Logger; @@ -96,8 +93,7 @@ public static Connection getConnection(final AbstractPacketHandler abstractPacke public static AbstractPacketHandler getUpstreamBridge(final ProxiedPlayer player) { Preconditions.checkNotNull(player, "The player cannot be null!"); try { - final Object channelWrapper = userConnectionChannelWrapperField.get(player); - final Channel channel = (Channel) channelWrapperChannelField.get(channelWrapper); + final Channel channel = getChannel(player); final Object handlerBoss = channel.pipeline().get("inbound-boss"); if (handlerBoss == null) return null; @@ -111,8 +107,7 @@ public static AbstractPacketHandler getUpstreamBridge(final ProxiedPlayer player public static AbstractPacketHandler getDownstreamBridge(final Server server) { Preconditions.checkNotNull(server, "The server cannot be null!"); try { - final Object channelWrapper = serverConnectionChannelWrapperField.get(server); - final Channel channel = (Channel) channelWrapperChannelField.get(channelWrapper); + final Channel channel = getChannel(server); final Object handlerBoss = channel.pipeline().get("inbound-boss"); return (AbstractPacketHandler) handlerBossHandlerField.get(handlerBoss); } catch (final Exception e) { @@ -144,6 +139,10 @@ public static String getServerName(final Connection connection) { return "UNSUPPORTED_CONNECTION_TYPE"; } + public static Channel getChannel(final Connection connection) throws IllegalAccessException { + return (Channel) channelWrapperChannelField.get(getChannelWrapper(connection)); + } + public static Object getChannelWrapper(final Connection connection) throws IllegalAccessException { final Object channelWrapper; if (connection instanceof ProxiedPlayer) { @@ -160,8 +159,7 @@ public static Object getChannelWrapper(final Connection connection) throws Illeg public static int getProtocolVersion(final Connection player) { try { - final Object channelWrapper = getChannelWrapper(player); - final Channel channel = (Channel) channelWrapperChannelField.get(channelWrapper); + final Channel channel = getChannel(player); MinecraftDecoder minecraftDecoder = channel.pipeline().get(MinecraftDecoder.class); if (minecraftDecoder == null) { return -1; @@ -173,6 +171,34 @@ public static int getProtocolVersion(final Connection player) { return -1; } + public static Protocol getDecodeProtocol(final Connection player) { + try { + final Channel channel = getChannel(player); + MinecraftDecoder minecraftDecoder = channel.pipeline().get(MinecraftDecoder.class); + if (minecraftDecoder == null) { + return null; + } + return minecraftDecoder.getProtocol(); + } catch (final IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } + + public static Protocol getEncodeProtocol(final Connection player) { + try { + final Channel channel = getChannel(player); + MinecraftEncoder minecraftEncoder = channel.pipeline().get(MinecraftEncoder.class); + if (minecraftEncoder == null) { + return null; + } + return minecraftEncoder.getProtocol(); + } catch (final IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } + public static ServerInfo getServerInfo(final AbstractPacketHandler packetHandler) { if (serverConnectorClass.isAssignableFrom(packetHandler.getClass())) { diff --git a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/InitialInboundConnectionProtocolizePlayer.java b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/InitialInboundConnectionProtocolizePlayer.java index cc6c5cbe..c13bb9fd 100644 --- a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/InitialInboundConnectionProtocolizePlayer.java +++ b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/InitialInboundConnectionProtocolizePlayer.java @@ -2,6 +2,9 @@ import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.client.InitialInboundConnection; +import com.velocitypowered.proxy.protocol.StateRegistry; +import com.velocitypowered.proxy.protocol.netty.MinecraftDecoder; +import com.velocitypowered.proxy.protocol.netty.MinecraftEncoder; import dev.simplix.protocolize.api.*; import dev.simplix.protocolize.api.inventory.Inventory; import dev.simplix.protocolize.api.inventory.PlayerInventory; @@ -9,6 +12,7 @@ import dev.simplix.protocolize.api.player.ProtocolizePlayer; import dev.simplix.protocolize.api.providers.ProtocolRegistrationProvider; import dev.simplix.protocolize.velocity.packet.VelocityProtocolizePacket; +import dev.simplix.protocolize.velocity.util.ConversionUtils; import lombok.extern.slf4j.Slf4j; import java.lang.reflect.Field; @@ -93,6 +97,32 @@ public int protocolVersion() { return connection.getProtocolVersion().getProtocol(); } + @Override + public Protocol decodeProtocol() { + try { + MinecraftDecoder minecraftDecoder = connection.getConnection().getChannel().pipeline().get(MinecraftDecoder.class); + if (minecraftDecoder != null) { + return ConversionUtils.protocolizeProtocol((StateRegistry) VelocityProtocolizePlayer.decoderStateField.get(minecraftDecoder)); + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } + + @Override + public Protocol encodeProtocol() { + try { + MinecraftEncoder minecraftEncoder = connection.getConnection().getChannel().pipeline().get(MinecraftEncoder.class); + if (minecraftEncoder != null) { + return ConversionUtils.protocolizeProtocol((StateRegistry) VelocityProtocolizePlayer.encoderStateField.get(minecraftEncoder)); + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } + @Override public T handle() { return (T) connection; diff --git a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/VelocityProtocolizePlayer.java b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/VelocityProtocolizePlayer.java index c18b6eda..033ee254 100644 --- a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/VelocityProtocolizePlayer.java +++ b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/player/VelocityProtocolizePlayer.java @@ -4,6 +4,9 @@ import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.proxy.connection.backend.VelocityServerConnection; import com.velocitypowered.proxy.connection.client.ConnectedPlayer; +import com.velocitypowered.proxy.protocol.StateRegistry; +import com.velocitypowered.proxy.protocol.netty.MinecraftDecoder; +import com.velocitypowered.proxy.protocol.netty.MinecraftEncoder; import dev.simplix.protocolize.api.*; import dev.simplix.protocolize.api.inventory.Inventory; import dev.simplix.protocolize.api.inventory.PlayerInventory; @@ -11,9 +14,11 @@ import dev.simplix.protocolize.api.player.ProtocolizePlayer; import dev.simplix.protocolize.api.providers.ProtocolRegistrationProvider; import dev.simplix.protocolize.velocity.packet.VelocityProtocolizePacket; +import dev.simplix.protocolize.velocity.util.ConversionUtils; import lombok.Getter; import lombok.experimental.Accessors; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -32,6 +37,19 @@ public class VelocityProtocolizePlayer implements ProtocolizePlayer { private static final ProtocolRegistrationProvider REGISTRATION_PROVIDER = Protocolize.protocolRegistration(); + protected static Field decoderStateField, encoderStateField; + + static { + try { + decoderStateField = MinecraftDecoder.class.getDeclaredField("state"); + decoderStateField.setAccessible(true); + encoderStateField = MinecraftEncoder.class.getDeclaredField("state"); + encoderStateField.setAccessible(true); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + } + private final List> interactConsumers = new ArrayList<>(); private final AtomicInteger windowId = new AtomicInteger(101); private final Map registeredInventories = new ConcurrentHashMap<>(); @@ -98,6 +116,38 @@ public int protocolVersion() { return 0; } + @Override + public Protocol decodeProtocol() { + Player player = proxyServer.getPlayer(uniqueId).orElse(null); + if (player != null) { + try { + MinecraftDecoder minecraftDecoder = ((ConnectedPlayer) player).getConnection().getChannel().pipeline().get(MinecraftDecoder.class); + if (minecraftDecoder != null) { + return ConversionUtils.protocolizeProtocol((StateRegistry) decoderStateField.get(minecraftDecoder)); + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public Protocol encodeProtocol() { + Player player = proxyServer.getPlayer(uniqueId).orElse(null); + if (player != null) { + try { + MinecraftEncoder minecraftEncoder = ((ConnectedPlayer) player).getConnection().getChannel().pipeline().get(MinecraftEncoder.class); + if (minecraftEncoder != null) { + return ConversionUtils.protocolizeProtocol((StateRegistry) encoderStateField.get(minecraftEncoder)); + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + return null; + } + @Override public T handle() { return (T) proxyServer.getPlayer(uniqueId).orElse(null); diff --git a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/providers/VelocityProtocolRegistrationProvider.java b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/providers/VelocityProtocolRegistrationProvider.java index a3e6aa84..5757e54f 100644 --- a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/providers/VelocityProtocolRegistrationProvider.java +++ b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/providers/VelocityProtocolRegistrationProvider.java @@ -15,6 +15,7 @@ import dev.simplix.protocolize.api.providers.MappingProvider; import dev.simplix.protocolize.api.providers.ProtocolRegistrationProvider; import dev.simplix.protocolize.velocity.packet.VelocityProtocolizePacket; +import dev.simplix.protocolize.velocity.util.ConversionUtils; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.ByteBuddy; @@ -75,11 +76,11 @@ public void registerPacket(List mappings, Protocol protocol, Preconditions.checkNotNull(direction, "Direction cannot be null"); Preconditions.checkNotNull(packetClass, "Packet class cannot be null"); try { - ProtocolUtils.Direction velocityDirection = velocityDirection(direction); + ProtocolUtils.Direction velocityDirection = ConversionUtils.velocityDirection(direction); if (velocityDirection == null) { return; } - StateRegistry stateRegistry = velocityProtocol(protocol); + StateRegistry stateRegistry = ConversionUtils.velocityProtocol(protocol); if (stateRegistry == null) { return; } @@ -150,11 +151,11 @@ public int packetId(Object packet, Protocol protocol, PacketDirection direction, log.debug("Unable to obtain id for " + direction.name() + " " + packetClass.getName() + " at protocol " + protocolVersion); } } else if (packet instanceof MinecraftPacket) { - ProtocolUtils.Direction velocityDirection = velocityDirection(direction); + ProtocolUtils.Direction velocityDirection = ConversionUtils.velocityDirection(direction); if (velocityDirection == null) { return -1; } - StateRegistry stateRegistry = velocityProtocol(protocol); + StateRegistry stateRegistry = ConversionUtils.velocityProtocol(protocol); if (stateRegistry == null) { return -1; } @@ -167,12 +168,12 @@ public int packetId(Object packet, Protocol protocol, PacketDirection direction, @Override public Object createPacket(Class clazz, Protocol protocol, PacketDirection direction, int protocolVersion) { - ProtocolUtils.Direction velocityDirection = velocityDirection(direction); + ProtocolUtils.Direction velocityDirection = ConversionUtils.velocityDirection(direction); if (velocityDirection == null) { log.debug("Unable to construct wrapper instance for " + clazz.getName() + ": Unknown packet direction to velocity: " + direction.name()); return null; } - StateRegistry stateRegistry = velocityProtocol(protocol); + StateRegistry stateRegistry = ConversionUtils.velocityProtocol(protocol); if (stateRegistry == null) { log.debug("Unable to construct wrapper instance for " + clazz.getName() + ": Unknown protocol: " + protocol.name()); return null; @@ -223,32 +224,6 @@ private Class generateVelocityPacket(Class packetClass; diff --git a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/util/ConversionUtils.java b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/util/ConversionUtils.java index 70560c6f..06e1ced3 100644 --- a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/util/ConversionUtils.java +++ b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/util/ConversionUtils.java @@ -15,7 +15,7 @@ public final class ConversionUtils { private ConversionUtils() { } - private static ProtocolUtils.Direction velocityDirection(PacketDirection direction) { + public static ProtocolUtils.Direction velocityDirection(PacketDirection direction) { switch (direction) { case SERVERBOUND: return ProtocolUtils.Direction.SERVERBOUND; @@ -25,6 +25,22 @@ private static ProtocolUtils.Direction velocityDirection(PacketDirection directi return null; } + public static StateRegistry velocityProtocol(Protocol protocol) { + switch (protocol) { + case LOGIN: + return StateRegistry.LOGIN; + case HANDSHAKE: + return StateRegistry.HANDSHAKE; + case STATUS: + return StateRegistry.STATUS; + case PLAY: + return StateRegistry.PLAY; + case CONFIGURATION: + return StateRegistry.CONFIG; + } + return null; + } + public static Protocol protocolizeProtocol(StateRegistry state) { switch (state) { case PLAY: From e6f638f2b573ae5fc14c512791a877839a2377fb Mon Sep 17 00:00:00 2001 From: Rubenicos <44579213+Rubenicos@users.noreply.github.com> Date: Tue, 21 Nov 2023 12:31:20 -0600 Subject: [PATCH 4/7] Save protocol on registered packets --- .../protocolize/api/packet/RegisteredPacket.java | 2 ++ .../simplix/protocolize/api/tests/MappingTest.java | 11 ++++++----- .../BungeeCordProtocolRegistrationProvider.java | 6 +++--- .../VelocityProtocolRegistrationProvider.java | 6 +++--- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/protocolize-api/src/main/java/dev/simplix/protocolize/api/packet/RegisteredPacket.java b/protocolize-api/src/main/java/dev/simplix/protocolize/api/packet/RegisteredPacket.java index 82c97a72..f6859d5c 100644 --- a/protocolize-api/src/main/java/dev/simplix/protocolize/api/packet/RegisteredPacket.java +++ b/protocolize-api/src/main/java/dev/simplix/protocolize/api/packet/RegisteredPacket.java @@ -1,6 +1,7 @@ package dev.simplix.protocolize.api.packet; import dev.simplix.protocolize.api.PacketDirection; +import dev.simplix.protocolize.api.Protocol; import lombok.AllArgsConstructor; import lombok.Data; import lombok.experimental.Accessors; @@ -15,6 +16,7 @@ @Accessors(fluent = true) public class RegisteredPacket { + private final Protocol protocol; private final PacketDirection direction; private final Class packetClass; diff --git a/protocolize-api/src/test/java/dev/simplix/protocolize/api/tests/MappingTest.java b/protocolize-api/src/test/java/dev/simplix/protocolize/api/tests/MappingTest.java index 9677903e..d054ff39 100644 --- a/protocolize-api/src/test/java/dev/simplix/protocolize/api/tests/MappingTest.java +++ b/protocolize-api/src/test/java/dev/simplix/protocolize/api/tests/MappingTest.java @@ -1,6 +1,7 @@ package dev.simplix.protocolize.api.tests; import dev.simplix.protocolize.api.PacketDirection; +import dev.simplix.protocolize.api.Protocol; import dev.simplix.protocolize.api.Protocolize; import dev.simplix.protocolize.api.mapping.AbstractProtocolMapping; import dev.simplix.protocolize.api.mapping.ProtocolMapping; @@ -22,21 +23,21 @@ public class MappingTest { @Test public void packetMappingTest() { - Protocolize.mappingProvider().registerMapping(new RegisteredPacket(PacketDirection.SERVERBOUND, TestPacket.class), + Protocolize.mappingProvider().registerMapping(new RegisteredPacket(Protocol.PLAY, PacketDirection.SERVERBOUND, TestPacket.class), AbstractProtocolMapping.rangedIdMapping(47, 756, 0x3D)); - Protocolize.mappingProvider().registerMapping(new RegisteredPacket(PacketDirection.SERVERBOUND, TestPacket.class), + Protocolize.mappingProvider().registerMapping(new RegisteredPacket(Protocol.PLAY, PacketDirection.SERVERBOUND, TestPacket.class), AbstractProtocolMapping.rangedIdMapping(23, 46, 0x2D)); - Protocolize.mappingProvider().registerMapping(new RegisteredPacket(PacketDirection.SERVERBOUND, AnotherTestPacket.class), + Protocolize.mappingProvider().registerMapping(new RegisteredPacket(Protocol.PLAY, PacketDirection.SERVERBOUND, AnotherTestPacket.class), AbstractProtocolMapping.rangedIdMapping(47, 756, 0x3D)); - List mappings = Protocolize.mappingProvider().mappings(new RegisteredPacket(PacketDirection.SERVERBOUND, TestPacket.class)); + List mappings = Protocolize.mappingProvider().mappings(new RegisteredPacket(Protocol.PLAY, PacketDirection.SERVERBOUND, TestPacket.class)); assert !mappings.isEmpty(); ProtocolMapping mapping1 = mappings.get(0); ProtocolMapping mapping2 = mappings.get(1); assert mapping1.inRange(47); assert mapping2.inRange(24); - ProtocolMapping mapping = Protocolize.mappingProvider().mapping(new RegisteredPacket(PacketDirection.SERVERBOUND, AnotherTestPacket.class), 47); + ProtocolMapping mapping = Protocolize.mappingProvider().mapping(new RegisteredPacket(Protocol.PLAY, PacketDirection.SERVERBOUND, AnotherTestPacket.class), 47); assert mapping != null; assert mapping.inRange(47); diff --git a/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/providers/BungeeCordProtocolRegistrationProvider.java b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/providers/BungeeCordProtocolRegistrationProvider.java index ba8bb7a7..0396f274 100644 --- a/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/providers/BungeeCordProtocolRegistrationProvider.java +++ b/protocolize-bungeecord/src/main/java/dev/simplix/protocolize/bungee/providers/BungeeCordProtocolRegistrationProvider.java @@ -91,7 +91,7 @@ public void registerPacket(List mappings, Protocol protocol, TIntObjectMap protocols = (TIntObjectMap) protocolsField .get(getDirectionData(ConversionUtils.bungeeCordProtocol(protocol), direction)); for (ProtocolIdMapping mapping : mappings) { - mappingProvider.registerMapping(new RegisteredPacket(direction, packetClass), mapping); + mappingProvider.registerMapping(new RegisteredPacket(protocol, direction, packetClass), mapping); for (int i = mapping.protocolRangeStart(); i <= mapping.protocolRangeEnd(); i++) { strategy.registerPacket(protocols, i, mapping.id(), definedPacketClass); log.debug("[Protocolize] Register packet " + definedPacketClass.getName() + " (0x" + Integer.toHexString(mapping.id()) + ") in direction " + direction.name() + " at protocol " + protocol.name() + " for version " + i); @@ -109,7 +109,7 @@ public int packetId(Object packet, Protocol protocol, PacketDirection direction, Preconditions.checkNotNull(packet, "Packet cannot be null"); if (packet instanceof BungeeCordProtocolizePacket) { List protocolIdMappings = mappingProvider.mappings(new RegisteredPacket( - direction, ((BungeeCordProtocolizePacket) packet).obtainProtocolizePacketClass())); + protocol, direction, ((BungeeCordProtocolizePacket) packet).obtainProtocolizePacketClass())); for (ProtocolIdMapping mapping : protocolIdMappings) { if (mapping.inRange(protocolVersion)) { return mapping.id(); @@ -139,7 +139,7 @@ public Object createPacket(Class clazz, Protocol proto Preconditions.checkNotNull(direction, "Direction cannot be null"); Preconditions.checkNotNull(clazz, "Clazz cannot be null"); Object directionData = getDirectionData(ConversionUtils.bungeeCordProtocol(protocol), direction); - ProtocolIdMapping protocolIdMapping = mappingProvider.mapping(new RegisteredPacket(direction, clazz), + ProtocolIdMapping protocolIdMapping = mappingProvider.mapping(new RegisteredPacket(protocol, direction, clazz), protocolVersion); int id; if (protocolIdMapping != null) { diff --git a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/providers/VelocityProtocolRegistrationProvider.java b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/providers/VelocityProtocolRegistrationProvider.java index 5757e54f..aa6bfe06 100644 --- a/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/providers/VelocityProtocolRegistrationProvider.java +++ b/protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/providers/VelocityProtocolRegistrationProvider.java @@ -98,7 +98,7 @@ public void registerPacket(List mappings, Protocol protocol, for (int i = 0; i < sortedMappings.length; i++) { var mapping = sortedMappings[i]; - mappingProvider.registerMapping(new RegisteredPacket(direction, packetClass), mapping); + mappingProvider.registerMapping(new RegisteredPacket(protocol, direction, packetClass), mapping); if (mapping.protocolRangeEnd() > maximumProtocolVersion) { mapping.protocolRangeEnd(maximumProtocolVersion); } @@ -143,7 +143,7 @@ public int packetId(Object packet, Protocol protocol, PacketDirection direction, Preconditions.checkNotNull(packet, "Packet cannot be null"); if (packet instanceof VelocityProtocolizePacket) { Class packetClass = ((VelocityProtocolizePacket) packet).obtainProtocolizePacketClass(); - ProtocolIdMapping protocolIdMapping = mappingProvider.mapping(new RegisteredPacket(direction, + ProtocolIdMapping protocolIdMapping = mappingProvider.mapping(new RegisteredPacket(protocol, direction, packetClass), protocolVersion); if (protocolIdMapping != null) { return protocolIdMapping.id(); @@ -180,7 +180,7 @@ public Object createPacket(Class clazz, Protocol proto } StateRegistry.PacketRegistry.ProtocolRegistry registry = stateRegistry.getProtocolRegistry(velocityDirection, ProtocolVersion.getProtocolVersion(protocolVersion)); - ProtocolIdMapping protocolIdMapping = mappingProvider.mapping(new RegisteredPacket(direction, clazz), protocolVersion); + ProtocolIdMapping protocolIdMapping = mappingProvider.mapping(new RegisteredPacket(protocol, direction, clazz), protocolVersion); if (protocolIdMapping != null) { return registry.createPacket(protocolIdMapping.id()); } From 9af5372492eaae2f44c20cddd26d2e6f36ba1022 Mon Sep 17 00:00:00 2001 From: Rubenicos <44579213+Rubenicos@users.noreply.github.com> Date: Wed, 1 May 2024 13:01:33 -0600 Subject: [PATCH 5/7] Fix API break --- .../AbstractPacketListenerProvider.java | 4 ++-- .../api/providers/PacketListenerProvider.java | 20 +++++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/AbstractPacketListenerProvider.java b/protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/AbstractPacketListenerProvider.java index c421b77a..1c56d9c4 100644 --- a/protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/AbstractPacketListenerProvider.java +++ b/protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/AbstractPacketListenerProvider.java @@ -16,7 +16,7 @@ public abstract class AbstractPacketListenerProvider implements PacketListenerP protected final List> listeners = new ArrayList<>(); @Override - public > A registerListener(A listener) { + public > A register(A listener) { Preconditions.checkNotNull(listener, "The listener cannot be null!"); if (listeners.contains(listener)) { throw new IllegalStateException("Listener already registered."); @@ -31,7 +31,7 @@ protected void addListener(AbstractPacketListener listener) { } @Override - public > A unregisterListener(A listener) throws IllegalArgumentException { + public > A unregister(A listener) throws IllegalArgumentException { if (listeners.contains(listener)) { listeners.remove(listener); listener.registered(false); diff --git a/protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/PacketListenerProvider.java b/protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/PacketListenerProvider.java index 973589ce..e4127c49 100644 --- a/protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/PacketListenerProvider.java +++ b/protocolize-api/src/main/java/dev/simplix/protocolize/api/providers/PacketListenerProvider.java @@ -12,17 +12,25 @@ */ public interface PacketListenerProvider { - default AbstractPacketListener registerListener(Class packet, Direction direction) { - return registerListener(packet, direction, 0); + default AbstractPacketListener register(Class packet, Direction direction) { + return register(packet, direction, 0); } - default AbstractPacketListener registerListener(Class packet, Direction direction, int priority) { - return registerListener(new AbstractPacketListener(packet, direction, priority) { }); + default AbstractPacketListener register(Class packet, Direction direction, int priority) { + return register(new AbstractPacketListener(packet, direction, priority) { }); } - > A registerListener(A listener); + > A register(A listener); - > A unregisterListener(A listener) throws IllegalArgumentException; + default void registerListener(AbstractPacketListener listener) { + register(listener); + } + + > A unregister(A listener) throws IllegalArgumentException; + + default void unregisterListener(AbstractPacketListener listener) throws IllegalArgumentException { + unregister(listener); + } List> listenersForType(Class type); From 4d48b9e70627c54e2643364fee72423e4becba83 Mon Sep 17 00:00:00 2001 From: Rubenicos <44579213+Rubenicos@users.noreply.github.com> Date: Thu, 2 May 2024 17:27:27 -0600 Subject: [PATCH 6/7] Fix more API breaks --- .../protocolize/api/listener/PacketReceiveEvent.java | 10 ++++++++++ .../protocolize/api/listener/PacketSendEvent.java | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketReceiveEvent.java b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketReceiveEvent.java index 74254652..d7028b5d 100644 --- a/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketReceiveEvent.java +++ b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketReceiveEvent.java @@ -26,6 +26,16 @@ public PacketReceiveEvent(ProtocolizePlayer player, Object server, T packet, boo this.dirty = dirty; } + @Override + public ProtocolizePlayer player() { + return super.player(); + } + + @Override + public S server() { + return super.server(); + } + /** * This marks the packet ready for rewriting. Rewriting is necessary when manipulating packets on receive. * This does the same as {@code event.dirty(true)}. diff --git a/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketSendEvent.java b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketSendEvent.java index 86e97776..62c90216 100644 --- a/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketSendEvent.java +++ b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketSendEvent.java @@ -23,6 +23,16 @@ public PacketSendEvent(ProtocolizePlayer player, Object server, T packet, boolea super(player, server, packet, cancelled); } + @Override + public ProtocolizePlayer player() { + return super.player(); + } + + @Override + public S server() { + return super.server(); + } + /** * @return Returns true when Protocolize was unable to track down the server or player * during early communication phases like HANDSHAKE or STATUS. From 3dc76213ab4b38625a0212b6e4fddd8ea007342e Mon Sep 17 00:00:00 2001 From: Rubenicos <44579213+Rubenicos@users.noreply.github.com> Date: Thu, 2 May 2024 17:52:30 -0600 Subject: [PATCH 7/7] Fix more API breaks --- .../api/listener/PacketReceiveEvent.java | 20 +++++++++++++++++++ .../api/listener/PacketSendEvent.java | 20 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketReceiveEvent.java b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketReceiveEvent.java index d7028b5d..33c45d15 100644 --- a/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketReceiveEvent.java +++ b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketReceiveEvent.java @@ -36,6 +36,26 @@ public S server() { return super.server(); } + @Override + public T packet() { + return super.packet(); + } + + @Override + public AbstractPacketEvent packet(T packet) { + return super.packet(packet); + } + + @Override + public boolean cancelled() { + return super.cancelled(); + } + + @Override + public AbstractPacketEvent cancelled(boolean cancelled) { + return super.cancelled(cancelled); + } + /** * This marks the packet ready for rewriting. Rewriting is necessary when manipulating packets on receive. * This does the same as {@code event.dirty(true)}. diff --git a/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketSendEvent.java b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketSendEvent.java index 62c90216..e4edf396 100644 --- a/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketSendEvent.java +++ b/protocolize-api/src/main/java/dev/simplix/protocolize/api/listener/PacketSendEvent.java @@ -33,6 +33,26 @@ public S server() { return super.server(); } + @Override + public T packet() { + return super.packet(); + } + + @Override + public AbstractPacketEvent packet(T packet) { + return super.packet(packet); + } + + @Override + public boolean cancelled() { + return super.cancelled(); + } + + @Override + public AbstractPacketEvent cancelled(boolean cancelled) { + return super.cancelled(cancelled); + } + /** * @return Returns true when Protocolize was unable to track down the server or player * during early communication phases like HANDSHAKE or STATUS.