From bba8cb5b83df957b88987d87f4731fa170eab460 Mon Sep 17 00:00:00 2001 From: Gurge44 Date: Fri, 15 May 2026 08:59:52 +0200 Subject: [PATCH] fix immediate send --- .../PlayerGameOptionsSender.cs | 87 ++++++++++++++++++- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/Modules/GameOptionsSender/PlayerGameOptionsSender.cs b/Modules/GameOptionsSender/PlayerGameOptionsSender.cs index fedd01be2..3aceeed0e 100644 --- a/Modules/GameOptionsSender/PlayerGameOptionsSender.cs +++ b/Modules/GameOptionsSender/PlayerGameOptionsSender.cs @@ -57,16 +57,68 @@ public sealed class PlayerGameOptionsSender(PlayerControl player) : GameOptionsS { ForceWaitFrame = true; + if (PackedWriterMessages > 0 && PackedWriter != null) + { + PackedWriter.EndMessage(); + var capturedWriter = PackedWriter; + DataFlagRateLimiter.Enqueue(() => + { + AmongUsClient.Instance.SendOrDisconnect(capturedWriter); + capturedWriter.Recycle(); + }, cleanup: capturedWriter.Recycle); + } + + PackedWriter = MessageWriter.Get(SendOption.Reliable); + PackedWriter.StartMessage(26); + PackedWriter.WritePacked(AmongUsClient.Instance.GameId); + PackedWriterMessages = 0; + for (var index = 0; index < AllSenders.Count; index++) { GameOptionsSender allSender = AllSenders[index]; if (allSender is PlayerGameOptionsSender { IsDirty: true } sender) { + if (PackedWriter != null && (PackedWriter.Length > 500 || PackedWriterMessages >= AmongUsClient.Instance.GetMaxMessagePackingLimit())) + { + PackedWriter.EndMessage(); + var capturedWriter = PackedWriter; + DataFlagRateLimiter.Enqueue(() => + { + AmongUsClient.Instance.SendOrDisconnect(capturedWriter); + capturedWriter.Recycle(); + }, cleanup: capturedWriter.Recycle); + PackedWriterMessages = 0; + PackedWriter = MessageWriter.Get(SendOption.Reliable); + PackedWriter.StartMessage(26); + PackedWriter.WritePacked(AmongUsClient.Instance.GameId); + } + sender.SendGameOptions(); sender.IsDirty = false; } } + + if (PackedWriter != null) + { + if (PackedWriterMessages > 0) + { + PackedWriter.EndMessage(); + var capturedWriter = PackedWriter; + DataFlagRateLimiter.Enqueue(() => + { + AmongUsClient.Instance.SendOrDisconnect(capturedWriter); + capturedWriter.Recycle(); + }, cleanup: capturedWriter.Recycle); + } + else + { + PackedWriter.Recycle(); + } + } + + PackedWriter = null; + PackedWriterMessages = 0; } public static void SetDirtyToAll() @@ -167,11 +219,40 @@ public sealed class PlayerGameOptionsSender(PlayerControl player) : GameOptionsS protected override void SendOptionsArray(Il2CppStructArray optionArray, byte logicOptionsIndex) { - if (PackedWriter == null) return; - + if (PackedWriter == null) + { + DataFlagRateLimiter.Enqueue(() => + { + MessageWriter writer = MessageWriter.Get(SendOption.Reliable); + + writer.StartMessage(6); + { + writer.Write(AmongUsClient.Instance.GameId); + writer.WritePacked(player.OwnerId); + + writer.StartMessage(1); + { + writer.WritePacked(GameManager.Instance.NetId); + writer.StartMessage(logicOptionsIndex); + { + writer.WriteBytesAndSize(optionArray); + } + writer.EndMessage(); + } + writer.EndMessage(); + } + + writer.EndMessage(); + + AmongUsClient.Instance.SendOrDisconnect(writer); + writer.Recycle(); + }); + return; + } + PackedWriterMessages++; - PackedWriter.StartMessage(Tags.GameDataTo); + PackedWriter.StartMessage(6); { PackedWriter.Write(AmongUsClient.Instance.GameId); PackedWriter.WritePacked(player.OwnerId);