mirror of
https://github.com/ViaVersion/VIAaaS.git
synced 2024-10-01 05:08:08 +02:00
handle set compression in play state
This commit is contained in:
parent
7ad9d31c1e
commit
6a50f3e7b0
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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 {
|
||||
}
|
||||
|
@ -0,0 +1,6 @@
|
||||
package com.viaversion.aas.codec.packet.play;
|
||||
|
||||
import com.viaversion.aas.codec.packet.common.AbstractCompression;
|
||||
|
||||
public class SetPlayCompression extends AbstractCompression {
|
||||
}
|
@ -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> {
|
||||
|
@ -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(
|
||||
|
@ -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
|
||||
@ -55,3 +57,18 @@ fun encodeBrand(string: String, is17: Boolean): ByteArray {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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))
|
||||
}
|
||||
}
|
||||
}
|
@ -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) {
|
||||
|
@ -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" -> {
|
||||
|
Loading…
Reference in New Issue
Block a user