From 7edddda36e92654be6a0422156f26ed49af5a97b Mon Sep 17 00:00:00 2001 From: RK_01 <50594595+RaphiMC@users.noreply.github.com> Date: Fri, 23 Aug 2024 14:09:14 +0200 Subject: [PATCH] Split base protocols list (#4118) --- .../api/protocol/ProtocolManager.java | 11 +++--- .../protocol/ProtocolManagerImpl.java | 35 +++++++++++++------ .../protocols/base/InitialBaseProtocol.java | 14 ++++---- 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/api/src/main/java/com/viaversion/viaversion/api/protocol/ProtocolManager.java b/api/src/main/java/com/viaversion/viaversion/api/protocol/ProtocolManager.java index 51a6c68c3..be22239b3 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/protocol/ProtocolManager.java +++ b/api/src/main/java/com/viaversion/viaversion/api/protocol/ProtocolManager.java @@ -25,6 +25,7 @@ package com.viaversion.viaversion.api.protocol; import com.google.common.collect.Range; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; +import com.viaversion.viaversion.api.protocol.packet.Direction; import com.viaversion.viaversion.api.protocol.packet.PacketType; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType; @@ -73,13 +74,14 @@ public interface ProtocolManager { Protocol getBaseProtocol(); /** - * Returns the base protocols for a specific server protocol version. + * Returns the base protocols for a specific server and client protocol version. * The standard base protocols deal with status and login packets for userconnection initialization. * + * @param clientVersion client protocol version * @param serverVersion server protocol version - * @return base protocols for the given server protocol version if present, else null + * @return base protocols for the given server and client protocol version */ - List getBaseProtocols(ProtocolVersion serverVersion); + List getBaseProtocols(@Nullable ProtocolVersion clientVersion, @Nullable ProtocolVersion serverVersion); /** * Returns an immutable collection of registered protocols. @@ -120,11 +122,12 @@ public interface ProtocolManager { * Registers and initializes a base protocol. Base Protocols registered later have higher priority. * Only base protocol will always be added to pipeline. * + * @param direction direction of the base protocol * @param baseProtocol base protocol to register * @param supportedProtocols protocol versions supported by the base protocol * @throws IllegalArgumentException if the protocol is not a base protocol as given by {@link Protocol#isBaseProtocol()} */ - void registerBaseProtocol(Protocol baseProtocol, Range supportedProtocols); + void registerBaseProtocol(Direction direction, Protocol baseProtocol, Range supportedProtocols); /** * Calculates and returns the protocol path from a client protocol version to server protocol version. diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolManagerImpl.java b/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolManagerImpl.java index f9aa1ba95..4584fc57f 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolManagerImpl.java +++ b/common/src/main/java/com/viaversion/viaversion/protocol/ProtocolManagerImpl.java @@ -29,6 +29,7 @@ import com.viaversion.viaversion.api.protocol.ProtocolManager; import com.viaversion.viaversion.api.protocol.ProtocolPathEntry; import com.viaversion.viaversion.api.protocol.ProtocolPathKey; import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; +import com.viaversion.viaversion.api.protocol.packet.Direction; import com.viaversion.viaversion.api.protocol.packet.PacketType; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType; @@ -41,7 +42,6 @@ import com.viaversion.viaversion.protocol.packet.VersionedPacketTransformerImpl; import com.viaversion.viaversion.protocols.base.InitialBaseProtocol; import com.viaversion.viaversion.protocols.base.v1_7.ClientboundBaseProtocol1_7; import com.viaversion.viaversion.protocols.base.v1_7.ServerboundBaseProtocol1_7; -import com.viaversion.viaversion.protocols.v1_20_5to1_21.Protocol1_20_5To1_21; import com.viaversion.viaversion.protocols.v1_10to1_11.Protocol1_10To1_11; import com.viaversion.viaversion.protocols.v1_11_1to1_12.Protocol1_11_1To1_12; import com.viaversion.viaversion.protocols.v1_11to1_11_1.Protocol1_11To1_11_1; @@ -74,6 +74,7 @@ import com.viaversion.viaversion.protocols.v1_19_4to1_20.Protocol1_19_4To1_20; import com.viaversion.viaversion.protocols.v1_19to1_19_1.Protocol1_19To1_19_1; import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.Protocol1_20_2To1_20_3; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.Protocol1_20_3To1_20_5; +import com.viaversion.viaversion.protocols.v1_20_5to1_21.Protocol1_20_5To1_21; import com.viaversion.viaversion.protocols.v1_20to1_20_2.Protocol1_20To1_20_2; import com.viaversion.viaversion.protocols.v1_8to1_9.Protocol1_8To1_9; import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.Protocol1_9_1To1_9_3; @@ -116,7 +117,8 @@ public class ProtocolManagerImpl implements ProtocolManager { private final Map, Protocol> protocols = new HashMap<>(64); private final Map> pathCache = new ConcurrentHashMap<>(); private final Set supportedVersions = new HashSet<>(); - private final List, Protocol>> baseProtocols = Lists.newCopyOnWriteArrayList(); + private final List, Protocol>> serverboundBaseProtocols = Lists.newCopyOnWriteArrayList(); + private final List, Protocol>> clientboundBaseProtocols = Lists.newCopyOnWriteArrayList(); private final ReadWriteLock mappingLoaderLock = new ReentrantReadWriteLock(); private Map, CompletableFuture> mappingLoaderFutures = new HashMap<>(); @@ -137,8 +139,8 @@ public class ProtocolManagerImpl implements ProtocolManager { // Base Protocol BASE_PROTOCOL.initialize(); BASE_PROTOCOL.register(Via.getManager().getProviders()); - registerBaseProtocol(new ClientboundBaseProtocol1_7(), Range.atLeast(ProtocolVersion.v1_7_2)); - registerBaseProtocol(new ServerboundBaseProtocol1_7(), Range.atLeast(ProtocolVersion.v1_7_2)); + registerBaseProtocol(Direction.CLIENTBOUND, new ClientboundBaseProtocol1_7(), Range.atLeast(ProtocolVersion.v1_7_2)); + registerBaseProtocol(Direction.SERVERBOUND, new ServerboundBaseProtocol1_7(), Range.atLeast(ProtocolVersion.v1_7_2)); registerProtocol(new Protocol1_8To1_9(), ProtocolVersion.v1_9, ProtocolVersion.v1_8); registerProtocol(new Protocol1_9To1_9_1(), Arrays.asList(ProtocolVersion.v1_9_1, ProtocolVersion.v1_9_2), ProtocolVersion.v1_9); @@ -234,7 +236,7 @@ public class ProtocolManagerImpl implements ProtocolManager { } @Override - public void registerBaseProtocol(Protocol baseProtocol, Range supportedProtocols) { + public void registerBaseProtocol(Direction direction, Protocol baseProtocol, Range supportedProtocols) { Preconditions.checkArgument(baseProtocol.isBaseProtocol(), "Protocol is not a base protocol"); final ProtocolVersion lower = supportedProtocols.hasLowerBound() ? supportedProtocols.lowerEndpoint() : null; final ProtocolVersion upper = supportedProtocols.hasUpperBound() ? supportedProtocols.upperEndpoint() : null; @@ -243,7 +245,11 @@ public class ProtocolManagerImpl implements ProtocolManager { baseProtocol.initialize(); - baseProtocols.add(new Pair<>(supportedProtocols, baseProtocol)); + if (direction == Direction.SERVERBOUND) { + serverboundBaseProtocols.add(new Pair<>(supportedProtocols, baseProtocol)); + } else { + clientboundBaseProtocols.add(new Pair<>(supportedProtocols, baseProtocol)); + } baseProtocol.register(Via.getManager().getProviders()); if (Via.getManager().isInitialized()) { refreshVersions(); @@ -365,11 +371,20 @@ public class ProtocolManagerImpl implements ProtocolManager { } @Override - public List getBaseProtocols(ProtocolVersion serverVersion) { + public List getBaseProtocols(@Nullable ProtocolVersion clientVersion, @Nullable ProtocolVersion serverVersion) { final List list = new ArrayList<>(); - for (Pair, Protocol> rangeProtocol : Lists.reverse(baseProtocols)) { - if (rangeProtocol.key().contains(serverVersion)) { - list.add(rangeProtocol.value()); + if (clientVersion != null) { + for (Pair, Protocol> rangeProtocol : Lists.reverse(serverboundBaseProtocols)) { + if (rangeProtocol.key().contains(clientVersion)) { + list.add(rangeProtocol.value()); + } + } + } + if (serverVersion != null) { + for (Pair, Protocol> rangeProtocol : Lists.reverse(clientboundBaseProtocols)) { + if (rangeProtocol.key().contains(serverVersion)) { + list.add(rangeProtocol.value()); + } } } return list; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/base/InitialBaseProtocol.java b/common/src/main/java/com/viaversion/viaversion/protocols/base/InitialBaseProtocol.java index 2c990c75c..eea31207e 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/base/InitialBaseProtocol.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/base/InitialBaseProtocol.java @@ -102,17 +102,15 @@ public class InitialBaseProtocol extends AbstractProtocol