diff --git a/Reactor/Networking/Messages/ModdedHandshakeC2S.cs b/Reactor/Networking/Messages/ModdedHandshakeC2S.cs index a90f4e4..7ef4aeb 100644 --- a/Reactor/Networking/Messages/ModdedHandshakeC2S.cs +++ b/Reactor/Networking/Messages/ModdedHandshakeC2S.cs @@ -1,10 +1,31 @@ using System.Collections.Generic; +using System.Text; using Hazel; namespace Reactor.Networking.Messages; internal static class ModdedHandshakeC2S { + private const int MaxPackedSize = 5; + + public static int GetMaxSerializedSize(IReadOnlyCollection mods) + { + var size = MaxPackedSize; + + foreach (var mod in mods) + { + size += GetMaxStringSize(mod.Id) + GetMaxStringSize(mod.Version) + sizeof(ushort); + if (mod.IsRequiredOnAllClients) size += GetMaxStringSize(mod.Name); + } + + return size; + } + + private static int GetMaxStringSize(string? value) + { + return MaxPackedSize + (value == null ? 0 : Encoding.UTF8.GetByteCount(value)); + } + public static void Serialize(MessageWriter writer, IReadOnlyCollection mods) { writer.WritePacked(mods.Count); diff --git a/Reactor/Networking/Patches/ClientPatches.cs b/Reactor/Networking/Patches/ClientPatches.cs index a9c9f6b..e5bfcfe 100644 --- a/Reactor/Networking/Patches/ClientPatches.cs +++ b/Reactor/Networking/Patches/ClientPatches.cs @@ -358,16 +358,14 @@ public static void Prefix(ref bool useDtlsLayout) public static void Postfix(ref Il2CppStructArray __result) { - var handshake = new MessageWriter(1000); + var mods = ModList.Current; + var handshake = new MessageWriter(__result.Length + ReactorHeader.Size + ModdedHandshakeC2S.GetMaxSerializedSize(mods)); handshake.Write(__result); ReactorHeader.Write(handshake); - ModdedHandshakeC2S.Serialize( - handshake, - ModList.Current - ); + ModdedHandshakeC2S.Serialize(handshake, mods); __result = handshake.ToByteArray(true); handshake.Recycle();