diff --git a/api/src/main/java/com/viaversion/viaversion/api/protocol/Protocol.java b/api/src/main/java/com/viaversion/viaversion/api/protocol/Protocol.java index 72d8cb7e0..5af7666e3 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/protocol/Protocol.java +++ b/api/src/main/java/com/viaversion/viaversion/api/protocol/Protocol.java @@ -24,8 +24,6 @@ package com.viaversion.viaversion.api.protocol; import com.google.common.base.Preconditions; import com.viaversion.viaversion.api.Via; -import com.viaversion.viaversion.api.connection.UserConnection; -import com.viaversion.viaversion.api.platform.providers.ViaProviders; import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; import com.viaversion.viaversion.api.protocol.packet.Direction; import com.viaversion.viaversion.api.protocol.packet.PacketType; @@ -39,7 +37,6 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.logging.Level; @@ -127,11 +124,6 @@ public abstract class Protocol protocols); /** - * Check if the pipeline contains a protocol + * Returns whether the protocol is in this pipeline. * - * @param pipeClass The class to check - * @return True if the protocol class is in the pipeline + * @param protocolClass protocol class + * @return whether the protocol class is in this pipeline */ - boolean contains(Class pipeClass); + boolean contains(Class protocolClass); /** * Returns the protocol from the given class if present in the pipeline. @@ -62,20 +62,10 @@ public interface ProtocolPipeline extends SimpleProtocol { * @param

protocol * @return protocol from class * @see #contains(Class) - * @see ProtocolManager#getProtocol(Class) for a faster alternative + * @see ProtocolManager#getProtocol(Class) for a faster implementation */ @Nullable

P getProtocol(Class

pipeClass); - /** - * Use the pipeline to filter a NMS packet - * - * @param o The NMS packet object - * @param list The output list to write to - * @return If it should not write the input object to te list. - * @throws Exception If it failed to convert / packet cancelld. - */ - boolean filter(Object o, List list) throws Exception; - /** * Returns the list of protocols this pipeline contains. * @@ -83,6 +73,13 @@ public interface ProtocolPipeline extends SimpleProtocol { */ List pipes(); + /** + * Returns whether this pipe has protocols that are not base protocols, as given by {@link Protocol#isBaseProtocol()}. + * + * @return whether this pipe has protocols that are not base protocols + */ + boolean hasNonBaseProtocols(); + /** * Cleans the pipe and adds the base protocol. * /!\ WARNING - It doesn't add version-specific base Protocol. diff --git a/api/src/main/java/com/viaversion/viaversion/api/protocol/base/Protocol.java b/api/src/main/java/com/viaversion/viaversion/api/protocol/base/Protocol.java index 773944f50..f7a55e25f 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/protocol/base/Protocol.java +++ b/api/src/main/java/com/viaversion/viaversion/api/protocol/base/Protocol.java @@ -25,7 +25,6 @@ package com.viaversion.viaversion.api.protocol.base; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.data.MappingData; import com.viaversion.viaversion.api.platform.providers.ViaProviders; -import com.viaversion.viaversion.api.protocol.AbstractSimpleProtocol; import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; import com.viaversion.viaversion.api.protocol.packet.Direction; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; @@ -34,8 +33,6 @@ import com.viaversion.viaversion.api.protocol.packet.State; import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - /** * Abstract protocol class handling packet transformation between two protocol versions. * Clientbound and serverbount packet types can be set to enforce correct usage of them. @@ -44,55 +41,10 @@ import java.util.List; * @param new clientbound packet types * @param old serverbound packet types * @param new serverbound packet types - * @see AbstractSimpleProtocol for a helper class if you do not want to define any of the types above + * @see SimpleProtocol for a helper class if you do not want to define any of the types above */ public interface Protocol { - /** - * Should this protocol filter an object packet from this class. - * Default: false - * - * @param packetClass The class of the current input - * @return True if it should handle the filtering - */ - default boolean isFiltered(Class packetClass) { - return false; - } - - /** - * Filter a packet into the output - * - * @param info The current user connection - * @param packet The input packet as an object (NMS) - * @param output The list to put the object into. - * @throws Exception Throws exception if cancelled / error. - */ - void filterPacket(UserConnection info, Object packet, List output) throws Exception; - - /** - * Loads the mappingdata. - */ - void loadMappingData(); - - /** - * Handle protocol registration phase, use this to register providers / tasks. - *

- * To be overridden if needed. - * - * @param providers The current providers - */ - void register(ViaProviders providers); - - /** - * Initialise a user for this protocol setting up objects. - * /!\ WARNING - May be called more than once in a single {@link UserConnection} - *

- * To be overridden if needed. - * - * @param userConnection The user to initialise - */ - void init(UserConnection userConnection); - /** * Register an incoming packet, with simple id transformation. * @@ -100,7 +52,9 @@ public interface Protocol type + * @return object if present, else null + */ @Nullable T get(Class objectClass); + /** + * Caches an object, retrievable by using {@link #get(Class)}. + * + * @param object object to cache + */ void put(Object object); /** @@ -232,6 +220,39 @@ public interface Protocol + * To be overridden if needed. + * + * @param providers The current providers + */ + default void register(ViaProviders providers) { + } + + /** + * Initialise a user for this protocol setting up objects. + * /!\ WARNING - May be called more than once in a single {@link UserConnection} + *

+ * To be overridden if needed. + * + * @param userConnection The user to initialise + */ + default void init(UserConnection userConnection) { + } + + /** + * Returns the protocol's mapping data if present. + * + * @return mapping data if present + */ default @Nullable MappingData getMappingData() { return null; } diff --git a/bukkit/src/main/java/com/viaversion/viaversion/bukkit/handlers/BukkitPacketHandler.java b/bukkit/src/main/java/com/viaversion/viaversion/bukkit/handlers/BukkitPacketHandler.java index 26703ee24..40efe4391 100644 --- a/bukkit/src/main/java/com/viaversion/viaversion/bukkit/handlers/BukkitPacketHandler.java +++ b/bukkit/src/main/java/com/viaversion/viaversion/bukkit/handlers/BukkitPacketHandler.java @@ -17,7 +17,9 @@ */ package com.viaversion.viaversion.bukkit.handlers; +import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.protocols.protocol1_9to1_8.Protocol1_9To1_8; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageEncoder; @@ -39,13 +41,23 @@ public class BukkitPacketHandler extends MessageToMessageEncoder { if (!(o instanceof ByteBuf)) { info.getPacketTracker().setLastPacket(o); /* This transformer is more for fixing issues which we find hard at packet level :) */ - if (info.isActive()) { - if (info.getProtocolInfo().getPipeline().filter(o, list)) { - return; - } + if (info.isActive() && filter(o, list)) { + return; } } list.add(o); } + + @Deprecated + public boolean filter(Object o, List list) throws Exception { + if (info.getProtocolInfo().getPipeline().contains(Protocol1_9To1_8.class)) { + Protocol1_9To1_8 protocol = Via.getManager().getProtocolManager().getProtocol(Protocol1_9To1_8.class); + if (protocol.isFiltered(o.getClass())) { + protocol.filterPacket(info, o, list); + return true; + } + } + return false; + } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolPipelineImpl.java b/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolPipelineImpl.java index d91a1e044..e78a00342 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolPipelineImpl.java +++ b/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolPipelineImpl.java @@ -22,7 +22,7 @@ */ package com.viaversion.viaversion.protocol; -import com.google.common.base.Preconditions; +import com.google.common.collect.Sets; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.platform.ViaPlatform; @@ -36,6 +36,8 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.util.ArrayList; import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Level; @@ -45,6 +47,7 @@ public class ProtocolPipelineImpl extends AbstractSimpleProtocol implements Prot * Protocol list ordered from client to server transforation with the base protocols at the end. */ private List protocolList; + private Set> protocolSet; public ProtocolPipelineImpl(UserConnection userConnection) { this.userConnection = userConnection; @@ -54,8 +57,13 @@ public class ProtocolPipelineImpl extends AbstractSimpleProtocol implements Prot @Override protected void registerPackets() { protocolList = new CopyOnWriteArrayList<>(); + // Create a backing set for faster contains calls with larger pipes + protocolSet = Sets.newSetFromMap(new ConcurrentHashMap<>()); + // This is a pipeline so we register basic pipes - protocolList.add(Via.getManager().getProtocolManager().getBaseProtocol()); + Protocol baseProtocol = Via.getManager().getProtocolManager().getBaseProtocol(); + protocolList.add(baseProtocol); + protocolSet.add(baseProtocol.getClass()); } @Override @@ -65,9 +73,8 @@ public class ProtocolPipelineImpl extends AbstractSimpleProtocol implements Prot @Override public void add(Protocol protocol) { - Preconditions.checkNotNull(protocolList, "Tried to add protocol too early"); - protocolList.add(protocol); + protocolSet.add(protocol.getClass()); protocol.init(userConnection); if (!protocol.isBaseProtocol()) { @@ -77,11 +84,10 @@ public class ProtocolPipelineImpl extends AbstractSimpleProtocol implements Prot @Override public void add(List protocols) { - Preconditions.checkNotNull(protocolList, "Tried to add protocol too early"); - protocolList.addAll(protocols); for (Protocol protocol : protocols) { protocol.init(userConnection); + this.protocolSet.add(protocol.getClass()); } moveBaseProtocolsToTail(); @@ -142,13 +148,8 @@ public class ProtocolPipelineImpl extends AbstractSimpleProtocol implements Prot } @Override - public boolean contains(Class pipeClass) { - for (Protocol protocol : protocolList) { - if (protocol.getClass() == pipeClass) { - return true; - } - } - return false; + public boolean contains(Class protocolClass) { + return protocolSet.contains(protocolClass); } @Override @@ -162,20 +163,18 @@ public class ProtocolPipelineImpl extends AbstractSimpleProtocol implements Prot } @Override - 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; + public List pipes() { + return protocolList; } @Override - public List pipes() { - return protocolList; + public boolean hasNonBaseProtocols() { + for (Protocol protocol : protocolList) { + if (!protocol.isBaseProtocol()) { + return true; + } + } + return false; } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/base/BaseProtocol1_7.java b/common/src/main/java/com/viaversion/viaversion/protocols/base/BaseProtocol1_7.java index 3e7a89515..1ac552427 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/base/BaseProtocol1_7.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/base/BaseProtocol1_7.java @@ -147,7 +147,7 @@ public class BaseProtocol1_7 extends AbstractSimpleProtocol { // Add to ported clients Via.getManager().getConnectionManager().onLoginSuccess(wrapper.user()); - if (info.getPipeline().pipes().stream().allMatch(Via.getManager().getProtocolManager()::isBaseProtocol)) { // Only base protocol + if (!info.getPipeline().hasNonBaseProtocols()) { // Only base protocol wrapper.user().setActive(false); } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java index ac55564fc..7742eb2fd 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java @@ -147,13 +147,24 @@ public class Protocol1_9To1_8 extends Protocol