handle set compression in play state

This commit is contained in:
creeper123123321 2021-08-19 16:00:00 -03:00
parent 7ad9d31c1e
commit 6a50f3e7b0
9 changed files with 83 additions and 40 deletions

View File

@ -15,13 +15,17 @@ public class CompressionCodec extends MessageToMessageCodec<ByteBuf, ByteBuf> {
// 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);

View File

@ -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);
}
}

View File

@ -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 {
}

View File

@ -0,0 +1,6 @@
package com.viaversion.aas.codec.packet.play;
import com.viaversion.aas.codec.packet.common.AbstractCompression;
public class SetPlayCompression extends AbstractCompression {
}

View File

@ -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<Int> {

View File

@ -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(

View File

@ -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))
}
}
}

View File

@ -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) {

View File

@ -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" -> {