diff --git a/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java b/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java index 66d33d2b8..13f827c53 100644 --- a/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java +++ b/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java @@ -3,6 +3,7 @@ package us.myles.ViaVersion.api; import com.google.common.base.Preconditions; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelFuture; import lombok.Getter; import lombok.Setter; import us.myles.ViaVersion.api.data.UserConnection; @@ -281,7 +282,7 @@ public class PacketWrapper { * @param skipCurrentPipeline - Skip the current pipeline * @throws Exception if it fails to write */ - public void send(Class packetProtocol, boolean skipCurrentPipeline) throws Exception { + public ChannelFuture send(Class packetProtocol, boolean skipCurrentPipeline) throws Exception { if (!isCancelled()) { // Apply current pipeline List protocols = new ArrayList<>(user().get(ProtocolInfo.class).getPipeline().pipes()); @@ -303,8 +304,9 @@ public class PacketWrapper { // Send ByteBuf output = inputBuffer == null ? Unpooled.buffer() : inputBuffer.alloc().buffer(); writeToBuffer(output); - user().sendRawPacket(output); + return user().sendRawPacketFuture(output); } + return user().getChannel().newFailedFuture(new Exception("Cancelled packet")); } /** @@ -319,6 +321,20 @@ public class PacketWrapper { send(packetProtocol, true); } + /** + * Send this packet to the associated user. + * Be careful not to send packets twice. + * (Sends it after current) + * Also returns the packets ChannelFuture + * + * @param packetProtocol - The protocol version of the packet. + * @return The packets ChannelFuture + * @throws Exception if it fails to write + */ + public ChannelFuture sendFuture(Class packetProtocol) throws Exception { + return send(packetProtocol, true); + } + /** * Send this packet to the associated user. * Be careful not to send packets twice. diff --git a/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java b/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java index bb549637e..28ddac8c1 100644 --- a/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java +++ b/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java @@ -1,6 +1,7 @@ package us.myles.ViaVersion.api.data; import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandler; import io.netty.channel.socket.SocketChannel; import lombok.Data; @@ -85,6 +86,17 @@ public class UserConnection { } } + /** + * Send a raw packet to the player with returning the future + * + * @param packet The raw packet to send + * @return ChannelFuture of the packet being sent + */ + public ChannelFuture sendRawPacketFuture(final ByteBuf packet) { + final ChannelHandler handler = channel.pipeline().get("encoder"); + return channel.pipeline().context(handler).writeAndFlush(packet); + } + /** * Send a raw packet to the player (netty thread) * diff --git a/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java b/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java index 498a8f6b7..f5538f940 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java +++ b/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java @@ -1,5 +1,8 @@ package us.myles.ViaVersion.protocols.base; +import io.netty.channel.ChannelFuture; +import io.netty.util.concurrent.Future; +import io.netty.util.concurrent.GenericFutureListener; import net.md_5.bungee.api.ChatColor; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; @@ -166,18 +169,24 @@ public class BaseProtocol extends Protocol { public void registerMap() { handler(new PacketHandler() { @Override - public void handle(PacketWrapper wrapper) throws Exception { + public void handle(final PacketWrapper wrapper) throws Exception { int protocol = wrapper.user().get(ProtocolInfo.class).getProtocolVersion(); if (ViaVersion.getConfig().getBlockedProtocols().contains(protocol)) { if (!wrapper.user().getChannel().isOpen()) return; PacketWrapper disconnectPacket = new PacketWrapper(0x00, null, wrapper.user()); // Disconnect Packet Protocol1_9TO1_8.FIX_JSON.write(disconnectPacket, ChatColor.translateAlternateColorCodes('&', ViaVersion.getConfig().getBlockedDisconnectMsg())); - disconnectPacket.send(BaseProtocol.class); + wrapper.cancel(); // cancel current - wrapper.cancel(); - wrapper.user().getChannel().closeFuture(); - } + // Send and close + ChannelFuture future = disconnectPacket.sendFuture(BaseProtocol.class); + future.addListener(new GenericFutureListener>() { + @Override + public void operationComplete(Future future) throws Exception { + wrapper.user().getChannel().close(); + } + }); + } } }); } diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/FakeTileEntity.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/FakeTileEntity.java index 23324a01a..c94ecf497 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/FakeTileEntity.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/FakeTileEntity.java @@ -38,7 +38,7 @@ public class FakeTileEntity { register(Arrays.asList(Material.REDSTONE_COMPARATOR, Material.REDSTONE_COMPARATOR_OFF, Material.REDSTONE_COMPARATOR_ON), "Comparator"); register(Material.FLOWER_POT, "FlowerPot"); register(Arrays.asList(Material.STANDING_BANNER, Material.WALL_BANNER, Material.BANNER), "Banner"); - register(209, "EndGateway"); // todo test + register(209, "EndGateway"); register(Material.COMMAND.getId(), "Control"); }