Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-11-16 04:50:08 +01:00
Split base protocols list (#4118)
Dieser Commit ist enthalten in:
Ursprung
33de12ceb1
Commit
7edddda36e
@ -25,6 +25,7 @@ package com.viaversion.viaversion.api.protocol;
|
|||||||
import com.google.common.collect.Range;
|
import com.google.common.collect.Range;
|
||||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||||
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
|
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.PacketType;
|
||||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||||
import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType;
|
import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType;
|
||||||
@ -73,13 +74,14 @@ public interface ProtocolManager {
|
|||||||
Protocol getBaseProtocol();
|
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.
|
* The standard base protocols deal with status and login packets for userconnection initialization.
|
||||||
*
|
*
|
||||||
|
* @param clientVersion client protocol version
|
||||||
* @param serverVersion server 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<Protocol> getBaseProtocols(ProtocolVersion serverVersion);
|
List<Protocol> getBaseProtocols(@Nullable ProtocolVersion clientVersion, @Nullable ProtocolVersion serverVersion);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an immutable collection of registered protocols.
|
* 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.
|
* Registers and initializes a base protocol. Base Protocols registered later have higher priority.
|
||||||
* Only base protocol will always be added to pipeline.
|
* Only base protocol will always be added to pipeline.
|
||||||
*
|
*
|
||||||
|
* @param direction direction of the base protocol
|
||||||
* @param baseProtocol base protocol to register
|
* @param baseProtocol base protocol to register
|
||||||
* @param supportedProtocols protocol versions supported by the base protocol
|
* @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()}
|
* @throws IllegalArgumentException if the protocol is not a base protocol as given by {@link Protocol#isBaseProtocol()}
|
||||||
*/
|
*/
|
||||||
void registerBaseProtocol(Protocol baseProtocol, Range<ProtocolVersion> supportedProtocols);
|
void registerBaseProtocol(Direction direction, Protocol baseProtocol, Range<ProtocolVersion> supportedProtocols);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculates and returns the protocol path from a client protocol version to server protocol version.
|
* Calculates and returns the protocol path from a client protocol version to server protocol version.
|
||||||
|
@ -29,6 +29,7 @@ import com.viaversion.viaversion.api.protocol.ProtocolManager;
|
|||||||
import com.viaversion.viaversion.api.protocol.ProtocolPathEntry;
|
import com.viaversion.viaversion.api.protocol.ProtocolPathEntry;
|
||||||
import com.viaversion.viaversion.api.protocol.ProtocolPathKey;
|
import com.viaversion.viaversion.api.protocol.ProtocolPathKey;
|
||||||
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
|
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.PacketType;
|
||||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||||
import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType;
|
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.InitialBaseProtocol;
|
||||||
import com.viaversion.viaversion.protocols.base.v1_7.ClientboundBaseProtocol1_7;
|
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.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_10to1_11.Protocol1_10To1_11;
|
||||||
import com.viaversion.viaversion.protocols.v1_11_1to1_12.Protocol1_11_1To1_12;
|
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;
|
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_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_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_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_20to1_20_2.Protocol1_20To1_20_2;
|
||||||
import com.viaversion.viaversion.protocols.v1_8to1_9.Protocol1_8To1_9;
|
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;
|
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<Class<? extends Protocol>, Protocol<?, ?, ?, ?>> protocols = new HashMap<>(64);
|
private final Map<Class<? extends Protocol>, Protocol<?, ?, ?, ?>> protocols = new HashMap<>(64);
|
||||||
private final Map<ProtocolPathKey, List<ProtocolPathEntry>> pathCache = new ConcurrentHashMap<>();
|
private final Map<ProtocolPathKey, List<ProtocolPathEntry>> pathCache = new ConcurrentHashMap<>();
|
||||||
private final Set<ProtocolVersion> supportedVersions = new HashSet<>();
|
private final Set<ProtocolVersion> supportedVersions = new HashSet<>();
|
||||||
private final List<Pair<Range<ProtocolVersion>, Protocol>> baseProtocols = Lists.newCopyOnWriteArrayList();
|
private final List<Pair<Range<ProtocolVersion>, Protocol>> serverboundBaseProtocols = Lists.newCopyOnWriteArrayList();
|
||||||
|
private final List<Pair<Range<ProtocolVersion>, Protocol>> clientboundBaseProtocols = Lists.newCopyOnWriteArrayList();
|
||||||
|
|
||||||
private final ReadWriteLock mappingLoaderLock = new ReentrantReadWriteLock();
|
private final ReadWriteLock mappingLoaderLock = new ReentrantReadWriteLock();
|
||||||
private Map<Class<? extends Protocol>, CompletableFuture<Void>> mappingLoaderFutures = new HashMap<>();
|
private Map<Class<? extends Protocol>, CompletableFuture<Void>> mappingLoaderFutures = new HashMap<>();
|
||||||
@ -137,8 +139,8 @@ public class ProtocolManagerImpl implements ProtocolManager {
|
|||||||
// Base Protocol
|
// Base Protocol
|
||||||
BASE_PROTOCOL.initialize();
|
BASE_PROTOCOL.initialize();
|
||||||
BASE_PROTOCOL.register(Via.getManager().getProviders());
|
BASE_PROTOCOL.register(Via.getManager().getProviders());
|
||||||
registerBaseProtocol(new ClientboundBaseProtocol1_7(), Range.atLeast(ProtocolVersion.v1_7_2));
|
registerBaseProtocol(Direction.CLIENTBOUND, new ClientboundBaseProtocol1_7(), Range.atLeast(ProtocolVersion.v1_7_2));
|
||||||
registerBaseProtocol(new ServerboundBaseProtocol1_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_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);
|
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
|
@Override
|
||||||
public void registerBaseProtocol(Protocol baseProtocol, Range<ProtocolVersion> supportedProtocols) {
|
public void registerBaseProtocol(Direction direction, Protocol baseProtocol, Range<ProtocolVersion> supportedProtocols) {
|
||||||
Preconditions.checkArgument(baseProtocol.isBaseProtocol(), "Protocol is not a base protocol");
|
Preconditions.checkArgument(baseProtocol.isBaseProtocol(), "Protocol is not a base protocol");
|
||||||
final ProtocolVersion lower = supportedProtocols.hasLowerBound() ? supportedProtocols.lowerEndpoint() : null;
|
final ProtocolVersion lower = supportedProtocols.hasLowerBound() ? supportedProtocols.lowerEndpoint() : null;
|
||||||
final ProtocolVersion upper = supportedProtocols.hasUpperBound() ? supportedProtocols.upperEndpoint() : null;
|
final ProtocolVersion upper = supportedProtocols.hasUpperBound() ? supportedProtocols.upperEndpoint() : null;
|
||||||
@ -243,7 +245,11 @@ public class ProtocolManagerImpl implements ProtocolManager {
|
|||||||
|
|
||||||
baseProtocol.initialize();
|
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());
|
baseProtocol.register(Via.getManager().getProviders());
|
||||||
if (Via.getManager().isInitialized()) {
|
if (Via.getManager().isInitialized()) {
|
||||||
refreshVersions();
|
refreshVersions();
|
||||||
@ -365,11 +371,20 @@ public class ProtocolManagerImpl implements ProtocolManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Protocol> getBaseProtocols(ProtocolVersion serverVersion) {
|
public List<Protocol> getBaseProtocols(@Nullable ProtocolVersion clientVersion, @Nullable ProtocolVersion serverVersion) {
|
||||||
final List<Protocol> list = new ArrayList<>();
|
final List<Protocol> list = new ArrayList<>();
|
||||||
for (Pair<Range<ProtocolVersion>, Protocol> rangeProtocol : Lists.reverse(baseProtocols)) {
|
if (clientVersion != null) {
|
||||||
if (rangeProtocol.key().contains(serverVersion)) {
|
for (Pair<Range<ProtocolVersion>, Protocol> rangeProtocol : Lists.reverse(serverboundBaseProtocols)) {
|
||||||
list.add(rangeProtocol.value());
|
if (rangeProtocol.key().contains(clientVersion)) {
|
||||||
|
list.add(rangeProtocol.value());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (serverVersion != null) {
|
||||||
|
for (Pair<Range<ProtocolVersion>, Protocol> rangeProtocol : Lists.reverse(clientboundBaseProtocols)) {
|
||||||
|
if (rangeProtocol.key().contains(serverVersion)) {
|
||||||
|
list.add(rangeProtocol.value());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return list;
|
return list;
|
||||||
|
@ -102,17 +102,15 @@ public class InitialBaseProtocol extends AbstractProtocol<BaseClientboundPacket,
|
|||||||
|
|
||||||
// Special versions might compare equal to normal versions and would the normal lookup,
|
// Special versions might compare equal to normal versions and would the normal lookup,
|
||||||
// platforms can use the RedirectProtocolVersion API or need to manually handle their base protocols.
|
// platforms can use the RedirectProtocolVersion API or need to manually handle their base protocols.
|
||||||
ProtocolVersion baseProtocolVersion = null;
|
ProtocolVersion clientboundBaseProtocolVersion = null;
|
||||||
if (serverProtocol.getVersionType() != VersionType.SPECIAL) {
|
if (serverProtocol.getVersionType() != VersionType.SPECIAL) {
|
||||||
baseProtocolVersion = serverProtocol;
|
clientboundBaseProtocolVersion = serverProtocol;
|
||||||
} else if (serverProtocol instanceof RedirectProtocolVersion version) {
|
} else if (serverProtocol instanceof RedirectProtocolVersion version) {
|
||||||
baseProtocolVersion = version.getBaseProtocolVersion();
|
clientboundBaseProtocolVersion = version.getBaseProtocolVersion();
|
||||||
}
|
}
|
||||||
if (baseProtocolVersion != null) {
|
// Add base protocols
|
||||||
// Add base protocols
|
for (final Protocol protocol : protocolManager.getBaseProtocols(info.protocolVersion(), clientboundBaseProtocolVersion)) {
|
||||||
for (final Protocol protocol : protocolManager.getBaseProtocols(baseProtocolVersion)) {
|
pipeline.add(protocol);
|
||||||
pipeline.add(protocol);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add other protocols
|
// Add other protocols
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren