diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/objectLoader/versions/Version.java b/src/main/java/de/bixilon/minosoft/game/datatypes/objectLoader/versions/Version.java index fa23e6100..12f71a541 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/objectLoader/versions/Version.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/objectLoader/versions/Version.java @@ -14,16 +14,19 @@ package de.bixilon.minosoft.game.datatypes.objectLoader.versions; import com.google.common.collect.HashBiMap; +import de.bixilon.minosoft.protocol.protocol.ConnectionState; import de.bixilon.minosoft.protocol.protocol.Packets; +import java.util.HashMap; + public class Version { final String versionName; final int protocolVersion; - final HashBiMap serverboundPacketMapping; - final HashBiMap clientboundPacketMapping; + final HashMap> serverboundPacketMapping; + final HashMap> clientboundPacketMapping; VersionMapping mapping; - public Version(String versionName, int protocolVersion, HashBiMap serverboundPacketMapping, HashBiMap clientboundPacketMapping) { + public Version(String versionName, int protocolVersion, HashMap> serverboundPacketMapping, HashMap> clientboundPacketMapping) { this.versionName = versionName; this.protocolVersion = protocolVersion; this.serverboundPacketMapping = serverboundPacketMapping; @@ -38,23 +41,25 @@ public class Version { return protocolVersion; } - public Packets.Clientbound getPacketByCommand(int command) { // state must be play! - return clientboundPacketMapping.inverse().get(command); + public Packets.Clientbound getPacketByCommand(ConnectionState state, int command) { + if (clientboundPacketMapping.containsKey(state) && clientboundPacketMapping.get(state).containsValue(command)) { + return clientboundPacketMapping.get(state).inverse().get(command); + } + return null; } - public int getCommandByPacket(Packets.Serverbound packet) { - return serverboundPacketMapping.get(packet); + public Integer getCommandByPacket(Packets.Serverbound packet) { + if (serverboundPacketMapping.containsKey(packet.getState()) && serverboundPacketMapping.get(packet.getState()).containsKey(packet)) { + return serverboundPacketMapping.get(packet.getState()).get(packet); + } + return null; } - public int getCommandByPacket(Packets.Clientbound packet) { - return clientboundPacketMapping.get(packet); - } - - public HashBiMap getClientboundPacketMapping() { + public HashMap> getClientboundPacketMapping() { return clientboundPacketMapping; } - public HashBiMap getServerboundPacketMapping() { + public HashMap> getServerboundPacketMapping() { return serverboundPacketMapping; } diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/objectLoader/versions/Versions.java b/src/main/java/de/bixilon/minosoft/game/datatypes/objectLoader/versions/Versions.java index 5fd4a828f..4dd5af04d 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/objectLoader/versions/Versions.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/objectLoader/versions/Versions.java @@ -19,6 +19,7 @@ import com.google.gson.JsonObject; import de.bixilon.minosoft.Config; import de.bixilon.minosoft.game.datatypes.Mappings; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.protocol.ConnectionState; import de.bixilon.minosoft.protocol.protocol.Packets; import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition; import de.bixilon.minosoft.util.Util; @@ -60,8 +61,8 @@ public class Versions { return; } - HashBiMap serverboundPacketMapping; - HashBiMap clientboundPacketMapping; + HashMap> serverboundPacketMapping; + HashMap> clientboundPacketMapping; if (versionJson.get("mapping").isJsonPrimitive()) { // inherits or copies mapping from an other version if (!versionMap.containsKey(protocolId)) { @@ -72,16 +73,24 @@ public class Versions { clientboundPacketMapping = parent.getClientboundPacketMapping(); } else { JsonObject mappingJson = versionJson.getAsJsonObject("mapping"); - serverboundPacketMapping = HashBiMap.create(); + serverboundPacketMapping = new HashMap<>(); for (JsonElement packetElement : mappingJson.getAsJsonArray("serverbound")) { String packetName = packetElement.getAsString(); - serverboundPacketMapping.put(Packets.Serverbound.valueOf(packetName), serverboundPacketMapping.size()); + Packets.Serverbound packet = Packets.Serverbound.valueOf(packetName); + if (!serverboundPacketMapping.containsKey(packet.getState())) { + serverboundPacketMapping.put(packet.getState(), HashBiMap.create()); + } + serverboundPacketMapping.get(packet.getState()).put(packet, serverboundPacketMapping.get(packet.getState()).size()); } - clientboundPacketMapping = HashBiMap.create(); + clientboundPacketMapping = new HashMap<>(); for (JsonElement packetElement : mappingJson.getAsJsonArray("clientbound")) { String packetName = packetElement.getAsString(); - clientboundPacketMapping.put(Packets.Clientbound.valueOf(packetName), clientboundPacketMapping.size()); + Packets.Clientbound packet = Packets.Clientbound.valueOf(packetName); + if (!clientboundPacketMapping.containsKey(packet.getState())) { + clientboundPacketMapping.put(packet.getState(), HashBiMap.create()); + } + clientboundPacketMapping.get(packet.getState()).put(packet, clientboundPacketMapping.get(packet.getState()).size()); } } Version version = new Version(versionName, protocolId, serverboundPacketMapping, clientboundPacketMapping); diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java b/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java index 964460250..852417d8d 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java +++ b/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java @@ -257,17 +257,25 @@ public class Connection { } public int getPacketCommand(Packets.Serverbound packet) { - if (packet.getState() == ConnectionState.PLAY) { - return version.getCommandByPacket(packet); + Integer command = null; + if (getReason() != ConnectionReason.GET_VERSION) { + command = version.getCommandByPacket(packet); } - return Protocol.getPacketCommand(packet); + if (command == null) { + return Protocol.getPacketCommand(packet); + } + return command; } public Packets.Clientbound getPacketByCommand(ConnectionState state, int command) { - if (state == ConnectionState.PLAY) { - return version.getPacketByCommand(command); + Packets.Clientbound packet = null; + if (getReason() != ConnectionReason.GET_VERSION) { + packet = version.getPacketByCommand(state, command); } - return Protocol.getPacketByCommand(state, command); + if (packet == null) { + return Protocol.getPacketByCommand(state, command); + } + return packet; } public VelocityHandler getVelocityHandler() {