diff --git a/src/main/java/com/viaversion/aas/codec/CompressionCodec.java b/src/main/java/com/viaversion/aas/codec/CompressionCodec.java index 83ccd3c..edf1289 100644 --- a/src/main/java/com/viaversion/aas/codec/CompressionCodec.java +++ b/src/main/java/com/viaversion/aas/codec/CompressionCodec.java @@ -15,13 +15,17 @@ public class CompressionCodec extends MessageToMessageCodec { // stolen from Krypton (GPL) and modified // https://github.com/astei/krypton/blob/master/src/main/java/me/steinborn/krypton/mod/shared/network/compression/MinecraftCompressEncoder.java private static final int UNCOMPRESSED_CAP = 8 * 1024 * 1024; // 8MiB - private final int threshold; + private int threshold; private VelocityCompressor compressor; public CompressionCodec(int threshold) { this.threshold = threshold; } + public void setThreshold(int threshold) { + this.threshold = threshold; + } + @Override public void handlerAdded(ChannelHandlerContext ctx) { compressor = Natives.compress.get().create(6); diff --git a/src/main/java/com/viaversion/aas/codec/packet/common/AbstractCompression.java b/src/main/java/com/viaversion/aas/codec/packet/common/AbstractCompression.java new file mode 100644 index 0000000..79f18fb --- /dev/null +++ b/src/main/java/com/viaversion/aas/codec/packet/common/AbstractCompression.java @@ -0,0 +1,28 @@ +package com.viaversion.aas.codec.packet.common; + +import com.viaversion.aas.codec.packet.Packet; +import com.viaversion.viaversion.api.type.Type; +import io.netty.buffer.ByteBuf; +import org.jetbrains.annotations.NotNull; + +public class AbstractCompression implements Packet { + private int threshold; + + public int getThreshold() { + return threshold; + } + + public void setThreshold(int threshold) { + this.threshold = threshold; + } + + @Override + public void decode(@NotNull ByteBuf byteBuf, int protocolVersion) throws Exception { + threshold = Type.VAR_INT.readPrimitive(byteBuf); + } + + @Override + public void encode(@NotNull ByteBuf byteBuf, int protocolVersion) throws Exception { + Type.VAR_INT.writePrimitive(byteBuf, threshold); + } +} diff --git a/src/main/java/com/viaversion/aas/codec/packet/login/SetCompression.java b/src/main/java/com/viaversion/aas/codec/packet/login/SetCompression.java index 5adce57..3c1e34a 100644 --- a/src/main/java/com/viaversion/aas/codec/packet/login/SetCompression.java +++ b/src/main/java/com/viaversion/aas/codec/packet/login/SetCompression.java @@ -1,28 +1,6 @@ package com.viaversion.aas.codec.packet.login; -import com.viaversion.aas.codec.packet.Packet; -import com.viaversion.viaversion.api.type.Type; -import io.netty.buffer.ByteBuf; -import org.jetbrains.annotations.NotNull; +import com.viaversion.aas.codec.packet.common.AbstractCompression; -public class SetCompression implements Packet { - private int threshold; - - public int getThreshold() { - return threshold; - } - - public void setThreshold(int threshold) { - this.threshold = threshold; - } - - @Override - public void decode(@NotNull ByteBuf byteBuf, int protocolVersion) throws Exception { - threshold = Type.VAR_INT.readPrimitive(byteBuf); - } - - @Override - public void encode(@NotNull ByteBuf byteBuf, int protocolVersion) throws Exception { - Type.VAR_INT.writePrimitive(byteBuf, threshold); - } +public class SetCompression extends AbstractCompression { } diff --git a/src/main/java/com/viaversion/aas/codec/packet/play/SetPlayCompression.java b/src/main/java/com/viaversion/aas/codec/packet/play/SetPlayCompression.java new file mode 100644 index 0000000..a448967 --- /dev/null +++ b/src/main/java/com/viaversion/aas/codec/packet/play/SetPlayCompression.java @@ -0,0 +1,6 @@ +package com.viaversion.aas.codec.packet.play; + +import com.viaversion.aas.codec.packet.common.AbstractCompression; + +public class SetPlayCompression extends AbstractCompression { +} diff --git a/src/main/kotlin/com/viaversion/aas/codec/packet/PacketRegistry.kt b/src/main/kotlin/com/viaversion/aas/codec/packet/PacketRegistry.kt index 5258888..fb23477 100644 --- a/src/main/kotlin/com/viaversion/aas/codec/packet/PacketRegistry.kt +++ b/src/main/kotlin/com/viaversion/aas/codec/packet/PacketRegistry.kt @@ -5,6 +5,7 @@ import com.viaversion.aas.codec.packet.handshake.Handshake import com.viaversion.aas.codec.packet.login.* import com.viaversion.aas.codec.packet.play.Kick import com.viaversion.aas.codec.packet.play.PluginMessage +import com.viaversion.aas.codec.packet.play.SetPlayCompression import com.viaversion.aas.codec.packet.status.StatusPing import com.viaversion.aas.codec.packet.status.StatusPong import com.viaversion.aas.codec.packet.status.StatusRequest @@ -74,6 +75,14 @@ object PacketRegistry { ProtocolVersion.v1_17..ProtocolVersion.v1_17_1 to ClientboundPackets1_17.PLUGIN_MESSAGE.id ) ) + + register( + State.PLAY, + Direction.CLIENTBOUND, + ::SetPlayCompression, + ProtocolVersion.v1_8.singleton, + ClientboundPackets1_8.SET_COMPRESSION.id + ) } operator fun ProtocolVersion.rangeTo(o: ProtocolVersion): Range { diff --git a/src/main/kotlin/com/viaversion/aas/handler/ConnectionData.kt b/src/main/kotlin/com/viaversion/aas/handler/ConnectionData.kt index cf1b174..2d1016b 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/ConnectionData.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/ConnectionData.kt @@ -1,8 +1,8 @@ package com.viaversion.aas.handler import com.viaversion.aas.codec.CryptoCodec -import com.viaversion.aas.handler.state.HandshakeState import com.viaversion.aas.handler.state.ConnectionState +import com.viaversion.aas.handler.state.HandshakeState import io.netty.channel.Channel class ConnectionData( diff --git a/src/main/kotlin/com/viaversion/aas/handler/Util.kt b/src/main/kotlin/com/viaversion/aas/handler/Util.kt index d62e177..5bb0b66 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/Util.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/Util.kt @@ -1,5 +1,6 @@ package com.viaversion.aas.handler +import com.viaversion.aas.codec.CompressionCodec import com.viaversion.aas.codec.packet.Packet import com.viaversion.aas.readRemainingBytes import com.viaversion.aas.send @@ -7,6 +8,7 @@ import com.viaversion.viaversion.api.protocol.version.ProtocolVersion import com.viaversion.viaversion.api.type.Type import io.netty.buffer.ByteBufAllocator import io.netty.buffer.Unpooled +import io.netty.channel.Channel import io.netty.channel.ChannelPipeline import io.netty.handler.proxy.HttpProxyHandler import io.netty.handler.proxy.Socks4ProxyHandler @@ -54,4 +56,19 @@ fun encodeBrand(string: String, is17: Boolean): ByteArray { buf.release() } } +} + + +fun setCompression(channel: Channel, threshold: Int) { + val pipe = channel.pipeline() + + if (threshold == -1) { + if (pipe["compress"] != null) pipe.remove("compress") + } else { + if (pipe["compress"] != null) { + pipe[CompressionCodec::class.java].setThreshold(threshold) + } else { + pipe.addAfter("frame", "compress", CompressionCodec(threshold)) + } + } } \ No newline at end of file diff --git a/src/main/kotlin/com/viaversion/aas/handler/state/LoginState.kt b/src/main/kotlin/com/viaversion/aas/handler/state/LoginState.kt index a7cda50..6e3397c 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/state/LoginState.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/state/LoginState.kt @@ -10,6 +10,7 @@ import com.viaversion.aas.codec.packet.login.* import com.viaversion.aas.config.VIAaaSConfig import com.viaversion.aas.handler.MinecraftHandler import com.viaversion.aas.handler.forward +import com.viaversion.aas.handler.setCompression import com.viaversion.aas.util.StacklessException import com.viaversion.viaversion.api.protocol.packet.State import com.viaversion.viaversion.api.protocol.version.ProtocolVersion @@ -71,25 +72,13 @@ class LoginState : ConnectionState { } private fun handleCompression(handler: MinecraftHandler, setCompression: SetCompression) { - val pipe = handler.data.frontChannel.pipeline() val threshold = setCompression.threshold - val backPipe = pipe[MinecraftHandler::class.java].other!!.pipeline() - if (backPipe["compress"] != null) { - backPipe.remove("compress") - } - if (threshold != -1) { - backPipe.addAfter("frame", "compress", CompressionCodec(threshold)) - } + setCompression(handler.data.backChannel!!, threshold) forward(handler, setCompression) - if (pipe["compress"] != null) { - pipe.remove("compress") - } - if (threshold != -1) { - pipe.addAfter("frame", "compress", CompressionCodec(threshold)) - } + setCompression(handler.data.frontChannel, threshold) } fun authenticateOnlineFront(frontChannel: Channel) { diff --git a/src/main/kotlin/com/viaversion/aas/handler/state/PlayState.kt b/src/main/kotlin/com/viaversion/aas/handler/state/PlayState.kt index b0b7897..7160a0c 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/state/PlayState.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/state/PlayState.kt @@ -5,6 +5,7 @@ import com.viaversion.aas.codec.packet.Packet import com.viaversion.aas.codec.packet.UnknownPacket import com.viaversion.aas.codec.packet.play.Kick import com.viaversion.aas.codec.packet.play.PluginMessage +import com.viaversion.aas.codec.packet.play.SetPlayCompression import com.viaversion.aas.config.VIAaaSConfig import com.viaversion.aas.handler.* import com.viaversion.aas.parseProtocol @@ -24,10 +25,21 @@ object PlayState : ConnectionState { when { packet is UnknownPacket && (packet.id !in 0..127) -> throw StacklessException("Invalid packet id!") packet is PluginMessage && !handler.frontEnd -> modifyPluginMessage(handler, packet) + packet is SetPlayCompression -> return handleCompression(handler, packet) } forward(handler, ReferenceCountUtil.retain(packet)) } + private fun handleCompression(handler: MinecraftHandler, packet: SetPlayCompression) { + val threshold = packet.threshold + + setCompression(handler.data.backChannel!!, threshold) + + forward(handler, packet) + + setCompression(handler.data.frontChannel, threshold) + } + private fun modifyPluginMessage(handler: MinecraftHandler, pluginMessage: PluginMessage) { when (pluginMessage.channel) { "MC|Brand", "brand", "minecraft:brand" -> {