using System; using System.Collections; using AmongUs.GameOptions; using Hazel; namespace EHR.Modules; public sealed class NormalGameOptionsSender : GameOptionsSender { private LogicOptions _logicOptions; private static IGameOptions BasedGameOptions => GameOptionsManager.Instance.CurrentGameOptions; protected override bool IsDirty { get { try { if (GameManager.Instance != null && GameManager.Instance.LogicComponents != null && (_logicOptions == null || !GameManager.Instance.LogicComponents.Contains(_logicOptions))) { foreach (GameLogicComponent glc in GameManager.Instance.LogicComponents) { if (glc is LogicOptions lo) _logicOptions = lo; } } return _logicOptions is { IsDirty: true }; } catch (Exception ex) { Logger.Error(ex.ToString(), "NormalGameOptionsSender.IsDirty.Get"); return _logicOptions is { IsDirty: true }; } } set => _logicOptions?.ClearDirtyFlag(); } public override IGameOptions BuildGameOptions() { return BasedGameOptions; } protected override IEnumerator SendOptionsArrayAsync(byte[] optionArray, byte logicOptionsIndex) { yield return DataFlagRateLimiter.Enqueue(SendOptionsAction(optionArray, logicOptionsIndex)).Wait(); } protected override void SendOptionsArray(byte[] optionArray, byte logicOptionsIndex) { DataFlagRateLimiter.Enqueue(SendOptionsAction(optionArray, logicOptionsIndex)); } private static Action SendOptionsAction(byte[] optionArray, byte logicOptionsIndex) { return () => { MessageWriter writer = MessageWriter.Get(SendOption.Reliable); writer.StartMessage(5); { writer.Write(AmongUsClient.Instance.GameId); 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(); }; } }