From a5ba52ce05d4a334f9961cc0a67ff61ff3b79324 Mon Sep 17 00:00:00 2001 From: Myles Date: Tue, 22 Mar 2016 15:36:11 +0000 Subject: [PATCH] Rename ChunkHandler Introduce Packet Filtering --- README.md | 7 ------- .../myles/ViaVersion/api/protocol/Protocol.java | 9 +++++++++ .../ViaVersion/api/protocol/ProtocolPipeline.java | 15 +++++++++++++-- ...ViaChunkHandler.java => ViaPacketHandler.java} | 11 ++++------- .../handlers/ViaVersionInitializer.java | 4 ++-- .../protocol1_9to1_8/Protocol1_9TO1_8.java | 10 ++++++++++ 6 files changed, 38 insertions(+), 18 deletions(-) rename src/main/java/us/myles/ViaVersion/handlers/{ViaChunkHandler.java => ViaPacketHandler.java} (66%) diff --git a/README.md b/README.md index 206a7640a..7f9eecb66 100644 --- a/README.md +++ b/README.md @@ -8,15 +8,8 @@ The things which stop this from going live: Need to implement debug mode using deprecated PacketType for english -Need to implement a way for mappers to register listeners <-- - - -and eventually we'll add a way to add things the way chunk handler works!! - and then javadocs. -and maybe check for memory leaks. - It would be nice to have a Pipeline cache so it doesn't have to figure it out all the time. (and to ensure it uses the shortest pipeline) diff --git a/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java b/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java index cd5d3d25a..53e10f468 100644 --- a/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java +++ b/src/main/java/us/myles/ViaVersion/api/protocol/Protocol.java @@ -11,6 +11,7 @@ import us.myles.ViaVersion.packets.Direction; import us.myles.ViaVersion.packets.State; import java.util.HashMap; +import java.util.List; import java.util.Map; public abstract class Protocol { @@ -22,6 +23,14 @@ public abstract class Protocol { registerListeners(); } + public boolean isFiltered(Class packetClass) { + return false; + } + + protected void filterPacket(UserConnection info, Object packet, List output) throws Exception { + output.add(packet); + } + protected void registerListeners() { } diff --git a/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java b/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java index 38864ec6d..b2c7daa8c 100644 --- a/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java +++ b/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolPipeline.java @@ -2,10 +2,10 @@ package us.myles.ViaVersion.api.protocol; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.data.UserConnection; -import us.myles.ViaVersion.protocols.base.BaseProtocol; -import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.packets.Direction; import us.myles.ViaVersion.packets.State; +import us.myles.ViaVersion.protocols.base.BaseProtocol; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; import java.util.ArrayList; import java.util.Collections; @@ -78,4 +78,15 @@ public class ProtocolPipeline extends Protocol { } return false; } + + public boolean filter(Object o, List list) throws Exception { + for (Protocol protocol : protocolList) { + if (protocol.isFiltered(o.getClass())) { + protocol.filterPacket(userConnection, o, list); + return true; + } + } + + return false; + } } diff --git a/src/main/java/us/myles/ViaVersion/handlers/ViaChunkHandler.java b/src/main/java/us/myles/ViaVersion/handlers/ViaPacketHandler.java similarity index 66% rename from src/main/java/us/myles/ViaVersion/handlers/ViaChunkHandler.java rename to src/main/java/us/myles/ViaVersion/handlers/ViaPacketHandler.java index 4c10bfbc3..78e5f1eec 100644 --- a/src/main/java/us/myles/ViaVersion/handlers/ViaChunkHandler.java +++ b/src/main/java/us/myles/ViaVersion/handlers/ViaPacketHandler.java @@ -5,15 +5,13 @@ 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 us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; import java.util.List; -public class ViaChunkHandler extends MessageToMessageEncoder { +public class ViaPacketHandler extends MessageToMessageEncoder { private final UserConnection info; - public ViaChunkHandler(UserConnection info) { + public ViaPacketHandler(UserConnection info) { this.info = info; } @@ -25,9 +23,8 @@ public class ViaChunkHandler extends MessageToMessageEncoder { if (!(o instanceof ByteBuf)) { info.setLastPacket(o); /* This transformer is more for fixing issues which we find hard at packet level :) */ - if (o.getClass().getName().endsWith("PacketPlayOutMapChunkBulk") && info.isActive()) { - if (info.get(ProtocolInfo.class).getPipeline().contains(Protocol1_9TO1_8.class)) { - list.addAll(info.get(ClientChunks.class).transformMapChunkBulk(o)); + if (info.isActive()) { + if (info.get(ProtocolInfo.class).getPipeline().filter(o, list)) { return; } } diff --git a/src/main/java/us/myles/ViaVersion/handlers/ViaVersionInitializer.java b/src/main/java/us/myles/ViaVersion/handlers/ViaVersionInitializer.java index 837d7d67d..c8ff624a5 100644 --- a/src/main/java/us/myles/ViaVersion/handlers/ViaVersionInitializer.java +++ b/src/main/java/us/myles/ViaVersion/handlers/ViaVersionInitializer.java @@ -36,10 +36,10 @@ public class ViaVersionInitializer extends ChannelInitializer { // Add our transformers ViaEncodeHandler encoder = new ViaEncodeHandler(info, (MessageToByteEncoder) socketChannel.pipeline().get("encoder")); ViaDecodeHandler decoder = new ViaDecodeHandler(info, (ByteToMessageDecoder) socketChannel.pipeline().get("decoder")); - ViaChunkHandler chunkHandler = new ViaChunkHandler(info); + ViaPacketHandler chunkHandler = new ViaPacketHandler(info); socketChannel.pipeline().replace("encoder", "encoder", encoder); socketChannel.pipeline().replace("decoder", "decoder", decoder); - socketChannel.pipeline().addAfter("packet_handler", "viaversion_chunk_handler", chunkHandler); + socketChannel.pipeline().addAfter("packet_handler", "viaversion_packet_handler", chunkHandler); } } diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java index 2c56080b8..7f9ac23f6 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java @@ -99,6 +99,16 @@ public class Protocol1_9TO1_8 extends Protocol { Bukkit.getPluginManager().registerEvents(new CommandBlockListener(plugin), plugin); } + @Override + public boolean isFiltered(Class packetClass) { + return packetClass.getName().endsWith("PacketPlayOutMapChunkBulk"); + } + + @Override + protected void filterPacket(UserConnection info, Object packet, List output) throws Exception { + output.addAll(info.get(ClientChunks.class).transformMapChunkBulk(packet)); + } + @Override public void init(UserConnection userConnection) { // Entity tracker