From caf6ab22ce0a550c31e09c221705b68506171811 Mon Sep 17 00:00:00 2001 From: creeper123123321 Date: Sat, 22 Dec 2018 13:21:39 -0200 Subject: [PATCH] trying to implement send() refactor --- ...{VRInHandler.java => VRDecodeHandler.java} | 25 ++++++++++++++++-- ...VROutHandler.java => VREncodeHandler.java} | 26 ++++++++++++++++--- .../MixinNetworkManagerClientChInit.java | 8 +++--- .../viarift/platform/VRUserConnection.java | 25 ++++++++++++++++++ 4 files changed, 75 insertions(+), 9 deletions(-) rename src/main/java/com/github/creeper123123321/viarift/handler/{VRInHandler.java => VRDecodeHandler.java} (82%) rename src/main/java/com/github/creeper123123321/viarift/handler/{VROutHandler.java => VREncodeHandler.java} (81%) diff --git a/src/main/java/com/github/creeper123123321/viarift/handler/VRInHandler.java b/src/main/java/com/github/creeper123123321/viarift/handler/VRDecodeHandler.java similarity index 82% rename from src/main/java/com/github/creeper123123321/viarift/handler/VRInHandler.java rename to src/main/java/com/github/creeper123123321/viarift/handler/VRDecodeHandler.java index 2f94081..0e5b33d 100644 --- a/src/main/java/com/github/creeper123123321/viarift/handler/VRInHandler.java +++ b/src/main/java/com/github/creeper123123321/viarift/handler/VRDecodeHandler.java @@ -37,13 +37,14 @@ import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.util.PipelineUtil; import java.lang.reflect.InvocationTargetException; +import java.util.Iterator; import java.util.List; -public class VRInHandler extends ByteToMessageDecoder { +public class VRDecodeHandler extends ByteToMessageDecoder { private UserConnection user; private ByteToMessageDecoder minecraftDecoder; - public VRInHandler(UserConnection user, ByteToMessageDecoder minecraftDecoder) { + public VRDecodeHandler(UserConnection user, ByteToMessageDecoder minecraftDecoder) { this.user = user; this.minecraftDecoder = minecraftDecoder; } @@ -94,9 +95,29 @@ public class VRInHandler extends ByteToMessageDecoder { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { if (PipelineUtil.containsCause(cause, CancelException.class)) return; + if (user.isActive()) { + Iterator iterator = user.getPostProcessingTasks().iterator(); + while (iterator.hasNext()) { + iterator.next().run(); + iterator.remove(); + } + } super.exceptionCaught(ctx, cause); } + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + super.channelRead(ctx, msg); + if (user.isActive()) { + Iterator iterator = user.getPostProcessingTasks().iterator(); + while (iterator.hasNext()) { + iterator.next().run(); + iterator.remove(); + } + } + // todo implement to other platforms + } + @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { ProtocolInfo info = user.get(ProtocolInfo.class); diff --git a/src/main/java/com/github/creeper123123321/viarift/handler/VROutHandler.java b/src/main/java/com/github/creeper123123321/viarift/handler/VREncodeHandler.java similarity index 81% rename from src/main/java/com/github/creeper123123321/viarift/handler/VROutHandler.java rename to src/main/java/com/github/creeper123123321/viarift/handler/VREncodeHandler.java index 021bb4a..9b1d2a1 100644 --- a/src/main/java/com/github/creeper123123321/viarift/handler/VROutHandler.java +++ b/src/main/java/com/github/creeper123123321/viarift/handler/VREncodeHandler.java @@ -26,6 +26,7 @@ package com.github.creeper123123321.viarift.handler; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelPromise; import io.netty.handler.codec.MessageToByteEncoder; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.data.UserConnection; @@ -36,12 +37,13 @@ import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.util.PipelineUtil; import java.lang.reflect.InvocationTargetException; +import java.util.Iterator; -public class VROutHandler extends MessageToByteEncoder { +public class VREncodeHandler extends MessageToByteEncoder { private UserConnection user; private MessageToByteEncoder minecraftEncoder; - public VROutHandler(UserConnection user, MessageToByteEncoder minecraftEncoder) { + public VREncodeHandler(UserConnection user, MessageToByteEncoder minecraftEncoder) { this.user = user; this.minecraftEncoder = minecraftEncoder; } @@ -100,10 +102,28 @@ public class VROutHandler extends MessageToByteEncoder { pre.release(); } - @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { if (PipelineUtil.containsCause(cause, CancelException.class)) return; + if (user.isActive()) { + Iterator iterator = user.getPostProcessingTasks().iterator(); + while (iterator.hasNext()) { + iterator.next().run(); + iterator.remove(); + } + } super.exceptionCaught(ctx, cause); } + + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + super.write(ctx, msg, promise); + if (user.isActive()) { + Iterator iterator = user.getPostProcessingTasks().iterator(); + while (iterator.hasNext()) { + iterator.next().run(); + iterator.remove(); + } + } + } } diff --git a/src/main/java/com/github/creeper123123321/viarift/mixin/MixinNetworkManagerClientChInit.java b/src/main/java/com/github/creeper123123321/viarift/mixin/MixinNetworkManagerClientChInit.java index 20efa12..0e113d8 100644 --- a/src/main/java/com/github/creeper123123321/viarift/mixin/MixinNetworkManagerClientChInit.java +++ b/src/main/java/com/github/creeper123123321/viarift/mixin/MixinNetworkManagerClientChInit.java @@ -24,8 +24,8 @@ package com.github.creeper123123321.viarift.mixin; -import com.github.creeper123123321.viarift.handler.VRInHandler; -import com.github.creeper123123321.viarift.handler.VROutHandler; +import com.github.creeper123123321.viarift.handler.VRDecodeHandler; +import com.github.creeper123123321.viarift.handler.VREncodeHandler; import com.github.creeper123123321.viarift.platform.VRUserConnection; import com.github.creeper123123321.viarift.protocol.Interceptor; import io.netty.channel.Channel; @@ -50,8 +50,8 @@ public class MixinNetworkManagerClientChInit { MessageToByteEncoder oldEncoder = (MessageToByteEncoder) channel.pipeline().get("encoder"); ByteToMessageDecoder oldDecoder = (ByteToMessageDecoder) channel.pipeline().get("decoder"); - channel.pipeline().replace("encoder", "encoder", new VROutHandler(user, oldEncoder)); - channel.pipeline().replace("decoder", "decoder", new VRInHandler(user, oldDecoder)); + channel.pipeline().replace("encoder", "encoder", new VREncodeHandler(user, oldEncoder)); + channel.pipeline().replace("decoder", "decoder", new VRDecodeHandler(user, oldDecoder)); } } } diff --git a/src/main/java/com/github/creeper123123321/viarift/platform/VRUserConnection.java b/src/main/java/com/github/creeper123123321/viarift/platform/VRUserConnection.java index 41b9f09..b3f3851 100644 --- a/src/main/java/com/github/creeper123123321/viarift/platform/VRUserConnection.java +++ b/src/main/java/com/github/creeper123123321/viarift/platform/VRUserConnection.java @@ -25,6 +25,7 @@ package com.github.creeper123123321.viarift.platform; import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import us.myles.ViaVersion.api.PacketWrapper; @@ -84,4 +85,28 @@ public class VRUserConnection extends UserConnection { }); } } + + @Override + public void sendRawPacketAfterProcessing(ByteBuf packet) { + ByteBuf copy = packet.alloc().buffer(); + try { + Type.VAR_INT.write(copy, PacketWrapper.PASSTHROUGH_ID); + } catch (Exception e) { + e.printStackTrace(); + } + copy.writeBytes(packet); + packet.release(); + final Channel channel = this.getChannel(); + getPostProcessingTasks().add(() -> + PipelineUtil.getPreviousContext("decoder", channel.pipeline()).fireChannelRead(copy)); + } + + @Override + public void sendRawPacketToServerAfterProcessing(ByteBuf packet) { + final ByteBuf buf = Unpooled.buffer(); + buf.writeBytes(packet); + packet.release(); + this.getPostProcessingTasks().add(() -> + getChannel().pipeline().context("encoder").writeAndFlush(buf)); + } }