3
0
Mirror von https://github.com/PaperMC/Velocity.git synchronisiert 2024-11-17 05:20:14 +01:00

Gracefully fall back for STATUS/HANDSHAKE/LOGIN states

Dieser Commit ist enthalten in:
Andrew Steinborn 2018-07-30 21:35:11 -04:00
Ursprung cc1d8f8184
Commit 8c4d710725
3 geänderte Dateien mit 11 neuen und 9 gelöschten Zeilen

Datei anzeigen

@ -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[] {

Datei anzeigen

@ -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;

Datei anzeigen

@ -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());