From 5df71fb5df52161a01547b97ff71edeb0a9bca59 Mon Sep 17 00:00:00 2001 From: LexManos Date: Wed, 5 Aug 2026 10:05:10 -0700 Subject: [PATCH] Fix reading ping data for legacy Forge versions. Closes #10778 --- .../network/NetworkContext.java | 4 ++++ .../network/ServerStatusPing.java | 20 +++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraftforge/network/NetworkContext.java b/src/main/java/net/minecraftforge/network/NetworkContext.java index a155b96653..25ea9b9da7 100644 --- a/src/main/java/net/minecraftforge/network/NetworkContext.java +++ b/src/main/java/net/minecraftforge/network/NetworkContext.java @@ -23,6 +23,10 @@ import net.minecraftforge.network.packets.ModVersions; public class NetworkContext { private static final String MARKER = "FORGE"; + /** + * Versions 1, 2 and 3 were used by older Forge versions, + * so if this ever needs to be bumped, start from 4. + */ public static final int NET_VERSION = 0; private static final AttributeKey CHANNEL_KEY = AttributeKey.valueOf("forge:netcontext"); diff --git a/src/main/java/net/minecraftforge/network/ServerStatusPing.java b/src/main/java/net/minecraftforge/network/ServerStatusPing.java index 2db987c848..dfa76ae501 100644 --- a/src/main/java/net/minecraftforge/network/ServerStatusPing.java +++ b/src/main/java/net/minecraftforge/network/ServerStatusPing.java @@ -225,7 +225,7 @@ public record ServerStatusPing( var modVersion = isIgnoreServerOnly ? IExtensionPoint.DisplayTest.IGNORESERVERONLY : buf.readUtf(); for (var i1 = 0; i1 < channelSize; i1++) { var channelName = buf.readUtf(); - var channelVersion = buf.readVarInt(); + var channelVersion = readChannelVersion(fmlNetworkVersion, buf); var requiredOnClient = buf.readBoolean(); final Identifier id = Identifier.fromNamespaceAndPath(modId, channelName); channels.put(id, new ChannelData(id, channelVersion, requiredOnClient)); @@ -237,7 +237,7 @@ public record ServerStatusPing( var nonModChannelCount = buf.readVarInt(); for (var i = 0; i < nonModChannelCount; i++) { var channelName = buf.readIdentifier(); - var channelVersion = buf.readVarInt(); + var channelVersion = readChannelVersion(fmlNetworkVersion, buf); var requiredOnClient = buf.readBoolean(); channels.put(channelName, new ChannelData(channelName, channelVersion, requiredOnClient)); } @@ -248,6 +248,22 @@ public record ServerStatusPing( return new ServerStatusPing(channels, mods, fmlNetworkVersion, truncated); } + private static int readChannelVersion(int fmlNetworkVersion, FriendlyByteBuf buf) { + // For versions 1-3, before re-writing the network code, the version was any arbitrary String the mod provided, + // and a stupid list of emojies for "missing" or "don't care". So do a best effort to convert the string to a int + // but if that fails return -1 + if (fmlNetworkVersion >= 1 && fmlNetworkVersion <= 3) { + var versionStr = buf.readUtf(); // This can throw a DecoderException, if it reads a invalid string, this propagating is intentional + try { + return Integer.parseInt(versionStr); + } catch (NumberFormatException e) { + return -1; + } + } else { + return buf.readVarInt(); + } + } + /** * Encode given ByteBuf to a String. This is optimized for UTF-16 Code-Point count. * Supports at most 2^30 bytes in length