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
|
// 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
|
// 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 static final int UNCOMPRESSED_CAP = 8 * 1024 * 1024; // 8MiB
|
||||||
private final int threshold;
|
private int threshold;
|
||||||
private VelocityCompressor compressor;
|
private VelocityCompressor compressor;
|
||||||
|
|
||||||
public CompressionCodec(int threshold) {
|
public CompressionCodec(int threshold) {
|
||||||
this.threshold = threshold;
|
this.threshold = threshold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setThreshold(int threshold) {
|
||||||
|
this.threshold = threshold;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handlerAdded(ChannelHandlerContext ctx) {
|
public void handlerAdded(ChannelHandlerContext ctx) {
|
||||||
compressor = Natives.compress.get().create(6);
|
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;
|
package com.viaversion.aas.codec.packet.login;
|
||||||
|
|
||||||
import com.viaversion.aas.codec.packet.Packet;
|
import com.viaversion.aas.codec.packet.common.AbstractCompression;
|
||||||
import com.viaversion.viaversion.api.type.Type;
|
|
||||||
import io.netty.buffer.ByteBuf;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
public class SetCompression implements Packet {
|
public class SetCompression extends AbstractCompression {
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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.login.*
|
||||||
import com.viaversion.aas.codec.packet.play.Kick
|
import com.viaversion.aas.codec.packet.play.Kick
|
||||||
import com.viaversion.aas.codec.packet.play.PluginMessage
|
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.StatusPing
|
||||||
import com.viaversion.aas.codec.packet.status.StatusPong
|
import com.viaversion.aas.codec.packet.status.StatusPong
|
||||||
import com.viaversion.aas.codec.packet.status.StatusRequest
|
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
|
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> {
|
operator fun ProtocolVersion.rangeTo(o: ProtocolVersion): Range<Int> {
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package com.viaversion.aas.handler
|
package com.viaversion.aas.handler
|
||||||
|
|
||||||
import com.viaversion.aas.codec.CryptoCodec
|
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.ConnectionState
|
||||||
|
import com.viaversion.aas.handler.state.HandshakeState
|
||||||
import io.netty.channel.Channel
|
import io.netty.channel.Channel
|
||||||
|
|
||||||
class ConnectionData(
|
class ConnectionData(
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.viaversion.aas.handler
|
package com.viaversion.aas.handler
|
||||||
|
|
||||||
|
import com.viaversion.aas.codec.CompressionCodec
|
||||||
import com.viaversion.aas.codec.packet.Packet
|
import com.viaversion.aas.codec.packet.Packet
|
||||||
import com.viaversion.aas.readRemainingBytes
|
import com.viaversion.aas.readRemainingBytes
|
||||||
import com.viaversion.aas.send
|
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 com.viaversion.viaversion.api.type.Type
|
||||||
import io.netty.buffer.ByteBufAllocator
|
import io.netty.buffer.ByteBufAllocator
|
||||||
import io.netty.buffer.Unpooled
|
import io.netty.buffer.Unpooled
|
||||||
|
import io.netty.channel.Channel
|
||||||
import io.netty.channel.ChannelPipeline
|
import io.netty.channel.ChannelPipeline
|
||||||
import io.netty.handler.proxy.HttpProxyHandler
|
import io.netty.handler.proxy.HttpProxyHandler
|
||||||
import io.netty.handler.proxy.Socks4ProxyHandler
|
import io.netty.handler.proxy.Socks4ProxyHandler
|
||||||
@ -54,4 +56,19 @@ fun encodeBrand(string: String, is17: Boolean): ByteArray {
|
|||||||
buf.release()
|
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))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -10,6 +10,7 @@ import com.viaversion.aas.codec.packet.login.*
|
|||||||
import com.viaversion.aas.config.VIAaaSConfig
|
import com.viaversion.aas.config.VIAaaSConfig
|
||||||
import com.viaversion.aas.handler.MinecraftHandler
|
import com.viaversion.aas.handler.MinecraftHandler
|
||||||
import com.viaversion.aas.handler.forward
|
import com.viaversion.aas.handler.forward
|
||||||
|
import com.viaversion.aas.handler.setCompression
|
||||||
import com.viaversion.aas.util.StacklessException
|
import com.viaversion.aas.util.StacklessException
|
||||||
import com.viaversion.viaversion.api.protocol.packet.State
|
import com.viaversion.viaversion.api.protocol.packet.State
|
||||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion
|
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion
|
||||||
@ -71,25 +72,13 @@ class LoginState : ConnectionState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun handleCompression(handler: MinecraftHandler, setCompression: SetCompression) {
|
private fun handleCompression(handler: MinecraftHandler, setCompression: SetCompression) {
|
||||||
val pipe = handler.data.frontChannel.pipeline()
|
|
||||||
val threshold = setCompression.threshold
|
val threshold = setCompression.threshold
|
||||||
val backPipe = pipe[MinecraftHandler::class.java].other!!.pipeline()
|
|
||||||
|
|
||||||
if (backPipe["compress"] != null) {
|
setCompression(handler.data.backChannel!!, threshold)
|
||||||
backPipe.remove("compress")
|
|
||||||
}
|
|
||||||
if (threshold != -1) {
|
|
||||||
backPipe.addAfter("frame", "compress", CompressionCodec(threshold))
|
|
||||||
}
|
|
||||||
|
|
||||||
forward(handler, setCompression)
|
forward(handler, setCompression)
|
||||||
|
|
||||||
if (pipe["compress"] != null) {
|
setCompression(handler.data.frontChannel, threshold)
|
||||||
pipe.remove("compress")
|
|
||||||
}
|
|
||||||
if (threshold != -1) {
|
|
||||||
pipe.addAfter("frame", "compress", CompressionCodec(threshold))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun authenticateOnlineFront(frontChannel: Channel) {
|
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.UnknownPacket
|
||||||
import com.viaversion.aas.codec.packet.play.Kick
|
import com.viaversion.aas.codec.packet.play.Kick
|
||||||
import com.viaversion.aas.codec.packet.play.PluginMessage
|
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.config.VIAaaSConfig
|
||||||
import com.viaversion.aas.handler.*
|
import com.viaversion.aas.handler.*
|
||||||
import com.viaversion.aas.parseProtocol
|
import com.viaversion.aas.parseProtocol
|
||||||
@ -24,10 +25,21 @@ object PlayState : ConnectionState {
|
|||||||
when {
|
when {
|
||||||
packet is UnknownPacket && (packet.id !in 0..127) -> throw StacklessException("Invalid packet id!")
|
packet is UnknownPacket && (packet.id !in 0..127) -> throw StacklessException("Invalid packet id!")
|
||||||
packet is PluginMessage && !handler.frontEnd -> modifyPluginMessage(handler, packet)
|
packet is PluginMessage && !handler.frontEnd -> modifyPluginMessage(handler, packet)
|
||||||
|
packet is SetPlayCompression -> return handleCompression(handler, packet)
|
||||||
}
|
}
|
||||||
forward(handler, ReferenceCountUtil.retain(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) {
|
private fun modifyPluginMessage(handler: MinecraftHandler, pluginMessage: PluginMessage) {
|
||||||
when (pluginMessage.channel) {
|
when (pluginMessage.channel) {
|
||||||
"MC|Brand", "brand", "minecraft:brand" -> {
|
"MC|Brand", "brand", "minecraft:brand" -> {
|
||||||
|
Loading…
Reference in New Issue
Block a user