From f7b683c343e656aa852054a98b9ac943ddb0c2b7 Mon Sep 17 00:00:00 2001 From: Kieran Wallbanks Date: Fri, 12 Mar 2021 15:51:48 +0000 Subject: [PATCH] Add ability to skip packet translating --- .../network/player/FakePlayerConnection.java | 2 +- .../network/player/NettyPlayerConnection.java | 12 ++++++++---- .../server/network/player/PlayerConnection.java | 14 +++++++++++++- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/minestom/server/network/player/FakePlayerConnection.java b/src/main/java/net/minestom/server/network/player/FakePlayerConnection.java index 74a4a4a55..9cb1b4637 100644 --- a/src/main/java/net/minestom/server/network/player/FakePlayerConnection.java +++ b/src/main/java/net/minestom/server/network/player/FakePlayerConnection.java @@ -13,7 +13,7 @@ import java.net.SocketAddress; public class FakePlayerConnection extends PlayerConnection { @Override - public void sendPacket(@NotNull ServerPacket serverPacket) { + public void sendPacket(@NotNull ServerPacket serverPacket, boolean skipTranslating) { if (shouldSendPacket(serverPacket)) { getFakePlayer().getController().consumePacket(serverPacket); } diff --git a/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java b/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java index c5b76d49c..91042081d 100644 --- a/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java +++ b/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java @@ -125,7 +125,7 @@ public class NettyPlayerConnection extends PlayerConnection { * @param serverPacket the packet to write */ @Override - public void sendPacket(@NotNull ServerPacket serverPacket) { + public void sendPacket(@NotNull ServerPacket serverPacket, boolean skipTranslating) { if (!channel.isActive()) return; @@ -138,7 +138,7 @@ public class NettyPlayerConnection extends PlayerConnection { if (identifier == null) { // This packet explicitly asks to do not retrieve the cache - write(serverPacket); + write(serverPacket, skipTranslating); } else { final long timestamp = cacheablePacket.getTimestamp(); // Try to retrieve the cached buffer @@ -163,7 +163,7 @@ public class NettyPlayerConnection extends PlayerConnection { } } else { - write(serverPacket); + write(serverPacket, skipTranslating); } } else { // Player is probably not logged yet @@ -173,6 +173,10 @@ public class NettyPlayerConnection extends PlayerConnection { } public void write(@NotNull Object message) { + this.write(message, false); + } + + public void write(@NotNull Object message, boolean skipTranslating) { if (message instanceof FramedPacket) { final FramedPacket framedPacket = (FramedPacket) message; synchronized (tickBuffer) { @@ -183,7 +187,7 @@ public class NettyPlayerConnection extends PlayerConnection { } else if (message instanceof ServerPacket) { final ServerPacket serverPacket = (ServerPacket) message; - if (getPlayer() != null && serverPacket instanceof ComponentHoldingServerPacket) { + if (!skipTranslating && getPlayer() != null && serverPacket instanceof ComponentHoldingServerPacket) { serverPacket = ((ComponentHoldingServerPacket) serverPacket).copyWithOperator(component -> MinecraftServer.getSerializationManager().translate(component, getPlayer())); } diff --git a/src/main/java/net/minestom/server/network/player/PlayerConnection.java b/src/main/java/net/minestom/server/network/player/PlayerConnection.java index 77a63c697..e183c772a 100644 --- a/src/main/java/net/minestom/server/network/player/PlayerConnection.java +++ b/src/main/java/net/minestom/server/network/player/PlayerConnection.java @@ -90,7 +90,19 @@ public abstract class PlayerConnection { * @param serverPacket the packet to send * @see #shouldSendPacket(ServerPacket) */ - public abstract void sendPacket(@NotNull ServerPacket serverPacket); + public void sendPacket(@NotNull ServerPacket serverPacket) { + this.sendPacket(serverPacket, false); + } + + /** + * Serializes the packet and send it to the client, skipping the translation phase. + *

+ * Also responsible for executing {@link ConnectionManager#onPacketSend(ServerPacketConsumer)} consumers. + * + * @param serverPacket the packet to send + * @see #shouldSendPacket(ServerPacket) + */ + public abstract void sendPacket(@NotNull ServerPacket serverPacket, boolean skipTranslating); protected boolean shouldSendPacket(@NotNull ServerPacket serverPacket) { return player == null ||