refactor(ForgeInfo.cs): Remove unused code and edit comments

This commit is contained in:
oldkingOK 2024-02-20 22:02:22 +08:00
parent f749840d89
commit 970ba19172

View file

@ -143,32 +143,18 @@ namespace MinecraftClient.Protocol.Handlers.Forge
case FMLVersion.FML3: case FMLVersion.FML3:
// Example ModInfo for Minecraft 1.18 and greater (FML3) // Example ModInfo for Minecraft 1.18 and greater (FML3)
// {
// "enforcesSecureChat": true,
// "forgeData": { // "forgeData": {
// "channels": [], // "channels": [],
// "mods": [], // "mods": [],
// "truncated": false, // legacy versions see truncated lists, modern versions ignore this truncated flag (binary data has its own) // "truncated": false, // legacy versions see truncated lists, modern versions ignore this truncated flag (binary data has its own)
// "fmlNetworkVersion": 3, // "fmlNetworkVersion": 3,
// "d": "ȳ\u0000\u0000ࠨ㐤獋㙖⹌ᦘ̺⸱恤䒸⡑⛧沮婙㨹牥ఈㄵচ₀沮婙㨹牥ఈㄵচ倠⹡岙㜲獥䋊㷍᭳ႇׇ஌᜘㘴娘▅筳ص䰭宛㘲、\u0000ᠸጋ囗湌夜㘲杩棐䐱ᅱ挃☥ోᤗ㌮ఀ׈䬣 坖ɍ䮌ᤘ\r\n旉䠳ዣ◆䲌㜃瑥廮ⷉࠋ䁠奚Ҵ㔱摜䂸ᅱ獳ౠᡚ㜷汥戊䂸űဓĠ嵛㖱数嫤Ǎ塰䛶ⶎᮚ㞳晲擞ᖝ″ዣ䘆ఋʂ潦令ඕ爈䖔⺁ᥚ⾹潳棤㦥ᬻ挐؅䅀㠹楬ۨ㣄উ瀀渀嬛㘼扩搢䃀熁挂♥\r\n墋㒺摬牜ࣜ䁠嘗湌孛㜴浩惂䠙熙排٥孁㒰ͮ屢Ӏ䠐⚐䷮ᣛ㊴瑳戚䢸熁匒إ஍᜚ܴ䫜巑፻ؠ䀀ㆃ牵䋨㦥ࠫ㋣䗆䂌㨈慲䫬ᖱᮓᘧ汬尚ㆰ٫屲㣄ᆉ恳ಭ川㤷፫擨妅挫♖乮塘 㖱慰\r\n囆䓩\t" // "d": "ȳ\u0000\u0000ࠨ㐤獋㙖⹌ᦘ̺⸱恤䒸⡑⛧沮婙㨹牥ఈㄵচ₀沮婙㨹牥ఈㄵচ倠⹡岙㜲獥䋊㷍᭳ႇׇ஌᜘㘴娘▅筳ص䰭宛㘲、\u0000ᠸጋ囗湌夜㘲杩棐䐱ᅱ挃☥ోᤗ㌮ఀ׈䬣 坖ɍ䮌ᤘ\r\n旉䠳ዣ◆䲌㜃瑥廮ⷉࠋ䁠奚Ҵ㔱摜䂸ᅱ獳ౠᡚ㜷汥戊䂸űဓĠ嵛㖱数嫤Ǎ塰䛶ⶎᮚ㞳晲擞ᖝ″ዣ䘆ఋʂ潦令ඕ爈䖔⺁ᥚ⾹潳棤㦥ᬻ挐؅䅀㠹楬ۨ㣄উ瀀渀嬛㘼扩搢䃀熁挂♥\r\n墋㒺摬牜ࣜ䁠嘗湌孛㜴浩惂䠙熙排٥孁㒰ͮ屢Ӏ䠐⚐䷮ᣛ㊴瑳戚䢸熁匒إ஍᜚ܴ䫜巑፻ؠ䀀ㆃ牵䋨㦥ࠫ㋣䗆䂌㨈慲䫬ᖱᮓᘧ汬尚ㆰ٫屲㣄ᆉ恳ಭ川㤷፫擨妅挫♖乮塘 㖱慰\r\n囆䓩\t"
// },
// "description": {
// "text": "A Minecraft Server"
// },
// "players": {
// "max": 100,
// "online": 0
// },
// "version": {
// "name": "1.20.1",
// "protocol": 763
// }
// } // }
// All buffer data are encoded and write to forgeData["d"] // 1.18 and greater, the mod list and channel list is compressed to forgeData["d"] for efficiency,
// - Here is how forge encode and decode them:
// https://github.com/MinecraftForge/MinecraftForge/blob/cb12df41e13da576b781be695f80728b9594c25f/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L264 // https://github.com/MinecraftForge/MinecraftForge/blob/cb12df41e13da576b781be695f80728b9594c25f/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L264
// - Here is the discussion:
// 1.18 and greater, the buffer is encoded for efficiency
// see https://github.com/MinecraftForge/MinecraftForge/pull/8169 // see https://github.com/MinecraftForge/MinecraftForge/pull/8169
string encodedData = data.Properties["d"].StringValue; string encodedData = data.Properties["d"].StringValue;
@ -176,14 +162,21 @@ namespace MinecraftClient.Protocol.Handlers.Forge
DataTypes dataTypes = new DataTypes(Protocol18Handler.MC_1_18_1_Version); DataTypes dataTypes = new DataTypes(Protocol18Handler.MC_1_18_1_Version);
// //
// [truncated][boolean] placeholder for whether we are truncating // [ Truncated ][ Bool ] // Unused
// [Mod Size][unsigned short] short so that we can replace it later in case of truncation // [ Mod Size ][ Unsigned short ]
// //
bool truncated = dataTypes.ReadNextBool(dataPackage); dataTypes.ReadNextBool(dataPackage); // truncated: boolean
var modsSize = dataTypes.ReadNextUShort(dataPackage); var modsSize = dataTypes.ReadNextUShort(dataPackage);
Dictionary<string, string> channels = new();
Dictionary<string, string> mods = new(); Dictionary<string, string> mods = new();
// Mod Array Definition:
// [ Channel Size And Version Flag ][ VarInt ] // If the value at bit Mask 0x01 is 1, The Mod Version will be ignore.
// // The one-right-shifted int is the Channel List size.
// [ Mod Id ][ String ]
// [ Mod Version ][ Optional String ] // Depends on the Flag above
// [ Channel List ][ Array ] [ Channel Name ][ String ]
// [ Channel Version ][ String ]
// [ Required On Client ][ Bool ]
for (var i = 0; i < modsSize; i++) { for (var i = 0; i < modsSize; i++) {
var channelSizeAndVersionFlag = dataTypes.ReadNextVarInt(dataPackage); var channelSizeAndVersionFlag = dataTypes.ReadNextVarInt(dataPackage);
@ -194,27 +187,24 @@ namespace MinecraftClient.Protocol.Handlers.Forge
var modId = dataTypes.ReadNextString(dataPackage); var modId = dataTypes.ReadNextString(dataPackage);
string IGNORESERVERONLY = "";// it was "OHNOES\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31"; string IGNORESERVERONLY = "IGNORED";
var modVersion = isIgnoreServerOnly ? IGNORESERVERONLY : dataTypes.ReadNextString(dataPackage); var modVersion = isIgnoreServerOnly ? IGNORESERVERONLY : dataTypes.ReadNextString(dataPackage);
for (var i1 = 0; i1 < channelSize; i1++) { for (var i1 = 0; i1 < channelSize; i1++) {
var channelName = dataTypes.ReadNextString(dataPackage); dataTypes.ReadNextString(dataPackage); // channelName
var channelVersion = dataTypes.ReadNextString(dataPackage); dataTypes.ReadNextString(dataPackage); // channelVersion
var requiredOnClient = dataTypes.ReadNextBool(dataPackage); dataTypes.ReadNextBool(dataPackage); // requiredOnClient
channels.Add(modId + ":" + channelName, channelVersion + ":" + requiredOnClient);
} }
mods.Add(modId, modVersion); mods.Add(modId, modVersion);
Mods.Add(new ForgeMod(modId, modVersion)); Mods.Add(new ForgeMod(modId, modVersion));
} }
var nonModChannelCount = dataTypes.ReadNextVarInt(dataPackage); // Ignore the left data, which is NonMod Channel List
for (var i = 0; i < nonModChannelCount; i++) { // [ nonMod Channel Count ][ VarInt ]
var channelName = dataTypes.ReadNextString(dataPackage); // [ nonMod Channel List ][ Array ] [ Channel Name ][ String ]
var channelVersion = dataTypes.ReadNextString(dataPackage); // [ Channel Version ][ Bool ]
var requiredOnClient = dataTypes.ReadNextBool(dataPackage); // [ Required On Client ][ Bool ]
channels.Add(channelName, channelVersion + ":" + requiredOnClient);
}
break; break;
default: default:
@ -222,10 +212,17 @@ namespace MinecraftClient.Protocol.Handlers.Forge
} }
} }
// https://github.com/MinecraftForge/MinecraftForge/blob/cb12df41e13da576b781be695f80728b9594c25f/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L361 /// <summary>
// Decode binary data ForgeData["d"] to Queue<byte> /// Decompress binary data ForgeData["d"] (FML 3)
/// </summary>
/// <param name="encodedData">The encoded data.</param>
/// <returns>Decoded forge data Queue<byte>.</returns>
/// <para>
/// 1.18 and greater, the mod list and channel list is compressed for efficiency
/// The code below is converted from forge source code, see:
/// https://github.com/MinecraftForge/MinecraftForge/blob/cb12df41e13da576b781be695f80728b9594c25f/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L361
/// </para>
private static Queue<byte> decodeOptimized(string encodedData) { private static Queue<byte> decodeOptimized(string encodedData) {
// Console.WriteLine("Got encoded data:" + encodedData + ", decoding...");
int size0 = encodedData[0]; int size0 = encodedData[0];
int size1 = encodedData[1]; int size1 = encodedData[1];
int size = size0 | (size1 << 15); int size = size0 | (size1 << 15);