From 0e02ecf818a6c85ccf553ff82f5ef29b064835cb Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Sat, 12 Aug 2023 02:35:25 +0200 Subject: [PATCH] Added API method to get real protocol version from shifted legacy version --- .../vialegacy/api/LegacyProtocolVersion.java | 14 +++++++++++--- .../Protocol1_3_1_2to1_2_4_5.java | 3 ++- .../Protocol1_4_2to1_3_1_2.java | 3 ++- .../Protocol1_7_2_5to1_6_4.java | 5 +++-- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/raphimc/vialegacy/api/LegacyProtocolVersion.java b/src/main/java/net/raphimc/vialegacy/api/LegacyProtocolVersion.java index c8432fa..084ac9f 100644 --- a/src/main/java/net/raphimc/vialegacy/api/LegacyProtocolVersion.java +++ b/src/main/java/net/raphimc/vialegacy/api/LegacyProtocolVersion.java @@ -70,13 +70,13 @@ public class LegacyProtocolVersion { public static int protocolCompare(int a, int b) { - if (a > 0 || b > 0) { + if (a >= 0 || b >= 0) { // If at least one is modern, then a straight compare works fine. return a - b; } // Both are legacy - a = Math.abs(a); - b = Math.abs(b); + a = -a; + b = -b; final int baseProtocolA = a >> 2; final int baseProtocolB = b >> 2; if (baseProtocolA != baseProtocolB) { @@ -88,6 +88,14 @@ public class LegacyProtocolVersion { return discriminatorB - discriminatorA; // Higher discriminator means older version } + public static int getRealProtocolVersion(final int protocolVersion) { + if (protocolVersion >= 0) { + return protocolVersion; + } + + return -protocolVersion >> 2; + } + private static ProtocolVersion registerLegacy(final int version, final String name) { return registerLegacy(version, name, null); diff --git a/src/main/java/net/raphimc/vialegacy/protocols/release/protocol1_3_1_2to1_2_4_5/Protocol1_3_1_2to1_2_4_5.java b/src/main/java/net/raphimc/vialegacy/protocols/release/protocol1_3_1_2to1_2_4_5/Protocol1_3_1_2to1_2_4_5.java index c249bfc..870483e 100644 --- a/src/main/java/net/raphimc/vialegacy/protocols/release/protocol1_3_1_2to1_2_4_5/Protocol1_3_1_2to1_2_4_5.java +++ b/src/main/java/net/raphimc/vialegacy/protocols/release/protocol1_3_1_2to1_2_4_5/Protocol1_3_1_2to1_2_4_5.java @@ -39,6 +39,7 @@ import com.viaversion.viaversion.libs.opennbt.tag.builtin.ShortTag; import com.viaversion.viaversion.libs.opennbt.tag.builtin.StringTag; import com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; import net.raphimc.vialegacy.ViaLegacy; +import net.raphimc.vialegacy.api.LegacyProtocolVersion; import net.raphimc.vialegacy.api.data.BlockList1_6; import net.raphimc.vialegacy.api.model.IdAndData; import net.raphimc.vialegacy.api.model.Location; @@ -838,7 +839,7 @@ public class Protocol1_3_1_2to1_2_4_5 extends AbstractProtocol> 2)); // protocol id + login.write(Type.INT, LegacyProtocolVersion.getRealProtocolVersion(info.getServerProtocolVersion())); // protocol id login.write(Types1_6_4.STRING, info.getUsername()); // username login.write(Types1_6_4.STRING, ""); // level type login.write(Type.INT, 0); // game mode diff --git a/src/main/java/net/raphimc/vialegacy/protocols/release/protocol1_4_2to1_3_1_2/Protocol1_4_2to1_3_1_2.java b/src/main/java/net/raphimc/vialegacy/protocols/release/protocol1_4_2to1_3_1_2/Protocol1_4_2to1_3_1_2.java index eb2a976..1e20c5d 100644 --- a/src/main/java/net/raphimc/vialegacy/protocols/release/protocol1_4_2to1_3_1_2/Protocol1_4_2to1_3_1_2.java +++ b/src/main/java/net/raphimc/vialegacy/protocols/release/protocol1_4_2to1_3_1_2/Protocol1_4_2to1_3_1_2.java @@ -31,6 +31,7 @@ import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import com.viaversion.viaversion.api.type.Type; import net.raphimc.vialegacy.ViaLegacy; +import net.raphimc.vialegacy.api.LegacyProtocolVersion; import net.raphimc.vialegacy.api.data.ItemList1_6; import net.raphimc.vialegacy.api.remapper.LegacyItemRewriter; import net.raphimc.vialegacy.api.splitter.PreNettySplitter; @@ -69,7 +70,7 @@ public class Protocol1_4_2to1_3_1_2 extends AbstractProtocol> 2) + "\0" + ProtocolVersion.getProtocol(info.getServerProtocolVersion()).getName() + "\0" + pingParts[0] + "\0" + pingParts[1] + "\0" + pingParts[2]; + final String out = "§1\0" + LegacyProtocolVersion.getRealProtocolVersion(info.getServerProtocolVersion()) + "\0" + ProtocolVersion.getProtocol(info.getServerProtocolVersion()).getName() + "\0" + pingParts[0] + "\0" + pingParts[1] + "\0" + pingParts[2]; wrapper.write(Types1_6_4.STRING, out); } catch (Throwable e) { ViaLegacy.getPlatform().getLogger().log(Level.WARNING, "Could not parse 1.3.1 ping: " + reason, e); diff --git a/src/main/java/net/raphimc/vialegacy/protocols/release/protocol1_7_2_5to1_6_4/Protocol1_7_2_5to1_6_4.java b/src/main/java/net/raphimc/vialegacy/protocols/release/protocol1_7_2_5to1_6_4/Protocol1_7_2_5to1_6_4.java index fe1b677..c95e8c3 100644 --- a/src/main/java/net/raphimc/vialegacy/protocols/release/protocol1_7_2_5to1_6_4/Protocol1_7_2_5to1_6_4.java +++ b/src/main/java/net/raphimc/vialegacy/protocols/release/protocol1_7_2_5to1_6_4/Protocol1_7_2_5to1_6_4.java @@ -47,6 +47,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelOutboundHandlerAdapter; import io.netty.channel.ChannelPromise; import net.raphimc.vialegacy.ViaLegacy; +import net.raphimc.vialegacy.api.LegacyProtocolVersion; import net.raphimc.vialegacy.api.model.IdAndData; import net.raphimc.vialegacy.api.remapper.LegacyItemRewriter; import net.raphimc.vialegacy.api.splitter.PreNettySplitter; @@ -900,7 +901,7 @@ public class Protocol1_7_2_5to1_6_4 extends AbstractProtocol> 2)); // protocol Id + wrapper.write(Type.UNSIGNED_BYTE, (short) LegacyProtocolVersion.getRealProtocolVersion(wrapper.user().getProtocolInfo().getServerProtocolVersion())); // protocol Id wrapper.write(Types1_6_4.STRING, ip); // hostname wrapper.write(Type.INT, port); // port }); @@ -927,7 +928,7 @@ public class Protocol1_7_2_5to1_6_4 extends AbstractProtocol> 2)); // protocol id + wrapper.write(Type.UNSIGNED_BYTE, (short) LegacyProtocolVersion.getRealProtocolVersion(info.getServerProtocolVersion())); // protocol id wrapper.write(Types1_6_4.STRING, name); // user name wrapper.write(Types1_6_4.STRING, handshakeStorage.getHostname()); // hostname wrapper.write(Type.INT, handshakeStorage.getPort()); // port