diff --git a/Modules/OptionHolder.cs b/Modules/OptionHolder.cs index cf2374f7e..8b353d6e2 100644 --- a/Modules/OptionHolder.cs +++ b/Modules/OptionHolder.cs @@ -10,6 +10,7 @@ using EHR.AddOns; using EHR.AddOns.GhostRoles; using EHR.Modules; using HarmonyLib; +using Hazel; using UnityEngine; // ReSharper disable InconsistentNaming @@ -3241,7 +3242,7 @@ public static class Options MaxNNKs.SetValue(usedValues.MaxNNKs.GetInt(), false, false); OptionSaver.Save(); - OptionItem.SyncAllOptions(); + OptionItem.SyncAllOptions(sendOption: SendOption.Reliable); Logger.SendInGame(string.Format(Translator.GetString("AutoFactionMinMaxSettings.Applied"), playerCount, usedValues.MinPlayersToActivate.GetInt(), string.Join(", ", new[] { Team.Impostor, Team.Coven, Team.Neutral }.Select(x => $"{Utils.ColorString(x.GetColor(), Translator.GetString($"ShortTeamName.{x}").ToUpper())}: <#ffffff>{usedValues.TeamSettings[x].MinSetting.GetInt()}-{usedValues.TeamSettings[x].MaxSetting.GetInt()}")), usedValues.MinNNKs.GetInt(), usedValues.MaxNNKs.GetInt())); } diff --git a/Modules/OptionItem/OptionItem.cs b/Modules/OptionItem/OptionItem.cs index f51e5d013..c1cc65b4e 100644 --- a/Modules/OptionItem/OptionItem.cs +++ b/Modules/OptionItem/OptionItem.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using EHR.Modules; +using Hazel; using UnityEngine; namespace EHR; @@ -315,10 +316,10 @@ public abstract class OptionItem foreach (OptionItem op in AllOptions) op.Refresh(); - SyncAllOptions(); + SyncAllOptions(sendOption: SendOption.Reliable); } - public static void SyncAllOptions(int targetId = -1) + public static void SyncAllOptions(int targetId = -1, SendOption sendOption = SendOption.None) { if ( Main.AllPlayerControls.Length <= 1 @@ -327,7 +328,7 @@ public abstract class OptionItem ) return; - RPC.SyncCustomSettingsRPC(targetId); + RPC.SyncCustomSettingsRPC(targetId, sendOption); } public void CallUpdateValueEvent(int beforeValue, int currentValue) diff --git a/Modules/RPC.cs b/Modules/RPC.cs index 1ce76ef4c..80337659c 100644 --- a/Modules/RPC.cs +++ b/Modules/RPC.cs @@ -380,12 +380,7 @@ internal static class RPCHandlerPatch } case 80: { - reader.ReadString(); - reader.ReadString(); - - if (reader.ReadString() != Main.ForkId) - Logger.SendInGame(string.Format(GetString("ModMismatch"), __instance.Data?.PlayerName), Color.red); - + Logger.SendInGame(string.Format(GetString("ModMismatch"), __instance.Data?.PlayerName), Color.red); break; } case 62 when GameStates.IsInTask && Main.IntroDestroyed && !ExileController.Instance && !AntiBlackout.SkipTasks: @@ -463,21 +458,17 @@ internal static class RPCHandlerPatch { if (AmongUsClient.Instance.AmHost) break; - int startIndex = reader.ReadPackedInt32(); - - if (startIndex == 2) + if (reader.ReadBoolean()) { Options.Preset.SetValue(9, false, false); Options.GameMode.SetValue(reader.ReadPackedInt32(), false, false); } - for (int i = startIndex; i < OptionItem.AllOptions.Count; i++) + while (reader.BytesRemaining > 0) { - if (reader.BytesRemaining == 0) break; - var option = OptionItem.AllOptions[i]; - if (option is TextOptionItem || option.Id >= 660000) continue; - - option.SetValue(reader.ReadPackedInt32(), false, false); + int id = reader.ReadPackedInt32(); + int value = reader.ReadPackedInt32(); + OptionItem.FastOptions[id].SetValue(value, false, false); } OptionSaver.Save(); @@ -1438,7 +1429,7 @@ internal static class RPCHandlerPatch internal static class RPC { - public static void SyncCustomSettingsRPC(int targetId = -1) + public static void SyncCustomSettingsRPC(int targetId = -1, SendOption sendOption = SendOption.None) { if (targetId != -1) { @@ -1448,24 +1439,23 @@ internal static class RPC if (!AmongUsClient.Instance.AmHost || PlayerControl.AllPlayerControls.Count <= 1) return; - Logger.Msg(" Starting from 2", "SyncCustomSettings"); - MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SyncCustomSettings, SendOption.Reliable, targetId); - writer.WritePacked(2); + Logger.Msg(" Starting", "SyncCustomSettings"); + MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SyncCustomSettings, sendOption, targetId); + writer.Write(true); writer.WritePacked(Options.GameMode.GetValue()); - for (int i = 2; i < OptionItem.AllOptions.Count; i++) + foreach (var option in OptionItem.AllOptions) { - var option = OptionItem.AllOptions[i]; - if (option is TextOptionItem || option.Id >= 660000) continue; + if (option is TextOptionItem || option.Id >= 660000 || option.Name == "Preset") continue; if (writer.Length > 500) { - Logger.Msg($" Starting from {i}", "SyncCustomSettings"); AmongUsClient.Instance.FinishRpcImmediately(writer); - writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SyncCustomSettings, SendOption.Reliable, targetId); - writer.WritePacked(i); + writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SyncCustomSettings, sendOption, targetId); + writer.Write(false); } + writer.WritePacked(option.Id); writer.WritePacked(option.GetValue()); } diff --git a/Patches/ChatCommandPatch.cs b/Patches/ChatCommandPatch.cs index c1b48324a..153c3553e 100644 --- a/Patches/ChatCommandPatch.cs +++ b/Patches/ChatCommandPatch.cs @@ -803,7 +803,7 @@ internal static class ChatCommands optionItem.AllValues[targetPreset] = optionItem.AllValues[sourcePresetId]; } - OptionItem.SyncAllOptions(); + OptionItem.SyncAllOptions(sendOption: SendOption.Reliable); OptionSaver.Save(); } } diff --git a/Patches/ControlPatch.cs b/Patches/ControlPatch.cs index 843c0e260..ecfa2f8fa 100644 --- a/Patches/ControlPatch.cs +++ b/Patches/ControlPatch.cs @@ -5,6 +5,7 @@ using System.Linq; using EHR.Modules; using EHR.Patches; using HarmonyLib; +using Hazel; using Rewired; using TMPro; using UnityEngine; @@ -197,7 +198,7 @@ internal static class ControllerManagerUpdatePatch hudManager.Dialogue.BackButton.gameObject.SetActive(true); hudManager.Dialogue.Hide(); - OptionItem.SyncAllOptions(); + OptionItem.SyncAllOptions(sendOption: SendOption.Reliable); OptionSaver.Save(); IsResetting = false; diff --git a/Patches/GameOptionsMenuPatch.cs b/Patches/GameOptionsMenuPatch.cs index e7b33800c..5e55d1176 100644 --- a/Patches/GameOptionsMenuPatch.cs +++ b/Patches/GameOptionsMenuPatch.cs @@ -6,6 +6,7 @@ using EHR.AddOns.GhostRoles; using EHR.Modules; using EHR.Patches; using HarmonyLib; +using Hazel; using TMPro; using UnityEngine; using UnityEngine.Events; @@ -1456,6 +1457,8 @@ public static class GameSettingMenuPatch GMButtons = []; Main.Instance.StartCoroutine(OptionShower.GetText()); + + OptionItem.SyncAllOptions(sendOption: SendOption.Reliable); } } diff --git a/Patches/OnGameStartedPatch.cs b/Patches/OnGameStartedPatch.cs index 1f89d7a76..4c592d1b3 100644 --- a/Patches/OnGameStartedPatch.cs +++ b/Patches/OnGameStartedPatch.cs @@ -394,7 +394,7 @@ internal static class ChangeRoleSettings if (__instance.AmHost) { - RPC.SyncCustomSettingsRPC(); + RPC.SyncCustomSettingsRPC(sendOption: SendOption.Reliable); Main.RefixCooldownDelay = 0; } diff --git a/Patches/PlayerJoinAndLeftPatch.cs b/Patches/PlayerJoinAndLeftPatch.cs index 31c4f1352..b15915e26 100644 --- a/Patches/PlayerJoinAndLeftPatch.cs +++ b/Patches/PlayerJoinAndLeftPatch.cs @@ -658,7 +658,7 @@ internal static class InnerNetClientSpawnPatch Logger.Warn("client is null or client have invalid color", "TrySyncAndSendMessage"); else { - LateTask.New(() => OptionItem.SyncAllOptions(client.Id), 3f, "Sync All Options For New Player"); + LateTask.New(() => OptionItem.SyncAllOptions(client.Id, SendOption.Reliable), 3f, "Sync All Options For New Player"); LateTask.New(() => {