Edit outdated links in comments and add FML3 stuff

Add FML3 extra packetID 5 and 6 recognition based on
https://github.com/MinecraftForge/MinecraftForge/blob/1.18.x/src/main/java/net/minecraftforge/network/NetworkInitialization.java

Changed the way of selecting FML version for "Force Forge" from forced FML3 to game version based.
MC 1.12 and lower: FML, MC 1.13 to 1.17: FML2, MC 1.18 and greater: FML3

Edit outdated links in comments:
Accessing the link below will result in a message that the file cannot be found
https://github.com/MinecraftForge/MinecraftForge/blob/master/src/main/java/net/minecraftforge/fml/network/FMLNetworkConstants.java
Presumably it's version 1.13 based on the original commit and issue, then change to
https://github.com/MinecraftForge/MinecraftForge/blob/1.13.x/src/main/java/net/minecraftforge/fml/network/FMLNetworkConstants.java
https://github.com/MCCTeam/Minecraft-Console-Client/issues/1184
This commit is contained in:
oldkingOK 2024-01-14 01:45:38 +08:00
parent 79fa297e2b
commit 8eee50044f
2 changed files with 90 additions and 37 deletions

View file

@ -141,16 +141,14 @@ namespace MinecraftClient.Protocol.Handlers.Forge
break;
case FMLVersion.FML3:
// All buf data are write do forgeData["d"]
// src/main/java/net/minecraftforge/network/ServerStatusPing.java > serialize(ServerStatusPing forgeData)
// src/main/java/net/minecraftforge/network/ServerStatusPing.java > deserializeOptimized(JsonObject forgeData)
// Example ModInfo for Minecraft 1.18 and greater (FML3)
// {
// "enforcesSecureChat": true,
// "forgeData": {
// "channels": [],
// "mods": [],
// "truncated": false,
// "truncated": false, // legacy versions see truncated lists, modern versions ignore this truncated flag (binary data has its own)
// "fmlNetworkVersion": 3,
// "d": "ȳ\u0000\u0000ࠨ㐤獋㙖⹌ᦘ̺⸱恤䒸⡑⛧沮婙㨹牥ఈㄵচ₀沮婙㨹牥ఈㄵচ倠⹡岙㜲獥䋊㷍᭳ႇׇ஌᜘㘴娘▅筳ص䰭宛㘲、\u0000ᠸጋ囗湌夜㘲杩棐䐱ᅱ挃☥ోᤗ㌮ఀ׈䬣 坖ɍ䮌ᤘ\r\n旉䠳ዣ◆䲌㜃瑥廮ⷉࠋ䁠奚Ҵ㔱摜䂸ᅱ獳ౠᡚ㜷汥戊䂸űဓĠ嵛㖱数嫤Ǎ塰䛶ⶎᮚ㞳晲擞ᖝ″ዣ䘆ఋʂ潦令ඕ爈䖔⺁ᥚ⾹潳棤㦥ᬻ挐؅䅀㠹楬ۨ㣄উ瀀渀嬛㘼扩搢䃀熁挂♥\r\n墋㒺摬牜ࣜ䁠嘗湌孛㜴浩惂䠙熙排٥孁㒰ͮ屢Ӏ䠐⚐䷮ᣛ㊴瑳戚䢸熁匒إ஍᜚ܴ䫜巑፻ؠ䀀ㆃ牵䋨㦥ࠫ㋣䗆䂌㨈慲䫬ᖱᮓᘧ汬尚ㆰ٫屲㣄ᆉ恳ಭ川㤷፫擨妅挫♖乮塘 㖱慰\r\n囆䓩\t"
// },
@ -166,19 +164,22 @@ namespace MinecraftClient.Protocol.Handlers.Forge
// "protocol": 763
// }
// }
// All buffer data are encoded and write to forgeData["d"]
// https://github.com/MinecraftForge/MinecraftForge/blob/cb12df41e13da576b781be695f80728b9594c25f/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L264
// 1.18 and greater, the buffer is encoded for efficiency
// see https://github.com/MinecraftForge/MinecraftForge/pull/8169
string encodedData = data.Properties["d"].StringValue;
Queue<byte> dataPackage = decodeOptimized(encodedData);
DataTypes dataTypes = new DataTypes(Protocol18Handler.MC_1_18_2_Version);
DataTypes dataTypes = new DataTypes(Protocol18Handler.MC_1_18_1_Version);
//
// [truncated][boolean] placeholder for whether we are truncating
// [Mod Size][unsigned short] short so that we can replace it later in case of truncation
//
// Console.WriteLine("decodedData=");
bool truncated = false;
//Map<ResourceLocation, Pair<String, Boolean>> channels;
truncated = dataTypes.ReadNextBool(dataPackage);
bool truncated = dataTypes.ReadNextBool(dataPackage);
var modsSize = dataTypes.ReadNextUShort(dataPackage);
Dictionary<string, string> channels = new();
@ -193,7 +194,7 @@ namespace MinecraftClient.Protocol.Handlers.Forge
var modId = dataTypes.ReadNextString(dataPackage);
string IGNORESERVERONLY = "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 = "";// 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";
var modVersion = isIgnoreServerOnly ? IGNORESERVERONLY : dataTypes.ReadNextString(dataPackage);
for (var i1 = 0; i1 < channelSize; i1++) {
@ -201,7 +202,6 @@ namespace MinecraftClient.Protocol.Handlers.Forge
var channelVersion = dataTypes.ReadNextString(dataPackage);
var requiredOnClient = dataTypes.ReadNextBool(dataPackage);
channels.Add(modId + ":" + channelName, channelVersion + ":" + requiredOnClient);
//channels.Add(new ResourceLocation(modId, channelName), Pair.of(channelVersion, requiredOnClient));
}
mods.Add(modId, modVersion);
@ -214,15 +214,6 @@ namespace MinecraftClient.Protocol.Handlers.Forge
var channelVersion = dataTypes.ReadNextString(dataPackage);
var requiredOnClient = dataTypes.ReadNextBool(dataPackage);
channels.Add(channelName, channelVersion + ":" + requiredOnClient);
// channels.put(channelName, Pair.of(channelVersion, requiredOnClient));
}
foreach (var key in channels.Keys) {
//Console.WriteLine("We got channel: " + key + "-" + channels[key]);
}
foreach (var key in mods.Keys) {
//Console.WriteLine("We got mod: " + key + "-" + mods[key]);
}
break;
@ -231,12 +222,12 @@ namespace MinecraftClient.Protocol.Handlers.Forge
}
}
// decode ForgeData["d"] to Queue<byte>
// see src/main/java/net/minecraftforge/network/ServerStatusPing.java#l361
public static Queue<byte> decodeOptimized(string encodedData) {
// https://github.com/MinecraftForge/MinecraftForge/blob/cb12df41e13da576b781be695f80728b9594c25f/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L361
// Decode binary data ForgeData["d"] to Queue<byte>
private static Queue<byte> decodeOptimized(string encodedData) {
// Console.WriteLine("Got encoded data:" + encodedData + ", decoding...");
int size0 = (int)encodedData[0];
int size1 = (int)encodedData[1];
int size0 = encodedData[0];
int size1 = encodedData[1];
int size = size0 | (size1 << 15);
List<byte> packageData = new();
@ -255,7 +246,7 @@ namespace MinecraftClient.Protocol.Handlers.Forge
}
char c = encodedData[stringIndex];
buffer |= ((int)c & 0x7FFF) << bitsInBuf;
buffer |= (c & 0x7FFF) << bitsInBuf;
bitsInBuf += 15;
stringIndex++;
}