Mirror von
https://github.com/PaperMC/Velocity.git
synchronisiert 2024-11-17 13:30:17 +01:00
Gracefully fall back for STATUS/HANDSHAKE/LOGIN states
Dieser Commit ist enthalten in:
Ursprung
cc1d8f8184
Commit
8c4d710725
@ -3,7 +3,6 @@ package com.velocitypowered.proxy.protocol;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
public enum ProtocolConstants { ;
|
public enum ProtocolConstants { ;
|
||||||
public static final int MINECRAFT_1_7_2 = 4;
|
|
||||||
public static final int MINECRAFT_1_9 = 107;
|
public static final int MINECRAFT_1_9 = 107;
|
||||||
public static final int MINECRAFT_1_9_1 = 108;
|
public static final int MINECRAFT_1_9_1 = 108;
|
||||||
public static final int MINECRAFT_1_9_2 = 109;
|
public static final int MINECRAFT_1_9_2 = 109;
|
||||||
@ -15,7 +14,6 @@ public enum ProtocolConstants { ;
|
|||||||
public static final int MINECRAFT_1_12_1 = 338;
|
public static final int MINECRAFT_1_12_1 = 338;
|
||||||
public static final int MINECRAFT_1_12_2 = 340;
|
public static final int MINECRAFT_1_12_2 = 340;
|
||||||
|
|
||||||
public static final int MINIMUM_VERSION_SUPPORTED = MINECRAFT_1_9;
|
|
||||||
public static final int MINIMUM_GENERIC_VERSION = MINECRAFT_1_9;
|
public static final int MINIMUM_GENERIC_VERSION = MINECRAFT_1_9;
|
||||||
|
|
||||||
public static final int[] SUPPORTED_VERSIONS = new int[] {
|
public static final int[] SUPPORTED_VERSIONS = new int[] {
|
||||||
|
@ -106,8 +106,8 @@ public enum StateRegistry {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public final PacketRegistry CLIENTBOUND = new PacketRegistry(ProtocolConstants.Direction.CLIENTBOUND);
|
public final PacketRegistry CLIENTBOUND = new PacketRegistry(ProtocolConstants.Direction.CLIENTBOUND, this);
|
||||||
public final PacketRegistry SERVERBOUND = new PacketRegistry(ProtocolConstants.Direction.SERVERBOUND);
|
public final PacketRegistry SERVERBOUND = new PacketRegistry(ProtocolConstants.Direction.SERVERBOUND, this);
|
||||||
|
|
||||||
public static class PacketRegistry {
|
public static class PacketRegistry {
|
||||||
private static final IntObjectMap<int[]> LINKED_PROTOCOL_VERSIONS = new IntObjectHashMap<>();
|
private static final IntObjectMap<int[]> LINKED_PROTOCOL_VERSIONS = new IntObjectHashMap<>();
|
||||||
@ -120,10 +120,12 @@ public enum StateRegistry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private final ProtocolConstants.Direction direction;
|
private final ProtocolConstants.Direction direction;
|
||||||
|
private final StateRegistry state;
|
||||||
private final IntObjectMap<ProtocolVersion> versions = new IntObjectHashMap<>();
|
private final IntObjectMap<ProtocolVersion> versions = new IntObjectHashMap<>();
|
||||||
|
|
||||||
public PacketRegistry(ProtocolConstants.Direction direction) {
|
public PacketRegistry(Direction direction, StateRegistry state) {
|
||||||
this.direction = direction;
|
this.direction = direction;
|
||||||
|
this.state = state;
|
||||||
for (int version : ProtocolConstants.SUPPORTED_VERSIONS) {
|
for (int version : ProtocolConstants.SUPPORTED_VERSIONS) {
|
||||||
versions.put(version, new ProtocolVersion(version));
|
versions.put(version, new ProtocolVersion(version));
|
||||||
}
|
}
|
||||||
@ -133,6 +135,9 @@ public enum StateRegistry {
|
|||||||
public ProtocolVersion getVersion(final int version) {
|
public ProtocolVersion getVersion(final int version) {
|
||||||
ProtocolVersion result = versions.get(version);
|
ProtocolVersion result = versions.get(version);
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
|
if (state != PLAY) {
|
||||||
|
return getVersion(MINIMUM_GENERIC_VERSION);
|
||||||
|
}
|
||||||
throw new IllegalArgumentException("Could not find data for protocol version " + version);
|
throw new IllegalArgumentException("Could not find data for protocol version " + version);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.velocitypowered.proxy.protocol;
|
package com.velocitypowered.proxy.protocol;
|
||||||
|
|
||||||
import com.velocitypowered.proxy.protocol.packets.Handshake;
|
import com.velocitypowered.proxy.protocol.packets.Handshake;
|
||||||
import com.velocitypowered.proxy.protocol.packets.KeepAlive;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static com.velocitypowered.proxy.protocol.ProtocolConstants.MINECRAFT_1_12;
|
import static com.velocitypowered.proxy.protocol.ProtocolConstants.MINECRAFT_1_12;
|
||||||
@ -11,7 +10,7 @@ import static org.junit.jupiter.api.Assertions.*;
|
|||||||
|
|
||||||
class PacketRegistryTest {
|
class PacketRegistryTest {
|
||||||
private StateRegistry.PacketRegistry setupRegistry() {
|
private StateRegistry.PacketRegistry setupRegistry() {
|
||||||
StateRegistry.PacketRegistry registry = new StateRegistry.PacketRegistry(ProtocolConstants.Direction.CLIENTBOUND);
|
StateRegistry.PacketRegistry registry = new StateRegistry.PacketRegistry(ProtocolConstants.Direction.CLIENTBOUND, StateRegistry.HANDSHAKE);
|
||||||
registry.register(Handshake.class, Handshake::new, new StateRegistry.PacketMapping(0x00, MINECRAFT_1_12));
|
registry.register(Handshake.class, Handshake::new, new StateRegistry.PacketMapping(0x00, MINECRAFT_1_12));
|
||||||
return registry;
|
return registry;
|
||||||
}
|
}
|
||||||
@ -37,14 +36,14 @@ class PacketRegistryTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void failOnNoMappings() {
|
void failOnNoMappings() {
|
||||||
StateRegistry.PacketRegistry registry = new StateRegistry.PacketRegistry(ProtocolConstants.Direction.CLIENTBOUND);
|
StateRegistry.PacketRegistry registry = new StateRegistry.PacketRegistry(ProtocolConstants.Direction.CLIENTBOUND, StateRegistry.HANDSHAKE);
|
||||||
assertThrows(IllegalArgumentException.class, () -> registry.register(Handshake.class, Handshake::new));
|
assertThrows(IllegalArgumentException.class, () -> registry.register(Handshake.class, Handshake::new));
|
||||||
assertThrows(IllegalArgumentException.class, () -> registry.getVersion(0).getPacketId(new Handshake()));
|
assertThrows(IllegalArgumentException.class, () -> registry.getVersion(0).getPacketId(new Handshake()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void registrySuppliesCorrectPacketsByProtocol() {
|
void registrySuppliesCorrectPacketsByProtocol() {
|
||||||
StateRegistry.PacketRegistry registry = new StateRegistry.PacketRegistry(ProtocolConstants.Direction.CLIENTBOUND);
|
StateRegistry.PacketRegistry registry = new StateRegistry.PacketRegistry(ProtocolConstants.Direction.CLIENTBOUND, StateRegistry.HANDSHAKE);
|
||||||
registry.register(Handshake.class, Handshake::new, new StateRegistry.PacketMapping(0x00, MINECRAFT_1_12),
|
registry.register(Handshake.class, Handshake::new, new StateRegistry.PacketMapping(0x00, MINECRAFT_1_12),
|
||||||
new StateRegistry.PacketMapping(0x01, MINECRAFT_1_12_1));
|
new StateRegistry.PacketMapping(0x01, MINECRAFT_1_12_1));
|
||||||
assertEquals(Handshake.class, registry.getVersion(MINECRAFT_1_12).createPacket(0x00).getClass());
|
assertEquals(Handshake.class, registry.getVersion(MINECRAFT_1_12).createPacket(0x00).getClass());
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren