Fix reading ping data for legacy Forge versions. Closes #10778

This commit is contained in:
LexManos 2026-08-05 10:05:10 -07:00
parent 5e6d92a099
commit 5df71fb5df
No known key found for this signature in database
GPG key ID: 6E90061A7AE1F652
2 changed files with 22 additions and 2 deletions

View file

@ -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<NetworkContext> CHANNEL_KEY = AttributeKey.valueOf("forge:netcontext");

View file

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