mirror of
https://github.com/MinecraftForge/MinecraftForge
synced 2026-08-22 04:26:10 -04:00
Fix reading ping data for legacy Forge versions. Closes #10778
This commit is contained in:
parent
5e6d92a099
commit
5df71fb5df
2 changed files with 22 additions and 2 deletions
|
|
@ -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");
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue