Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-12-27 00:22:51 +01:00
Add more API for base protocols and skip manually added ones. (#4115)
Dieser Commit ist enthalten in:
Ursprung
b586b0d361
Commit
b2d523f5c0
@ -24,9 +24,10 @@ import java.util.Comparator;
|
|||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A {@link ProtocolVersion} with the version type {@link VersionType#SPECIAL} that compares equal to the given
|
* Intended API class for protocol versions with the version type {@link VersionType#SPECIAL}.
|
||||||
* origin version. The origin version will also be used in {@link com.viaversion.viaversion.protocols.base.InitialBaseProtocol}
|
* <p>
|
||||||
* to determine the correct base protocol.
|
* Compares equal to the given origin version and allows base protocol determination via {@link #getBaseProtocolVersion()}
|
||||||
|
* which can be null for special cases where there is no base protocol.
|
||||||
*/
|
*/
|
||||||
public class RedirectProtocolVersion extends ProtocolVersion {
|
public class RedirectProtocolVersion extends ProtocolVersion {
|
||||||
|
|
||||||
@ -56,4 +57,11 @@ public class RedirectProtocolVersion extends ProtocolVersion {
|
|||||||
public ProtocolVersion getOrigin() {
|
public ProtocolVersion getOrigin() {
|
||||||
return origin;
|
return origin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the protocol version used to determine the base protocol, null in case there is no base protocol.
|
||||||
|
*/
|
||||||
|
public @Nullable ProtocolVersion getBaseProtocolVersion() {
|
||||||
|
return origin;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -96,17 +96,22 @@ public class InitialBaseProtocol extends AbstractProtocol<BaseClientboundPacket,
|
|||||||
ProtocolManager protocolManager = Via.getManager().getProtocolManager();
|
ProtocolManager protocolManager = Via.getManager().getProtocolManager();
|
||||||
List<ProtocolPathEntry> protocolPath = protocolManager.getProtocolPath(info.protocolVersion(), serverProtocol);
|
List<ProtocolPathEntry> protocolPath = protocolManager.getProtocolPath(info.protocolVersion(), serverProtocol);
|
||||||
|
|
||||||
// Add Base Protocol
|
|
||||||
ProtocolPipeline pipeline = info.getPipeline();
|
ProtocolPipeline pipeline = info.getPipeline();
|
||||||
|
|
||||||
// Special versions might compare equal to normal versions and would break this getter,
|
// Save manually added protocols for later
|
||||||
// platforms either need to use the RedirectProtocolVersion API or add the base protocols manually
|
List<Protocol> alreadyAdded = new ArrayList<>(pipeline.pipes());
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
ProtocolVersion baseProtocolVersion = null;
|
||||||
if (serverProtocol.getVersionType() != VersionType.SPECIAL) {
|
if (serverProtocol.getVersionType() != VersionType.SPECIAL) {
|
||||||
for (final Protocol protocol : protocolManager.getBaseProtocols(serverProtocol)) {
|
baseProtocolVersion = serverProtocol;
|
||||||
pipeline.add(protocol);
|
|
||||||
}
|
|
||||||
} else if (serverProtocol instanceof RedirectProtocolVersion version) {
|
} else if (serverProtocol instanceof RedirectProtocolVersion version) {
|
||||||
for (final Protocol protocol : protocolManager.getBaseProtocols(version.getOrigin())) {
|
baseProtocolVersion = version.getBaseProtocolVersion();
|
||||||
|
}
|
||||||
|
if (baseProtocolVersion != null) {
|
||||||
|
// Add base protocols
|
||||||
|
for (final Protocol protocol : protocolManager.getBaseProtocols(baseProtocolVersion)) {
|
||||||
pipeline.add(protocol);
|
pipeline.add(protocol);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -131,7 +136,7 @@ public class InitialBaseProtocol extends AbstractProtocol<BaseClientboundPacket,
|
|||||||
// Send client intention into the pipeline in case protocols down the line need to transform it
|
// Send client intention into the pipeline in case protocols down the line need to transform it
|
||||||
try {
|
try {
|
||||||
final List<Protocol> protocols = new ArrayList<>(pipeline.pipes());
|
final List<Protocol> protocols = new ArrayList<>(pipeline.pipes());
|
||||||
protocols.remove(this);
|
protocols.removeAll(alreadyAdded); // Skip all manually added protocols to prevent double handling
|
||||||
wrapper.apply(Direction.SERVERBOUND, State.HANDSHAKE, protocols);
|
wrapper.apply(Direction.SERVERBOUND, State.HANDSHAKE, protocols);
|
||||||
} catch (CancelException e) {
|
} catch (CancelException e) {
|
||||||
wrapper.cancel();
|
wrapper.cancel();
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren