From 36301a595b8aabe6905f65ae0bf78c2a22eae6e4 Mon Sep 17 00:00:00 2001 From: Myles Date: Thu, 29 Sep 2016 15:25:18 +0100 Subject: [PATCH] Fix Bungee Support (Excluding Chunks) + Rename Handlers --- .../BasicHandlerConstructor.java | 12 ++-- .../bukkit/classgenerator/ClassGenerator.java | 16 +++--- ...zer.java => BukkitChannelInitializer.java} | 6 +- ...eHandler.java => BukkitDecodeHandler.java} | 4 +- ...eHandler.java => BukkitEncodeHandler.java} | 4 +- ...tHandler.java => BukkitPacketHandler.java} | 4 +- .../bukkit/platform/BukkitViaInjector.java | 8 +-- ...zer.java => BungeeChannelInitializer.java} | 21 +++---- ...eHandler.java => BungeeDecodeHandler.java} | 42 +++----------- ...eHandler.java => BungeeEncodeHandler.java} | 56 +++++++++---------- .../bungee/handlers/ViaPacketHandler.java | 35 ------------ .../bungee/platform/BungeeViaInjector.java | 6 +- .../bungee/util/BungeePipelineUtil.java | 31 ++++++++-- ...zer.java => SpongeChannelInitializer.java} | 10 ++-- ...eHandler.java => SpongeDecodeHandler.java} | 4 +- ...eHandler.java => SpongeEncodeHandler.java} | 4 +- ...tHandler.java => SpongePacketHandler.java} | 4 +- .../sponge/platform/SpongeViaInjector.java | 8 +-- 18 files changed, 115 insertions(+), 160 deletions(-) rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/{ViaVersionInitializer.java => BukkitChannelInitializer.java} (89%) rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/{ViaDecodeHandler.java => BukkitDecodeHandler.java} (95%) rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/{ViaEncodeHandler.java => BukkitEncodeHandler.java} (94%) rename bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/{ViaPacketHandler.java => BukkitPacketHandler.java} (91%) rename bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/{ViaVersionInitializer.java => BungeeChannelInitializer.java} (52%) rename bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/{ViaDecodeHandler.java => BungeeDecodeHandler.java} (62%) rename bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/{ViaEncodeHandler.java => BungeeEncodeHandler.java} (55%) delete mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaPacketHandler.java rename sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/{ViaVersionInitializer.java => SpongeChannelInitializer.java} (74%) rename sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/{ViaDecodeHandler.java => SpongeDecodeHandler.java} (95%) rename sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/{ViaEncodeHandler.java => SpongeEncodeHandler.java} (93%) rename sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/{ViaPacketHandler.java => SpongePacketHandler.java} (91%) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/BasicHandlerConstructor.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/BasicHandlerConstructor.java index 7ef143b6d..d7908de01 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/BasicHandlerConstructor.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/BasicHandlerConstructor.java @@ -3,17 +3,17 @@ package us.myles.ViaVersion.bukkit.classgenerator; import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.MessageToByteEncoder; import us.myles.ViaVersion.api.data.UserConnection; -import us.myles.ViaVersion.bukkit.handlers.ViaDecodeHandler; -import us.myles.ViaVersion.bukkit.handlers.ViaEncodeHandler; +import us.myles.ViaVersion.bukkit.handlers.BukkitDecodeHandler; +import us.myles.ViaVersion.bukkit.handlers.BukkitEncodeHandler; public class BasicHandlerConstructor implements HandlerConstructor { @Override - public ViaEncodeHandler newEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) { - return new ViaEncodeHandler(info, minecraftEncoder); + public BukkitEncodeHandler newEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) { + return new BukkitEncodeHandler(info, minecraftEncoder); } @Override - public ViaDecodeHandler newDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { - return new ViaDecodeHandler(info, minecraftDecoder); + public BukkitDecodeHandler newDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { + return new BukkitDecodeHandler(info, minecraftDecoder); } } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java index 95d25daa4..ea4137a0a 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java @@ -6,8 +6,8 @@ import javassist.expr.ExprEditor; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import us.myles.ViaVersion.api.ViaVersion; -import us.myles.ViaVersion.bukkit.handlers.ViaDecodeHandler; -import us.myles.ViaVersion.bukkit.handlers.ViaEncodeHandler; +import us.myles.ViaVersion.bukkit.handlers.BukkitDecodeHandler; +import us.myles.ViaVersion.bukkit.handlers.BukkitEncodeHandler; import us.myles.ViaVersion.bukkit.util.NMSUtil; public class ClassGenerator { @@ -30,14 +30,14 @@ public class ClassGenerator { Class decodeSuper = NMSUtil.nms("PacketDecoder"); Class encodeSuper = NMSUtil.nms("PacketEncoder"); // Generate the classes - addSpigotCompatibility(pool, ViaDecodeHandler.class, decodeSuper); - addSpigotCompatibility(pool, ViaEncodeHandler.class, encodeSuper); + addSpigotCompatibility(pool, BukkitDecodeHandler.class, decodeSuper); + addSpigotCompatibility(pool, BukkitEncodeHandler.class, encodeSuper); } else { Class decodeSuper = Class.forName(getPSPackage() + ".wrapped.WrappedDecoder"); Class encodeSuper = Class.forName(getPSPackage() + ".wrapped.WrappedEncoder"); // Generate the classes - addPSCompatibility(pool, ViaDecodeHandler.class, decodeSuper); - addPSCompatibility(pool, ViaEncodeHandler.class, encodeSuper); + addPSCompatibility(pool, BukkitDecodeHandler.class, decodeSuper); + addPSCompatibility(pool, BukkitEncodeHandler.class, encodeSuper); } @@ -53,10 +53,10 @@ public class ClassGenerator { pool.importPackage("io.netty.handler.codec"); // Implement Methods generated.addMethod(CtMethod.make("public MessageToByteEncoder newEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) {\n" + - " return new ViaEncodeHandler(info, minecraftEncoder);\n" + + " return new BukkitEncodeHandler(info, minecraftEncoder);\n" + " }", generated)); generated.addMethod(CtMethod.make("public ByteToMessageDecoder newDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) {\n" + - " return new ViaDecodeHandler(info, minecraftDecoder);\n" + + " return new BukkitDecodeHandler(info, minecraftDecoder);\n" + " }", generated)); constructor = (HandlerConstructor) generated.toClass(HandlerConstructor.class.getClassLoader()).newInstance(); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaVersionInitializer.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitChannelInitializer.java similarity index 89% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaVersionInitializer.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitChannelInitializer.java index 716e38310..a4529ad3a 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaVersionInitializer.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitChannelInitializer.java @@ -12,12 +12,12 @@ import us.myles.ViaVersion.bukkit.classgenerator.HandlerConstructor; import java.lang.reflect.Method; -public class ViaVersionInitializer extends ChannelInitializer { +public class BukkitChannelInitializer extends ChannelInitializer { private final ChannelInitializer original; private Method method; - public ViaVersionInitializer(ChannelInitializer oldInit) { + public BukkitChannelInitializer(ChannelInitializer oldInit) { this.original = oldInit; try { this.method = ChannelInitializer.class.getDeclaredMethod("initChannel", Channel.class); @@ -43,7 +43,7 @@ public class ViaVersionInitializer extends ChannelInitializer { // Add our transformers MessageToByteEncoder encoder = constructor.newEncodeHandler(info, (MessageToByteEncoder) socketChannel.pipeline().get("encoder")); ByteToMessageDecoder decoder = constructor.newDecodeHandler(info, (ByteToMessageDecoder) socketChannel.pipeline().get("decoder")); - ViaPacketHandler chunkHandler = new ViaPacketHandler(info); + BukkitPacketHandler chunkHandler = new BukkitPacketHandler(info); socketChannel.pipeline().replace("encoder", "encoder", encoder); socketChannel.pipeline().replace("decoder", "decoder", decoder); diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaDecodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitDecodeHandler.java similarity index 95% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaDecodeHandler.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitDecodeHandler.java index 0fe3b1d39..59f2f3e18 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaDecodeHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitDecodeHandler.java @@ -14,12 +14,12 @@ import us.myles.ViaVersion.util.PipelineUtil; import java.lang.reflect.InvocationTargetException; import java.util.List; -public class ViaDecodeHandler extends ByteToMessageDecoder { +public class BukkitDecodeHandler extends ByteToMessageDecoder { private final ByteToMessageDecoder minecraftDecoder; private final UserConnection info; - public ViaDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { + public BukkitDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { this.info = info; this.minecraftDecoder = minecraftDecoder; } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaEncodeHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitEncodeHandler.java similarity index 94% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaEncodeHandler.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitEncodeHandler.java index edc4ec43c..e22a8b359 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaEncodeHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitEncodeHandler.java @@ -16,11 +16,11 @@ import us.myles.ViaVersion.util.PipelineUtil; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; -public class ViaEncodeHandler extends MessageToByteEncoder { +public class BukkitEncodeHandler extends MessageToByteEncoder { private final UserConnection info; private final MessageToByteEncoder minecraftEncoder; - public ViaEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) { + public BukkitEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) { this.info = info; this.minecraftEncoder = minecraftEncoder; } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaPacketHandler.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitPacketHandler.java similarity index 91% rename from bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaPacketHandler.java rename to bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitPacketHandler.java index ae09c9e01..d3b352dac 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/ViaPacketHandler.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/handlers/BukkitPacketHandler.java @@ -8,10 +8,10 @@ import us.myles.ViaVersion.protocols.base.ProtocolInfo; import java.util.List; -public class ViaPacketHandler extends MessageToMessageEncoder { +public class BukkitPacketHandler extends MessageToMessageEncoder { private final UserConnection info; - public ViaPacketHandler(UserConnection info) { + public BukkitPacketHandler(UserConnection info) { this.info = info; } diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java index 769f35764..ea10015d2 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java @@ -8,7 +8,7 @@ import org.bukkit.plugin.PluginDescriptionFile; import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; -import us.myles.ViaVersion.bukkit.handlers.ViaVersionInitializer; +import us.myles.ViaVersion.bukkit.handlers.BukkitChannelInitializer; import us.myles.ViaVersion.util.ConcurrentList; import us.myles.ViaVersion.util.ListWrapper; import us.myles.ViaVersion.bukkit.util.NMSUtil; @@ -75,7 +75,7 @@ public class BukkitViaInjector implements ViaInjector { ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); try { ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); - ChannelInitializer newInit = new ViaVersionInitializer(oldInit); + ChannelInitializer newInit = new BukkitChannelInitializer(oldInit); ReflectionUtil.set(bootstrapAcceptor, "childHandler", newInit); injectedFutures.add(future); @@ -103,8 +103,8 @@ public class BukkitViaInjector implements ViaInjector { ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); try { ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); - if (oldInit instanceof ViaVersionInitializer) { - ReflectionUtil.set(bootstrapAcceptor, "childHandler", ((ViaVersionInitializer) oldInit).getOriginal()); + if (oldInit instanceof BukkitChannelInitializer) { + ReflectionUtil.set(bootstrapAcceptor, "childHandler", ((BukkitChannelInitializer) oldInit).getOriginal()); } } catch (Exception e) { System.out.println("Failed to remove injection handler, reload won't work with connections, please reboot!"); diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeChannelInitializer.java similarity index 52% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeChannelInitializer.java index e15899e4c..ceea247f9 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaVersionInitializer.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeChannelInitializer.java @@ -3,19 +3,17 @@ package us.myles.ViaVersion.bungee.handlers; import io.netty.channel.Channel; import io.netty.channel.ChannelInitializer; import io.netty.channel.socket.SocketChannel; -import net.md_5.bungee.protocol.MinecraftDecoder; -import net.md_5.bungee.protocol.MinecraftEncoder; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.protocol.ProtocolPipeline; import java.lang.reflect.Method; -public class ViaVersionInitializer extends ChannelInitializer { +public class BungeeChannelInitializer extends ChannelInitializer { private final ChannelInitializer original; private Method method; - public ViaVersionInitializer(ChannelInitializer oldInit) { + public BungeeChannelInitializer(ChannelInitializer oldInit) { this.original = oldInit; try { this.method = ChannelInitializer.class.getDeclaredMethod("initChannel", Channel.class); @@ -25,10 +23,6 @@ public class ViaVersionInitializer extends ChannelInitializer { } } - public ChannelInitializer getOriginal() { - return original; - } - @Override protected void initChannel(SocketChannel socketChannel) throws Exception { UserConnection info = new UserConnection(socketChannel); @@ -37,12 +31,11 @@ public class ViaVersionInitializer extends ChannelInitializer { // Add originals this.method.invoke(this.original, socketChannel); // Add our transformers - ViaEncodeHandler encoder = new ViaEncodeHandler(info, (MinecraftEncoder) socketChannel.pipeline().get("packet-encoder")); - ViaDecodeHandler decoder = new ViaDecodeHandler(info, (MinecraftDecoder) socketChannel.pipeline().get("packet-decoder")); -// ViaPacketHandler chunkHandler = new ViaPacketHandler(info); + BungeeEncodeHandler encoder = new BungeeEncodeHandler(info); + BungeeDecodeHandler decoder = new BungeeDecodeHandler(info); + + socketChannel.pipeline().addBefore("packet-encoder", "via-encoder", encoder); + socketChannel.pipeline().addBefore("packet-decoder", "via-decoder", decoder); - socketChannel.pipeline().replace("packet-encoder", "packet-encoder", encoder); - socketChannel.pipeline().replace("packet-decoder", "packet-decoder", decoder); -// socketChannel.pipeline().addAfter("packet_handler", "viaversion_packet_handler", chunkHandler); } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeDecodeHandler.java similarity index 62% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeDecodeHandler.java index cde90c1ec..898df7d11 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaDecodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeDecodeHandler.java @@ -1,35 +1,30 @@ package us.myles.ViaVersion.bungee.handlers; import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.protocol.MinecraftDecoder; -import net.md_5.bungee.protocol.Protocol; +import io.netty.handler.codec.MessageToMessageDecoder; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; -import us.myles.ViaVersion.bungee.util.BungeePipelineUtil; import us.myles.ViaVersion.exception.CancelException; import us.myles.ViaVersion.packets.Direction; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.util.PipelineUtil; -import java.lang.reflect.InvocationTargetException; import java.util.List; -public class ViaDecodeHandler extends MinecraftDecoder { +@ChannelHandler.Sharable +public class BungeeDecodeHandler extends MessageToMessageDecoder { - private final MinecraftDecoder minecraftDecoder; private final UserConnection info; - public ViaDecodeHandler(UserConnection info, MinecraftDecoder minecraftDecoder) { - super(Protocol.HANDSHAKE, true, ProxyServer.getInstance().getProtocolVersion()); + public BungeeDecodeHandler(UserConnection info) { this.info = info; - this.minecraftDecoder = minecraftDecoder; } @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf bytebuf, List list) throws Exception { + protected void decode(final ChannelHandlerContext ctx, ByteBuf bytebuf, List out) throws Exception { // use transformers if (bytebuf.readableBytes() > 0) { // Ignore if pending disconnect @@ -68,20 +63,11 @@ public class ViaDecodeHandler extends MinecraftDecoder { newPacket.release(); throw e; } + } else { + bytebuf.retain(); } - // call minecraft decoder - try { - list.addAll(BungeePipelineUtil.callDecode(this.minecraftDecoder, ctx, bytebuf)); - } catch (InvocationTargetException e) { - if (e.getCause() instanceof Exception) { - throw (Exception) e.getCause(); - } - } finally { - if (info.isActive()) { - bytebuf.release(); - } - } + out.add(bytebuf); } } @@ -90,14 +76,4 @@ public class ViaDecodeHandler extends MinecraftDecoder { if (PipelineUtil.containsCause(cause, CancelException.class)) return; super.exceptionCaught(ctx, cause); } - - @Override - public void setProtocol(Protocol protocol) { - this.minecraftDecoder.setProtocol(protocol); - } - - @Override - public void setProtocolVersion(int protocolVersion) { - this.minecraftDecoder.setProtocolVersion(protocolVersion); - } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java similarity index 55% rename from bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java rename to bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java index dbe0b01e3..4b8dc0563 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaEncodeHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeEncodeHandler.java @@ -1,11 +1,9 @@ package us.myles.ViaVersion.bungee.handlers; import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.protocol.DefinedPacket; -import net.md_5.bungee.protocol.MinecraftEncoder; -import net.md_5.bungee.protocol.Protocol; +import io.netty.handler.codec.MessageToMessageEncoder; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.type.Type; @@ -15,32 +13,38 @@ import us.myles.ViaVersion.packets.Direction; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.util.PipelineUtil; -import java.lang.reflect.InvocationTargetException; +import java.util.List; -public class ViaEncodeHandler extends MinecraftEncoder { +@ChannelHandler.Sharable +public class BungeeEncodeHandler extends MessageToMessageEncoder { private final UserConnection info; - private final MinecraftEncoder minecraftEncoder; + private boolean handledCompression = false; - public ViaEncodeHandler(UserConnection info, MinecraftEncoder minecraftEncoder) { - super(Protocol.HANDSHAKE, true, ProxyServer.getInstance().getProtocolVersion()); + public BungeeEncodeHandler(UserConnection info) { this.info = info; - this.minecraftEncoder = minecraftEncoder; } @Override - protected void encode(final ChannelHandlerContext ctx, DefinedPacket o, final ByteBuf bytebuf) throws Exception { - // call minecraft encoder - try { - BungeePipelineUtil.callEncode(this.minecraftEncoder, ctx, o, bytebuf); - } catch (InvocationTargetException e) { - if (e.getCause() instanceof Exception) { - throw (Exception) e.getCause(); - } - } + protected void encode(final ChannelHandlerContext ctx, ByteBuf bytebuf, List out) throws Exception { if (bytebuf.readableBytes() == 0) { throw new CancelException(); } + boolean needsCompress = false; + if (!handledCompression) { + if (ctx.pipeline().names().indexOf("compress") > ctx.pipeline().names().indexOf("via-encoder")) { + // Need to decompress this packet due to bad order + bytebuf = BungeePipelineUtil.decompress(ctx, bytebuf); + ChannelHandler encoder = ctx.pipeline().get("via-decoder"); + ChannelHandler decoder = ctx.pipeline().get("via-encoder"); + ctx.pipeline().remove(encoder); + ctx.pipeline().remove(decoder); + ctx.pipeline().addAfter("decompress", "via-decoder", encoder); + ctx.pipeline().addAfter("compress", "via-encoder", decoder); + needsCompress = true; + handledCompression = true; + } + } // Increment sent info.incrementSent(); if (info.isActive()) { @@ -62,6 +66,11 @@ public class ViaEncodeHandler extends MinecraftEncoder { oldPacket.release(); } } + + if (needsCompress) { + bytebuf = BungeePipelineUtil.compress(ctx, bytebuf); + } + out.add(bytebuf.retain()); } @Override @@ -70,13 +79,4 @@ public class ViaEncodeHandler extends MinecraftEncoder { super.exceptionCaught(ctx, cause); } - @Override - public void setProtocol(Protocol protocol) { - this.minecraftEncoder.setProtocol(protocol); - } - - @Override - public void setProtocolVersion(int protocolVersion) { - this.minecraftEncoder.setProtocolVersion(protocolVersion); - } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaPacketHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaPacketHandler.java deleted file mode 100644 index 62d1e44fa..000000000 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/ViaPacketHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package us.myles.ViaVersion.bungee.handlers; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToMessageEncoder; -import us.myles.ViaVersion.api.data.UserConnection; -import us.myles.ViaVersion.protocols.base.ProtocolInfo; - -import java.util.List; - -public class ViaPacketHandler extends MessageToMessageEncoder { - private final UserConnection info; - - public ViaPacketHandler(UserConnection info) { - this.info = info; - } - - @Override - protected void encode(ChannelHandlerContext ctx, Object o, List list) throws Exception { - // Split chunks bulk packet up in to single chunks packets before it reached the encoder. - // This will prevent issues with several plugins and other protocol handlers due to the chunks being sent twice. - // It also sends the chunks in the right order possible resolving some issues with added chunks/block/entity data. - if (!(o instanceof ByteBuf)) { - info.setLastPacket(o); - /* This transformer is more for fixing issues which we find hard at packet level :) */ - if (info.isActive()) { - if (info.get(ProtocolInfo.class).getPipeline().filter(o, list)) { - return; - } - } - } - - list.add(o); - } -} diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java index 67ed4b3ac..bc2690616 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaInjector.java @@ -5,7 +5,7 @@ import io.netty.channel.ChannelInitializer; import net.md_5.bungee.netty.PipelineUtils; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; -import us.myles.ViaVersion.bungee.handlers.ViaVersionInitializer; +import us.myles.ViaVersion.bungee.handlers.BungeeChannelInitializer; import us.myles.ViaVersion.util.ReflectionUtil; public class BungeeViaInjector implements ViaInjector { @@ -14,7 +14,7 @@ public class BungeeViaInjector implements ViaInjector { try { try { ChannelInitializer oldInit = PipelineUtils.SERVER_CHILD; - ChannelInitializer newInit = new ViaVersionInitializer(oldInit); + ChannelInitializer newInit = new BungeeChannelInitializer(oldInit); ReflectionUtil.setStatic(PipelineUtils.class, "SERVER_CHILD", newInit); } catch (NoSuchFieldException e) { @@ -41,6 +41,6 @@ public class BungeeViaInjector implements ViaInjector { @Override public String getEncoderName() { - return "packet-encoder"; + return "via-encoder"; } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java index f6f3aa22e..535df323c 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/util/BungeePipelineUtil.java @@ -4,6 +4,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; import io.netty.handler.codec.MessageToMessageDecoder; +import io.netty.handler.codec.MessageToMessageEncoder; import net.md_5.bungee.protocol.DefinedPacket; import net.md_5.bungee.protocol.MinecraftDecoder; import net.md_5.bungee.protocol.MinecraftEncoder; @@ -19,14 +20,14 @@ public class BungeePipelineUtil { static { try { - DECODE_METHOD = MinecraftDecoder.class.getDeclaredMethod("decode", ChannelHandlerContext.class, ByteBuf.class, List.class); + DECODE_METHOD = MessageToMessageDecoder.class.getDeclaredMethod("decode", ChannelHandlerContext.class, Object.class, List.class); DECODE_METHOD.setAccessible(true); } catch (NoSuchMethodException e) { e.printStackTrace(); System.out.println("Netty issue?"); } try { - ENCODE_METHOD = MinecraftEncoder.class.getDeclaredMethod("encode", ChannelHandlerContext.class, DefinedPacket.class, ByteBuf.class); + ENCODE_METHOD = MessageToByteEncoder.class.getDeclaredMethod("encode", ChannelHandlerContext.class, Object.class, ByteBuf.class); ENCODE_METHOD.setAccessible(true); } catch (NoSuchMethodException e) { e.printStackTrace(); @@ -34,7 +35,7 @@ public class BungeePipelineUtil { } } - public static List callDecode(MessageToMessageDecoder decoder, ChannelHandlerContext ctx, Object input) throws InvocationTargetException { + public static List callDecode(MessageToMessageDecoder decoder, ChannelHandlerContext ctx, ByteBuf input) throws InvocationTargetException { List output = new ArrayList<>(); try { BungeePipelineUtil.DECODE_METHOD.invoke(decoder, ctx, input, output); @@ -44,11 +45,31 @@ public class BungeePipelineUtil { return output; } - public static void callEncode(MessageToByteEncoder encoder, ChannelHandlerContext ctx, Object msg, ByteBuf output) throws InvocationTargetException { + public static ByteBuf callEncode(MessageToByteEncoder encoder, ChannelHandlerContext ctx, ByteBuf input) throws InvocationTargetException { + ByteBuf output = ctx.alloc().buffer(); try { - BungeePipelineUtil.ENCODE_METHOD.invoke(encoder, ctx, msg, output); + BungeePipelineUtil.ENCODE_METHOD.invoke(encoder, ctx, input, output); } catch (IllegalAccessException e) { e.printStackTrace(); } + return output; + } + + public static ByteBuf decompress(ChannelHandlerContext ctx, ByteBuf bytebuf) { + try { + return (ByteBuf) callDecode((MessageToMessageDecoder) ctx.pipeline().get("decompress"), ctx.pipeline().context("decompress"), bytebuf).get(0); + } catch (InvocationTargetException e) { + e.printStackTrace(); + return ctx.alloc().buffer(); + } + } + + public static ByteBuf compress(ChannelHandlerContext ctx, ByteBuf bytebuf) { + try { + return callEncode((MessageToByteEncoder) ctx.pipeline().get("compress"), ctx.pipeline().context("compress"), bytebuf); + } catch (InvocationTargetException e) { + e.printStackTrace(); + return ctx.alloc().buffer(); + } } } diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaVersionInitializer.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeChannelInitializer.java similarity index 74% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaVersionInitializer.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeChannelInitializer.java index 2a29c110b..88248d769 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaVersionInitializer.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeChannelInitializer.java @@ -10,12 +10,12 @@ import us.myles.ViaVersion.api.protocol.ProtocolPipeline; import java.lang.reflect.Method; -public class ViaVersionInitializer extends ChannelInitializer { +public class SpongeChannelInitializer extends ChannelInitializer { private final ChannelInitializer original; private Method method; - public ViaVersionInitializer(ChannelInitializer oldInit) { + public SpongeChannelInitializer(ChannelInitializer oldInit) { this.original = oldInit; try { this.method = ChannelInitializer.class.getDeclaredMethod("initChannel", Channel.class); @@ -37,9 +37,9 @@ public class ViaVersionInitializer extends ChannelInitializer { // Add originals this.method.invoke(this.original, socketChannel); // Add our transformers - MessageToByteEncoder encoder = new ViaEncodeHandler(info, (MessageToByteEncoder) socketChannel.pipeline().get("encoder")); - ByteToMessageDecoder decoder = new ViaDecodeHandler(info, (ByteToMessageDecoder) socketChannel.pipeline().get("decoder")); - ViaPacketHandler chunkHandler = new ViaPacketHandler(info); + MessageToByteEncoder encoder = new SpongeEncodeHandler(info, (MessageToByteEncoder) socketChannel.pipeline().get("encoder")); + ByteToMessageDecoder decoder = new SpongeDecodeHandler(info, (ByteToMessageDecoder) socketChannel.pipeline().get("decoder")); + SpongePacketHandler chunkHandler = new SpongePacketHandler(info); socketChannel.pipeline().replace("encoder", "encoder", encoder); socketChannel.pipeline().replace("decoder", "decoder", decoder); diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeDecodeHandler.java similarity index 95% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeDecodeHandler.java index 943d87094..8ee2180db 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaDecodeHandler.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeDecodeHandler.java @@ -14,12 +14,12 @@ import us.myles.ViaVersion.util.PipelineUtil; import java.lang.reflect.InvocationTargetException; import java.util.List; -public class ViaDecodeHandler extends ByteToMessageDecoder { +public class SpongeDecodeHandler extends ByteToMessageDecoder { private final ByteToMessageDecoder minecraftDecoder; private final UserConnection info; - public ViaDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { + public SpongeDecodeHandler(UserConnection info, ByteToMessageDecoder minecraftDecoder) { this.info = info; this.minecraftDecoder = minecraftDecoder; } diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaEncodeHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeEncodeHandler.java similarity index 93% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaEncodeHandler.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeEncodeHandler.java index 06e51f05f..8f12b42a4 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaEncodeHandler.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongeEncodeHandler.java @@ -13,11 +13,11 @@ import us.myles.ViaVersion.util.PipelineUtil; import java.lang.reflect.InvocationTargetException; -public class ViaEncodeHandler extends MessageToByteEncoder { +public class SpongeEncodeHandler extends MessageToByteEncoder { private final UserConnection info; private final MessageToByteEncoder minecraftEncoder; - public ViaEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) { + public SpongeEncodeHandler(UserConnection info, MessageToByteEncoder minecraftEncoder) { this.info = info; this.minecraftEncoder = minecraftEncoder; } diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaPacketHandler.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongePacketHandler.java similarity index 91% rename from sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaPacketHandler.java rename to sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongePacketHandler.java index 07e4deb03..905685c7e 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/ViaPacketHandler.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/handlers/SpongePacketHandler.java @@ -8,10 +8,10 @@ import us.myles.ViaVersion.protocols.base.ProtocolInfo; import java.util.List; -public class ViaPacketHandler extends MessageToMessageEncoder { +public class SpongePacketHandler extends MessageToMessageEncoder { private final UserConnection info; - public ViaPacketHandler(UserConnection info) { + public SpongePacketHandler(UserConnection info) { this.info = info; } diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java index 819248415..17301cb22 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaInjector.java @@ -9,7 +9,7 @@ import org.spongepowered.api.Sponge; import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaInjector; -import us.myles.ViaVersion.sponge.handlers.ViaVersionInitializer; +import us.myles.ViaVersion.sponge.handlers.SpongeChannelInitializer; import us.myles.ViaVersion.util.ListWrapper; import us.myles.ViaVersion.util.ReflectionUtil; @@ -74,7 +74,7 @@ public class SpongeViaInjector implements ViaInjector { ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); try { ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); - ChannelInitializer newInit = new ViaVersionInitializer(oldInit); + ChannelInitializer newInit = new SpongeChannelInitializer(oldInit); ReflectionUtil.set(bootstrapAcceptor, "childHandler", newInit); injectedFutures.add(future); @@ -95,8 +95,8 @@ public class SpongeViaInjector implements ViaInjector { ChannelHandler bootstrapAcceptor = future.channel().pipeline().first(); try { ChannelInitializer oldInit = ReflectionUtil.get(bootstrapAcceptor, "childHandler", ChannelInitializer.class); - if (oldInit instanceof ViaVersionInitializer) { - ReflectionUtil.set(bootstrapAcceptor, "childHandler", ((ViaVersionInitializer) oldInit).getOriginal()); + if (oldInit instanceof SpongeChannelInitializer) { + ReflectionUtil.set(bootstrapAcceptor, "childHandler", ((SpongeChannelInitializer) oldInit).getOriginal()); } } catch (Exception e) { System.out.println("Failed to remove injection handler, reload won't work with connections, please reboot!");