diff --git a/MiraAPI/GameOptions/ModdedOptionsManager.cs b/MiraAPI/GameOptions/ModdedOptionsManager.cs index 5960ea0d..3c363878 100644 --- a/MiraAPI/GameOptions/ModdedOptionsManager.cs +++ b/MiraAPI/GameOptions/ModdedOptionsManager.cs @@ -79,6 +79,7 @@ namespace MiraAPI.GameOptions { if (ModdedOptions.TryGetValue(netData.Id, out var option)) { + Logger.Error("Handling option " + option.Title); option.HandleNetData(netData.Data); } } diff --git a/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs b/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs index c86d6cd5..e6b2b9ff 100644 --- a/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs +++ b/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs @@ -60,6 +60,7 @@ namespace MiraAPI.GameOptions.OptionTypes public override void OnValueChanged(int newValue) { + DestroyableSingleton.Instance.Notifier.AddSettingsChangeMessage(StringName, OptionBehaviour.GetValueString(newValue), false); if (OptionBehaviour is null) return; var opt = OptionBehaviour as StringOption; @@ -67,8 +68,6 @@ namespace MiraAPI.GameOptions.OptionTypes { opt.Value = newValue; } - - DestroyableSingleton.Instance.Notifier.AddSettingsChangeMessage(StringName, OptionBehaviour.GetValueString(Value), false); } } } diff --git a/MiraAPI/GameOptions/OptionTypes/ModdedNumberOption.cs b/MiraAPI/GameOptions/OptionTypes/ModdedNumberOption.cs index c3faa9fd..f54b5d89 100644 --- a/MiraAPI/GameOptions/OptionTypes/ModdedNumberOption.cs +++ b/MiraAPI/GameOptions/OptionTypes/ModdedNumberOption.cs @@ -72,14 +72,13 @@ namespace MiraAPI.GameOptions.OptionTypes Value = Mathf.Clamp(newValue, Min, Max); if (OptionBehaviour is null) return; + DestroyableSingleton.Instance.Notifier.AddSettingsChangeMessage(StringName, OptionBehaviour.GetValueString(newValue), false); var opt = OptionBehaviour as NumberOption; if (opt) { opt.Value = newValue; } - - DestroyableSingleton.Instance.Notifier.AddSettingsChangeMessage(StringName, OptionBehaviour.GetValueString(Value), false); } } } diff --git a/MiraAPI/GameOptions/OptionTypes/ModdedOption.cs b/MiraAPI/GameOptions/OptionTypes/ModdedOption.cs index 0f9f238e..58f59c4b 100644 --- a/MiraAPI/GameOptions/OptionTypes/ModdedOption.cs +++ b/MiraAPI/GameOptions/OptionTypes/ModdedOption.cs @@ -3,6 +3,7 @@ using MiraAPI.Roles; using Reactor.Localization.Utilities; using System; using MiraAPI.Networking; +using Reactor.Networking.Rpc; using Reactor.Utilities; using UnityEngine; @@ -58,10 +59,16 @@ namespace MiraAPI.GameOptions.OptionTypes ChangedEvent.Invoke(Value); } + if (AmongUsClient.Instance.AmHost) + { + Rpc.Instance.Send(PlayerControl.LocalPlayer, [GetNetData()], true); + } + OnValueChanged(newValue); } public abstract NetData GetNetData(); + public abstract void HandleNetData(byte[] data); public abstract void OnValueChanged(T newValue); diff --git a/MiraAPI/GameOptions/OptionTypes/ModdedStringOption.cs b/MiraAPI/GameOptions/OptionTypes/ModdedStringOption.cs index 81415725..9132cb4c 100644 --- a/MiraAPI/GameOptions/OptionTypes/ModdedStringOption.cs +++ b/MiraAPI/GameOptions/OptionTypes/ModdedStringOption.cs @@ -56,6 +56,7 @@ namespace MiraAPI.GameOptions.OptionTypes public override void OnValueChanged(int newValue) { + DestroyableSingleton.Instance.Notifier.AddSettingsChangeMessage(StringName, OptionBehaviour.GetValueString(newValue), false); if (OptionBehaviour is null) return; var opt = OptionBehaviour as StringOption; @@ -63,8 +64,6 @@ namespace MiraAPI.GameOptions.OptionTypes { opt.Value = newValue; } - - DestroyableSingleton.Instance.Notifier.AddSettingsChangeMessage(StringName, OptionBehaviour.GetValueString(Value), false); } } } diff --git a/MiraAPI/GameOptions/OptionTypes/ModdedToggleOption.cs b/MiraAPI/GameOptions/OptionTypes/ModdedToggleOption.cs index 91f9c19e..907e5da5 100644 --- a/MiraAPI/GameOptions/OptionTypes/ModdedToggleOption.cs +++ b/MiraAPI/GameOptions/OptionTypes/ModdedToggleOption.cs @@ -49,6 +49,7 @@ namespace MiraAPI.GameOptions.OptionTypes public override void OnValueChanged(bool newValue) { + DestroyableSingleton.Instance.Notifier.AddSettingsChangeMessage(StringName, newValue ? "On" : "Off", false); if (OptionBehaviour is null) return; var toggleOpt = OptionBehaviour as ToggleOption; @@ -56,8 +57,6 @@ namespace MiraAPI.GameOptions.OptionTypes { toggleOpt.CheckMark.enabled = newValue; } - - DestroyableSingleton.Instance.Notifier.AddSettingsChangeMessage(StringName, Value ? "On" : "Off", false); } } } diff --git a/MiraAPI/Patches/Options/RoleSettingMenuPatches.cs b/MiraAPI/Patches/Options/RoleSettingMenuPatches.cs index 3d21eeec..9adecd1d 100644 --- a/MiraAPI/Patches/Options/RoleSettingMenuPatches.cs +++ b/MiraAPI/Patches/Options/RoleSettingMenuPatches.cs @@ -5,6 +5,8 @@ using MiraAPI.Utilities.Assets; using Reactor.Utilities.Extensions; using System; using System.Linq; +using MiraAPI.Networking; +using Reactor.Networking.Rpc; using Reactor.Utilities; using TMPro; using UnityEngine; @@ -79,7 +81,7 @@ namespace MiraAPI.Patches.Options { var roleSetting = obj.Cast(); var role = roleSetting.Role as ICustomRole; - if (role.HideSettings) return; + if (role is null or { HideSettings: true }) return; PluginSingleton.Instance.Config.TryGetEntry(role.NumConfigDefinition, out var numEntry); numEntry.Value = roleSetting.RoleMaxCount; @@ -88,13 +90,13 @@ namespace MiraAPI.Patches.Options chanceEntry.Value = roleSetting.RoleChance; roleSetting.UpdateValuesAndText(GameOptionsManager.Instance.CurrentGameOptions.RoleOptions); + DestroyableSingleton.Instance.Notifier.AddRoleSettingsChangeMessage(roleSetting.Role.StringName, roleSetting.RoleMaxCount, roleSetting.RoleChance, roleSetting.Role.TeamType, false); - /* if (AmongUsClient.Instance.AmHost) - { - Rpc.Instance.Send(new SyncRoleOptionsRpc.Data((ushort)roleSetting.Role.Role, numEntry.Value, chanceEntry.Value)); - }*/ + if (AmongUsClient.Instance.AmHost) + { + Rpc.Instance.Send(PlayerControl.LocalPlayer, [role.GetNetData(roleSetting.Role)], true); + } GameOptionsManager.Instance.GameHostOptions = GameOptionsManager.Instance.CurrentGameOptions; - return; } private static void CreateAdvancedSettings(RolesSettingsMenu __instance, RoleBehaviour role) diff --git a/MiraAPI/Roles/ICustomRole.cs b/MiraAPI/Roles/ICustomRole.cs index 615e56bf..a88de41d 100644 --- a/MiraAPI/Roles/ICustomRole.cs +++ b/MiraAPI/Roles/ICustomRole.cs @@ -1,8 +1,12 @@ -using AmongUs.GameOptions; +using System; +using AmongUs.GameOptions; using BepInEx.Configuration; using MiraAPI.Utilities; using MiraAPI.Utilities.Assets; using System.Text; +using HarmonyLib; +using MiraAPI.Networking; +using Reactor.Utilities; using UnityEngine; namespace MiraAPI.Roles; @@ -64,4 +68,12 @@ public interface ICustomRole var taskStringBuilder = Helpers.CreateForRole(this); return taskStringBuilder; } + + NetData GetNetData(RoleBehaviour roleBehaviour) + { + PluginSingleton.Instance.Config.TryGetEntry(NumConfigDefinition, out var numEntry); + PluginSingleton.Instance.Config.TryGetEntry(ChanceConfigDefinition, out var chanceEntry); + + return new NetData((uint)roleBehaviour.Role, BitConverter.GetBytes(numEntry.Value).AddRangeToArray(BitConverter.GetBytes(chanceEntry.Value))); + } } \ No newline at end of file