diff --git a/MiraAPI/GameModes/CustomGameModeManager.cs b/MiraAPI/GameModes/CustomGameModeManager.cs index 6a30b96..f453cca 100644 --- a/MiraAPI/GameModes/CustomGameModeManager.cs +++ b/MiraAPI/GameModes/CustomGameModeManager.cs @@ -37,7 +37,7 @@ public static class CustomGameModeManager return; } - Logger.Error($"No gamemode with id {id} found!"); + Logger.Error($"No gamemode with id {id} found!"); } /// @@ -48,7 +48,7 @@ public static class CustomGameModeManager { if (!typeof(CustomGameMode).IsAssignableFrom(gameModeType)) { - Logger.Warning($"{gameModeType?.Name} does not inherit CustomGameMode!"); + Logger.Warning($"{gameModeType?.Name} does not inherit CustomGameMode!"); return; } @@ -56,13 +56,13 @@ public static class CustomGameModeManager if (GameModes.Any(x => x.Key == gameMode?.Id)) { - Logger.Error($"ID for gamemode {gameMode?.Name} already exists!"); + Logger.Error($"ID for gamemode {gameMode?.Name} already exists!"); return; } if (gameMode == null) { - Logger.Error($"GAMEMODE WITH TYPE {gameModeType.Name} IS NULL"); + Logger.Error($"GAMEMODE WITH TYPE {gameModeType.Name} IS NULL"); return; } diff --git a/MiraAPI/GameOptions/IModdedOption.cs b/MiraAPI/GameOptions/IModdedOption.cs index c6a3acc..5768576 100644 --- a/MiraAPI/GameOptions/IModdedOption.cs +++ b/MiraAPI/GameOptions/IModdedOption.cs @@ -1,19 +1,23 @@ using MiraAPI.PluginLoading; using System; +using MiraAPI.Networking; using UnityEngine; namespace MiraAPI.GameOptions { public interface IModdedOption { + public uint Id { get; } + public ModdedOptionGroup Group { get; set; } + public IMiraPlugin ParentMod { get; set; } public Type AdvancedRole { get; } public OptionBehaviour OptionBehaviour { get; protected set; } public string Title { get; } public StringNames StringName { get; } public Func Visible { get; set; } - public ModdedOptionGroup Group { get; set; } - public IMiraPlugin ParentMod { get; set; } public void ValueChanged(OptionBehaviour optionBehaviour); public OptionBehaviour CreateOption(ToggleOption toggleOpt, NumberOption numberOpt, StringOption stringOpt, Transform container); + public NetData GetNetData(); + public void HandleNetData(byte[] data); } } diff --git a/MiraAPI/GameOptions/ModdedOptionsManager.cs b/MiraAPI/GameOptions/ModdedOptionsManager.cs index 323f456..e99a158 100644 --- a/MiraAPI/GameOptions/ModdedOptionsManager.cs +++ b/MiraAPI/GameOptions/ModdedOptionsManager.cs @@ -5,15 +5,19 @@ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; +using MiraAPI.Networking; +using Reactor.Networking.Rpc; namespace MiraAPI.GameOptions { public class ModdedOptionsManager { - public static List Options = []; - public static List Groups = []; - private static Dictionary OptionAttributes = new(); - public static Dictionary OriginalTypes = new(); + public static readonly Dictionary ModdedOptions = new(); + public static readonly List Options = []; + public static readonly List Groups = []; + private static readonly Dictionary OptionAttributes = new(); + public static readonly Dictionary OriginalTypes = new(); + public static uint NextId = 1; public static IModdedOption RegisterOption(Type type, ModdedOptionAttribute attribute, PropertyInfo property) { @@ -25,20 +29,19 @@ namespace MiraAPI.GameOptions { var setterOriginal = property.GetSetMethod(); var setterPatch = typeof(ModdedOptionsManager).GetMethod(nameof(PropertySetterPatch)); - PluginSingleton.Instance.Harmony.Patch(setterOriginal, postfix: new HarmonyMethod(setterPatch)); + PluginSingleton.Instance.Harmony.Patch(setterOriginal, postfix: new HarmonyMethod(setterPatch)); var getterOriginal = property.GetGetMethod(); var getterPatch = typeof(ModdedOptionsManager).GetMethod(nameof(PropertyGetterPatch)); - PluginSingleton.Instance.Harmony.Patch(getterOriginal, prefix: new HarmonyMethod(getterPatch)); + PluginSingleton.Instance.Harmony.Patch(getterOriginal, prefix: new HarmonyMethod(getterPatch)); attribute.HolderOption = result; - - Options.Add(result); + OptionAttributes.Add(property, attribute); if (OriginalTypes.ContainsKey(type)) { - Logger.Error($"Grouping {attribute.Title} with {OriginalTypes[type].GroupName}"); + Logger.Error($"Grouping {attribute.Title} with {OriginalTypes[type].GroupName}"); result.Group = OriginalTypes[type]; } } @@ -46,6 +49,46 @@ namespace MiraAPI.GameOptions return result; } + public static void SyncAllOptions(int targetId) + { + List data = []; + int count = 0; + Logger.Error("num options: " + ModdedOptions.Count); + foreach (var option in ModdedOptions.Values) + { + var netData = option.GetNetData(); + data.Add(netData); + count += netData.GetLength(); + Logger.Error($"syncing data for {netData.Id}"); + + if (count > 1000) + { + Rpc.Instance.SendTo(PlayerControl.LocalPlayer, targetId, data.ToArray()); + data.Clear(); + count = 0; + } + } + if (data.Count > 0) + { + Rpc.Instance.SendTo(PlayerControl.LocalPlayer, targetId, data.ToArray()); + } + } + + public static void HandleSyncOptions(NetData[] data) + { + foreach (var netData in data) + { + Logger.Error($"syncing data for {netData.Id}"); + + if (ModdedOptions.TryGetValue(netData.Id, out var option)) + { + Logger.Error($"syncing data for {option.Title}"); + option.HandleNetData(netData.Data); + } + } + } + + public static void PropertySetterPatch(MethodBase __originalMethod, object value) { ModdedOptionAttribute attribute = OptionAttributes.First(pair => pair.Key.GetSetMethod().Equals(__originalMethod)).Value; diff --git a/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs b/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs index 9fd6a25..c86d6cd 100644 --- a/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs +++ b/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs @@ -1,19 +1,15 @@ using Reactor.Localization.Utilities; using System; using System.Linq; +using MiraAPI.Networking; using UnityEngine; using Object = UnityEngine.Object; namespace MiraAPI.GameOptions.OptionTypes { - public class ModdedEnumOption : ModdedOption + public class ModdedEnumOption(string title, int defaultValue, Type enumType, Type roleType) : ModdedOption(title, defaultValue, roleType) { - public string[] Values; - - public ModdedEnumOption(string title, int defaultValue, Type enumType, Type roleType) : base(title, defaultValue, roleType) - { - Values = Enum.GetNames(enumType); - } + public string[] Values { get; set; } = Enum.GetNames(enumType); public override OptionBehaviour CreateOption(ToggleOption toggleOpt, NumberOption numberOpt, StringOption stringOpt, Transform container) { @@ -41,6 +37,16 @@ namespace MiraAPI.GameOptions.OptionTypes stringOption.SetUpFromData(stringOption.data, 20); return stringOption; } + + public override NetData GetNetData() + { + return new NetData(Id, BitConverter.GetBytes(Value)); + } + + public override void HandleNetData(byte[] data) + { + SetValue(BitConverter.ToInt32(data)); + } public override string GetHudStringText() { @@ -57,7 +63,10 @@ namespace MiraAPI.GameOptions.OptionTypes if (OptionBehaviour is null) return; var opt = OptionBehaviour as StringOption; - opt.Value = newValue; + if (opt) + { + 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 02d7333..c3faa9f 100644 --- a/MiraAPI/GameOptions/OptionTypes/ModdedNumberOption.cs +++ b/MiraAPI/GameOptions/OptionTypes/ModdedNumberOption.cs @@ -1,5 +1,8 @@ -using MiraAPI.Utilities; +using System; +using MiraAPI.Networking; +using MiraAPI.Utilities; using UnityEngine; +using Object = UnityEngine.Object; namespace MiraAPI.GameOptions.OptionTypes { @@ -44,6 +47,16 @@ namespace MiraAPI.GameOptions.OptionTypes return numberOption; } + public override NetData GetNetData() + { + return new NetData(Id, BitConverter.GetBytes(Value)); + } + + public override void HandleNetData(byte[] data) + { + SetValue(BitConverter.ToSingle(data)); + } + public override string GetHudStringText() { return Title + ": " + Value + Helpers.GetSuffix(SuffixType); @@ -61,7 +74,10 @@ namespace MiraAPI.GameOptions.OptionTypes if (OptionBehaviour is null) return; var opt = OptionBehaviour as NumberOption; - opt.Value = newValue; + 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 889ea8e..0f9f238 100644 --- a/MiraAPI/GameOptions/OptionTypes/ModdedOption.cs +++ b/MiraAPI/GameOptions/OptionTypes/ModdedOption.cs @@ -2,15 +2,18 @@ using MiraAPI.Roles; using Reactor.Localization.Utilities; using System; +using MiraAPI.Networking; +using Reactor.Utilities; using UnityEngine; namespace MiraAPI.GameOptions.OptionTypes { public abstract class ModdedOption : IModdedOption { - public T Value { get; set; } - public T DefaultValue { get; set; } - public Action ChangedEvent { get; private set; } + public uint Id { get; } + public T Value { get; protected set; } + public T DefaultValue { get; init; } + public Action ChangedEvent { get; set; } public string Title { get; } public StringNames StringName { get; } public Func Visible { get; set; } @@ -19,7 +22,7 @@ namespace MiraAPI.GameOptions.OptionTypes public ModdedOptionGroup Group { get; set; } = null; public IMiraPlugin ParentMod { get; set; } = null; - public ModdedOption(string title, T defaultValue, Type roleType) + public ModdedOption(string title, T defaultValue, Type roleType) : this() { Title = title; DefaultValue = defaultValue; @@ -32,6 +35,14 @@ namespace MiraAPI.GameOptions.OptionTypes AdvancedRole = roleType; } } + + public ModdedOption() + { + Logger.Error("created modded option"); + Id = ModdedOptionsManager.NextId++; + ModdedOptionsManager.Options.Add(this); + ModdedOptionsManager.ModdedOptions.Add(Id, this); + } public void ValueChanged(OptionBehaviour optionBehaviour) { @@ -50,6 +61,9 @@ namespace MiraAPI.GameOptions.OptionTypes OnValueChanged(newValue); } + public abstract NetData GetNetData(); + public abstract void HandleNetData(byte[] data); + public abstract void OnValueChanged(T newValue); public abstract T GetValueFromOptionBehaviour(OptionBehaviour optionBehaviour); diff --git a/MiraAPI/GameOptions/OptionTypes/ModdedStringOption.cs b/MiraAPI/GameOptions/OptionTypes/ModdedStringOption.cs index 5aee686..8141572 100644 --- a/MiraAPI/GameOptions/OptionTypes/ModdedStringOption.cs +++ b/MiraAPI/GameOptions/OptionTypes/ModdedStringOption.cs @@ -1,17 +1,15 @@ using Reactor.Localization.Utilities; +using System; using System.Linq; +using MiraAPI.Networking; using UnityEngine; using Object = UnityEngine.Object; namespace MiraAPI.GameOptions.OptionTypes { - public class ModdedStringOption : ModdedOption + public class ModdedStringOption(string title, int defaultValue, string[] values, Type roleType) : ModdedOption(title, defaultValue, roleType) { - public string[] Values { get; private set; } - public ModdedStringOption(string title, int defaultValue, string[] values, System.Type roleType) : base(title, defaultValue, roleType) - { - Values = values; - } + public string[] Values { get; private set; } = values; public override OptionBehaviour CreateOption(ToggleOption toggleOpt, NumberOption numberOpt, StringOption stringOpt, Transform container) { @@ -36,6 +34,16 @@ namespace MiraAPI.GameOptions.OptionTypes return stringOption; } + public override NetData GetNetData() + { + return new NetData(Id, BitConverter.GetBytes(Value)); + } + + public override void HandleNetData(byte[] data) + { + SetValue(BitConverter.ToInt32(data)); + } + public override string GetHudStringText() { return Title + ": " + Values[Value]; @@ -51,7 +59,10 @@ namespace MiraAPI.GameOptions.OptionTypes if (OptionBehaviour is null) return; var opt = OptionBehaviour as StringOption; - opt.Value = newValue; + if (opt) + { + 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 3564de4..91f9c19 100644 --- a/MiraAPI/GameOptions/OptionTypes/ModdedToggleOption.cs +++ b/MiraAPI/GameOptions/OptionTypes/ModdedToggleOption.cs @@ -1,13 +1,12 @@ -using UnityEngine; +using System; +using MiraAPI.Networking; +using UnityEngine; +using Object = UnityEngine.Object; namespace MiraAPI.GameOptions.OptionTypes { - public class ModdedToggleOption : ModdedOption + public class ModdedToggleOption(string title, bool defaultValue, System.Type roleType) : ModdedOption(title, defaultValue, roleType) { - public ModdedToggleOption(string title, bool defaultValue, System.Type roleType) : base(title, defaultValue, roleType) - { - } - public override OptionBehaviour CreateOption(ToggleOption toggleOpt, NumberOption numberOpt, StringOption stringOpt, Transform container) { var toggleOption = Object.Instantiate(toggleOpt, Vector3.zero, Quaternion.identity, container); @@ -28,6 +27,16 @@ namespace MiraAPI.GameOptions.OptionTypes return toggleOption; } + public override NetData GetNetData() + { + return new NetData(Id, BitConverter.GetBytes(Value)); + } + + public override void HandleNetData(byte[] data) + { + SetValue(BitConverter.ToBoolean(data)); + } + public override string GetHudStringText() { return Title + ": " + (Value ? "On" : "Off"); @@ -43,7 +52,10 @@ namespace MiraAPI.GameOptions.OptionTypes if (OptionBehaviour is null) return; var toggleOpt = OptionBehaviour as ToggleOption; - toggleOpt.CheckMark.enabled = newValue; + if (toggleOpt) + { + toggleOpt.CheckMark.enabled = newValue; + } DestroyableSingleton.Instance.Notifier.AddSettingsChangeMessage(StringName, Value ? "On" : "Off", false); } diff --git a/MiraAPI/MiraAPIPlugin.cs b/MiraAPI/MiraApiPlugin.cs similarity index 83% rename from MiraAPI/MiraAPIPlugin.cs rename to MiraAPI/MiraApiPlugin.cs index 3c67f3f..9faf789 100644 --- a/MiraAPI/MiraAPIPlugin.cs +++ b/MiraAPI/MiraApiPlugin.cs @@ -3,11 +3,11 @@ using BepInEx.Unity.IL2CPP; using HarmonyLib; using MiraAPI.PluginLoading; using Reactor; -using Reactor.Networking; -using Reactor.Networking.Attributes; using Reactor.Patches; using System; using System.Text; +using Reactor.Networking; +using Reactor.Networking.Attributes; using UnityEngine; namespace MiraAPI; @@ -16,26 +16,24 @@ namespace MiraAPI; [BepInProcess("Among Us.exe")] [BepInDependency(ReactorPlugin.Id)] [ReactorModFlags(ModFlags.RequireOnAllClients)] -public partial class MiraAPIPlugin : BasePlugin +public partial class MiraApiPlugin : BasePlugin { public Harmony Harmony { get; } = new(Id); - public static MiraAPIPlugin Instance { get; private set; } public static MiraPluginManager PluginManager { get; private set; } public static Color MiraColor = new Color32(238, 154, 112, 255); public override void Load() { - Instance = this; Harmony.PatchAll(); PluginManager = new MiraPluginManager(); PluginManager.Initialize(); - ReactorVersionShower.TextUpdated += (text) => + ReactorVersionShower.TextUpdated += text => { text.text = new StringBuilder($"{MiraColor.ToTextColor()}Mira API ") .Append(GetShortHashVersion(Version)) - .Append("\n") + .Append('\n') .Append(text.text) .ToString(); }; diff --git a/MiraAPI/Networking/NetData.cs b/MiraAPI/Networking/NetData.cs new file mode 100644 index 0000000..a0d66d5 --- /dev/null +++ b/MiraAPI/Networking/NetData.cs @@ -0,0 +1,10 @@ +using System; + +namespace MiraAPI.Networking; + +public readonly struct NetData(uint id, byte[] data) +{ + public uint Id { get; } = id; + public byte[] Data { get; } = data; + public int GetLength() => BitConverter.GetBytes(Id).Length + Data.Length; +} \ No newline at end of file diff --git a/MiraAPI/Networking/SyncOptionsRpc.cs b/MiraAPI/Networking/SyncOptionsRpc.cs index ee4aaca..564e2b4 100644 --- a/MiraAPI/Networking/SyncOptionsRpc.cs +++ b/MiraAPI/Networking/SyncOptionsRpc.cs @@ -1,4 +1,5 @@ using Hazel; +using MiraAPI.GameOptions; using Reactor.Networking.Attributes; using Reactor.Networking.Rpc; @@ -6,76 +7,41 @@ namespace MiraAPI.Networking; // METHOD RPC DOESNT WORK WITH THE ARRAYS AND STUFF SO THIS IS HOW WE WILL DO IT FOR NOW [RegisterCustomRpc((uint)MiraRpc.SyncGameOptions)] -public class SyncOptionsRpc(MiraAPIPlugin plugin, uint id) : PlayerCustomRpc(plugin, id) +public class SyncOptionsRpc(MiraApiPlugin plugin, uint id) : PlayerCustomRpc(plugin, id) { public override RpcLocalHandling LocalHandling => RpcLocalHandling.None; - - public readonly struct Data + + public override void Write(MessageWriter writer, NetData[] data) { - public readonly bool[] Toggles; - public readonly float[] Numbers; - public readonly int[] StringIDs; - - public Data(bool[] toggles, float[] numbers, int[] stringIDs) + writer.WritePacked((uint)data.Length); + foreach (var netData in data) { - Toggles = toggles; - Numbers = numbers; - StringIDs = stringIDs; + writer.WritePacked(netData.Id); + writer.WriteBytesAndSize(netData.Data); } } - public override void Write(MessageWriter writer, Data data) + public override NetData[] Read(MessageReader reader) { - writer.WritePacked((uint)data.Toggles.Length); - foreach (var t in data.Toggles) + var length = reader.ReadPackedUInt32(); + var data = new NetData[length]; + for (var i = 0; i < length; i++) { - writer.Write(t); + var id = reader.ReadPackedUInt32(); + var bytes = reader.ReadBytesAndSize(); + data[i] = new NetData(id, bytes); } - writer.WritePacked((uint)data.Numbers.Length); - foreach (var n in data.Numbers) - { - writer.Write(n); - } - - writer.WritePacked((uint)data.StringIDs.Length); - foreach (var n in data.StringIDs) - { - writer.WritePacked(n); - } + return data; } - public override Data Read(MessageReader reader) - { - var toggles = new bool[reader.ReadPackedUInt32()]; - for (var i = 0; i < toggles.Length; i++) - { - toggles[i] = reader.ReadBoolean(); - } - - var numbers = new float[reader.ReadPackedUInt32()]; - for (var i = 0; i < numbers.Length; i++) - { - numbers[i] = reader.ReadSingle(); - } - - var strings = new int[reader.ReadPackedUInt32()]; - for (var i = 0; i < strings.Length; i++) - { - strings[i] = reader.ReadPackedInt32(); - } - - - return new Data(toggles, numbers, strings); - } - - public override void Handle(PlayerControl playerControl, Data data) + public override void Handle(PlayerControl playerControl, NetData[] data) { if (AmongUsClient.Instance.HostId != playerControl.OwnerId) { return; } - //CustomOptionsManager.HandleOptionsSync(data.Toggles, data.Numbers, data.StringIDs); + ModdedOptionsManager.HandleSyncOptions(data); } } \ No newline at end of file diff --git a/MiraAPI/Networking/SyncRoleOptionsRpc.cs b/MiraAPI/Networking/SyncRoleOptionsRpc.cs index 280dd5a..4345ae1 100644 --- a/MiraAPI/Networking/SyncRoleOptionsRpc.cs +++ b/MiraAPI/Networking/SyncRoleOptionsRpc.cs @@ -8,7 +8,7 @@ using Reactor.Utilities; namespace MiraAPI.Networking; [RegisterCustomRpc((uint)MiraRpc.SyncRoleOptions)] -public class SyncRoleOptionsRpc(MiraAPIPlugin plugin, uint id) : PlayerCustomRpc(plugin, id) +public class SyncRoleOptionsRpc(MiraApiPlugin plugin, uint id) : PlayerCustomRpc(plugin, id) { public struct Data(ushort roleId, int number, int chance) @@ -42,8 +42,8 @@ public class SyncRoleOptionsRpc(MiraAPIPlugin plugin, uint id) : PlayerCustomRpc if (!CustomRoleManager.CustomRoles.TryGetValue(data.RoleId, out var roleBehaviour) || !CustomRoleManager.GetCustomRoleBehaviour(roleBehaviour.Role, out var role)) return; - PluginSingleton.Instance.Config.TryGetEntry(role.NumConfigDefinition, out var numEntry); - PluginSingleton.Instance.Config.TryGetEntry(role.ChanceConfigDefinition, out var chanceEntry); + PluginSingleton.Instance.Config.TryGetEntry(role.NumConfigDefinition, out var numEntry); + PluginSingleton.Instance.Config.TryGetEntry(role.ChanceConfigDefinition, out var chanceEntry); try { @@ -52,7 +52,7 @@ public class SyncRoleOptionsRpc(MiraAPIPlugin plugin, uint id) : PlayerCustomRpc } catch (Exception e) { - Logger.Warning(e.ToString()); + Logger.Warning(e.ToString()); } } } \ No newline at end of file diff --git a/MiraAPI/Patches/AmongUsClientSyncPatch.cs b/MiraAPI/Patches/AmongUsClientSyncPatch.cs new file mode 100644 index 0000000..e2c9a36 --- /dev/null +++ b/MiraAPI/Patches/AmongUsClientSyncPatch.cs @@ -0,0 +1,26 @@ +using HarmonyLib; +using InnerNet; +using MiraAPI.GameOptions; +using MiraAPI.Roles; + +namespace MiraAPI.Patches; + +[HarmonyPatch(typeof(AmongUsClient), nameof(AmongUsClient.CreatePlayer))] +public static class AmongUsClientSyncPatch +{ + public static void Postfix(ClientData clientData) + { + if (!AmongUsClient.Instance.AmHost) + { + return; + } + + if (clientData.Id == AmongUsClient.Instance.HostId) + { + return; + } + + ModdedOptionsManager.SyncAllOptions(clientData.Id); + CustomRoleManager.SyncRoleSettings(clientData.Id); + } +} \ No newline at end of file diff --git a/MiraAPI/Patches/Options/RoleSettingMenuPatches.cs b/MiraAPI/Patches/Options/RoleSettingMenuPatches.cs index 5bf13e3..3d21eee 100644 --- a/MiraAPI/Patches/Options/RoleSettingMenuPatches.cs +++ b/MiraAPI/Patches/Options/RoleSettingMenuPatches.cs @@ -5,6 +5,7 @@ using MiraAPI.Utilities.Assets; using Reactor.Utilities.Extensions; using System; using System.Linq; +using Reactor.Utilities; using TMPro; using UnityEngine; using UnityEngine.Events; @@ -80,10 +81,10 @@ namespace MiraAPI.Patches.Options var role = roleSetting.Role as ICustomRole; if (role.HideSettings) return; - MiraAPIPlugin.Instance.Config.TryGetEntry(role.NumConfigDefinition, out var numEntry); + PluginSingleton.Instance.Config.TryGetEntry(role.NumConfigDefinition, out var numEntry); numEntry.Value = roleSetting.RoleMaxCount; - MiraAPIPlugin.Instance.Config.TryGetEntry(role.ChanceConfigDefinition, out var chanceEntry); + PluginSingleton.Instance.Config.TryGetEntry(role.ChanceConfigDefinition, out var chanceEntry); chanceEntry.Value = roleSetting.RoleChance; roleSetting.UpdateValuesAndText(GameOptionsManager.Instance.CurrentGameOptions.RoleOptions); diff --git a/MiraAPI/Patches/Roles/RoleOptionsCollectionPatch.cs b/MiraAPI/Patches/Roles/RoleOptionsCollectionPatch.cs index bb64f64..e49c432 100644 --- a/MiraAPI/Patches/Roles/RoleOptionsCollectionPatch.cs +++ b/MiraAPI/Patches/Roles/RoleOptionsCollectionPatch.cs @@ -22,7 +22,7 @@ public static class RoleOptionsCollectionPatch return false; } - PluginSingleton.Instance.Config.TryGetEntry(customRole.ChanceConfigDefinition, out var entry); + PluginSingleton.Instance.Config.TryGetEntry(customRole.ChanceConfigDefinition, out var entry); __result = entry.Value; return false; } @@ -44,7 +44,7 @@ public static class RoleOptionsCollectionPatch return false; } - PluginSingleton.Instance.Config.TryGetEntry(customRole.NumConfigDefinition, out var entry); + PluginSingleton.Instance.Config.TryGetEntry(customRole.NumConfigDefinition, out var entry); __result = entry.Value; return false; } diff --git a/MiraAPI/PluginLoading/MiraPluginManager.cs b/MiraAPI/PluginLoading/MiraPluginManager.cs index 45953fd..370f3c6 100644 --- a/MiraAPI/PluginLoading/MiraPluginManager.cs +++ b/MiraAPI/PluginLoading/MiraPluginManager.cs @@ -39,7 +39,7 @@ public class MiraPluginManager RegisteredPlugins.Add(assembly, info); - Logger.Info($"Registering mod {id} with Mira API."); + Logger.Info($"Registering mod {id} with Mira API."); }; } diff --git a/MiraAPI/Roles/CustomRoleManager.cs b/MiraAPI/Roles/CustomRoleManager.cs index 9de57f5..7ed8808 100644 --- a/MiraAPI/Roles/CustomRoleManager.cs +++ b/MiraAPI/Roles/CustomRoleManager.cs @@ -17,11 +17,11 @@ namespace MiraAPI.Roles; public static class CustomRoleManager { - public static Dictionary CustomRoles = new(); + public static readonly Dictionary CustomRoles = new(); - public static int GetNextRoleId(ushort requestedId) + private static int GetNextRoleId(ushort requestedId) { - while (CustomRoles.ContainsKey(requestedId)) + while (CustomRoles.ContainsKey(requestedId) || requestedId <= Enum.GetNames().Length) { requestedId++; } @@ -38,7 +38,7 @@ public static class CustomRoleManager { if (!(typeof(RoleBehaviour).IsAssignableFrom(roleType) && typeof(ICustomRole).IsAssignableFrom(roleType))) { - Logger.Error($"{roleType?.Name} does not inherit from RoleBehaviour or ICustomRole."); + Logger.Error($"{roleType?.Name} does not inherit from RoleBehaviour or ICustomRole."); return null; } @@ -77,7 +77,7 @@ public static class CustomRoleManager return roleBehaviour; } - var config = PluginSingleton.Instance.Config; + var config = PluginSingleton.Instance.Config; config.Bind(customRole.NumConfigDefinition, 1); config.Bind(customRole.ChanceConfigDefinition, 100); @@ -141,13 +141,13 @@ public static class CustomRoleManager foreach (var role in CustomRoles.Values) { ICustomRole customRole = role as ICustomRole; - if (customRole.HideSettings) + if (customRole is null or { HideSettings: true }) { continue; } - PluginSingleton.Instance.Config.TryGetEntry(customRole.NumConfigDefinition, out var numEntry); - PluginSingleton.Instance.Config.TryGetEntry(customRole.ChanceConfigDefinition, out var chanceEntry); + PluginSingleton.Instance.Config.TryGetEntry(customRole.NumConfigDefinition, out var numEntry); + PluginSingleton.Instance.Config.TryGetEntry(customRole.ChanceConfigDefinition, out var chanceEntry); Rpc.Instance.Send(new SyncRoleOptionsRpc.Data((ushort)role.Role, numEntry.Value, chanceEntry.Value)); } @@ -158,13 +158,13 @@ public static class CustomRoleManager foreach (var role in CustomRoles.Values) { ICustomRole customRole = role as ICustomRole; - if (customRole.HideSettings) + if (customRole is null or { HideSettings: true }) { continue; } - PluginSingleton.Instance.Config.TryGetEntry(customRole.NumConfigDefinition, out var numEntry); - PluginSingleton.Instance.Config.TryGetEntry(customRole.ChanceConfigDefinition, out var chanceEntry); + PluginSingleton.Instance.Config.TryGetEntry(customRole.NumConfigDefinition, out var numEntry); + PluginSingleton.Instance.Config.TryGetEntry(customRole.ChanceConfigDefinition, out var chanceEntry); Rpc.Instance.SendTo(targetId, new SyncRoleOptionsRpc.Data((ushort)role.Role, numEntry.Value, chanceEntry.Value)); }