From 3c8a52aeb0cb85bc0a2494ceba9b6681cdcd6892 Mon Sep 17 00:00:00 2001 From: Andrew Steinborn Date: Wed, 25 Jul 2018 11:05:07 -0400 Subject: [PATCH] Add compression support for proxy->server connections. --- .../protocol/netty/MinecraftCompressEncoder.java | 2 -- .../protocol/netty/MinecraftPipelineUtils.java | 6 ++++++ .../minecraft/velocity/proxy/ServerConnection.java | 11 +++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/minimum/minecraft/velocity/protocol/netty/MinecraftCompressEncoder.java b/src/main/java/io/minimum/minecraft/velocity/protocol/netty/MinecraftCompressEncoder.java index 5bfe1b55..ae34d3bc 100644 --- a/src/main/java/io/minimum/minecraft/velocity/protocol/netty/MinecraftCompressEncoder.java +++ b/src/main/java/io/minimum/minecraft/velocity/protocol/netty/MinecraftCompressEncoder.java @@ -17,14 +17,12 @@ public class MinecraftCompressEncoder extends MessageToByteEncoder { @Override protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception { if (msg.readableBytes() <= threshold) { - System.out.println("not compressing packet of 0x" + msg.readableBytes() + " size"); // Under the threshold, there is nothing to do. ProtocolUtils.writeVarInt(out, 0); out.writeBytes(msg); return; } - System.out.println("compressing packet of 0x" + msg.readableBytes() + " size"); Deflater deflater = new Deflater(); byte[] buf = new byte[msg.readableBytes()]; msg.readBytes(buf); diff --git a/src/main/java/io/minimum/minecraft/velocity/protocol/netty/MinecraftPipelineUtils.java b/src/main/java/io/minimum/minecraft/velocity/protocol/netty/MinecraftPipelineUtils.java index d70721b2..efb05a29 100644 --- a/src/main/java/io/minimum/minecraft/velocity/protocol/netty/MinecraftPipelineUtils.java +++ b/src/main/java/io/minimum/minecraft/velocity/protocol/netty/MinecraftPipelineUtils.java @@ -23,6 +23,12 @@ public class MinecraftPipelineUtils { } public static void enableCompression(Channel ch, int threshold) { + if (threshold == -1) { + ch.pipeline().remove("compress-decoder"); + ch.pipeline().remove("compress-encoder"); + return; + } + MinecraftCompressEncoder encoder = new MinecraftCompressEncoder(threshold); MinecraftCompressDecoder decoder = new MinecraftCompressDecoder(threshold); diff --git a/src/main/java/io/minimum/minecraft/velocity/proxy/ServerConnection.java b/src/main/java/io/minimum/minecraft/velocity/proxy/ServerConnection.java index 523aeaf3..5ac9be83 100644 --- a/src/main/java/io/minimum/minecraft/velocity/proxy/ServerConnection.java +++ b/src/main/java/io/minimum/minecraft/velocity/proxy/ServerConnection.java @@ -7,10 +7,7 @@ import io.minimum.minecraft.velocity.data.ServerInfo; import io.minimum.minecraft.velocity.protocol.netty.MinecraftDecoder; import io.minimum.minecraft.velocity.protocol.netty.MinecraftEncoder; import io.minimum.minecraft.velocity.protocol.netty.MinecraftPipelineUtils; -import io.minimum.minecraft.velocity.protocol.packets.Disconnect; -import io.minimum.minecraft.velocity.protocol.packets.Handshake; -import io.minimum.minecraft.velocity.protocol.packets.ServerLogin; -import io.minimum.minecraft.velocity.protocol.packets.ServerLoginSuccess; +import io.minimum.minecraft.velocity.protocol.packets.*; import io.netty.buffer.ByteBuf; import io.netty.channel.*; import net.kyori.text.TextComponent; @@ -119,6 +116,12 @@ public class ServerConnection { proxyPlayer.handleConnectionException(disconnect); } + if (packet instanceof SetCompression) { + System.out.println("Enabling compression on server connection, this is inefficient!"); + SetCompression sc = (SetCompression) packet; + MinecraftPipelineUtils.enableCompression(channel, sc.getThreshold()); + } + if (packet instanceof ServerLoginSuccess) { // the player has been logged on. System.out.println("Player connected to remote server");