diff --git a/MiraAPI/GameOptions/CustomOptionsManager.cs b/MiraAPI/GameOptions/CustomOptionsManager.cs index 2f34102..072138a 100644 --- a/MiraAPI/GameOptions/CustomOptionsManager.cs +++ b/MiraAPI/GameOptions/CustomOptionsManager.cs @@ -4,7 +4,6 @@ using MiraAPI.GameOptions; using MiraAPI.Networking.Options; using Reactor.Networking.Rpc; using Reactor.Utilities; -using System; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -19,15 +18,10 @@ public static class CustomOptionsManager public static readonly List CustomToggleOptions = []; public static readonly List CustomStringOptions = []; public static readonly List CustomGroups = []; - public static readonly List RegisteredMods = []; + public static readonly Dictionary RegisteredMods = []; - public static void RegisterOptionsForMod(Type type, List fields, string modId) + public static void RegisterOptionsForMod(IModOptions type, List fields, string modId) { - if (!typeof(IModOptions).IsAssignableFrom(type)) - { - Debug.LogError($"Cannot register options for {modId}! Missing IModOptions interface."); - return; - } PluginInfo info = IL2CPPChainloader.Instance.Plugins[modId]; if (info == null) @@ -37,7 +31,8 @@ public static class CustomOptionsManager Debug.Log($"Registering Options for {modId}"); - RegisteredMods.Add(info); + RegisteredMods.Add(info, type); + foreach (FieldInfo field in fields) { AbstractGameOption option = (AbstractGameOption)field.GetValue(null); diff --git a/MiraAPI/GameOptions/CustomOptionsTab.cs b/MiraAPI/GameOptions/CustomOptionsTab.cs index 91bc614..c1c8e31 100644 --- a/MiraAPI/GameOptions/CustomOptionsTab.cs +++ b/MiraAPI/GameOptions/CustomOptionsTab.cs @@ -1,4 +1,5 @@ -using Reactor.Utilities.Extensions; +using MiraAPI.GameOptions; +using Reactor.Utilities.Extensions; using System; using System.Collections.Generic; using TMPro; @@ -10,22 +11,21 @@ public static class CustomOptionsTab { public static List CustomTabs; public static List CustomScreens; - public static SpriteRenderer Rend; - public static GameObject Initialize(GameSettingMenu __instance) + public static GameObject InitializeForMod(IModOptions modOptions, GameSettingMenu __instance) { var gameBtn = __instance.transform.FindChild("Header/Tabs/GameTab").gameObject; var roleBtn = __instance.transform.FindChild("Header/Tabs/RoleTab").gameObject; var screen = CreateNewMenu(__instance); - var tab = CreateCustomTab(__instance, screen, gameBtn, roleBtn); + var tab = CreateCustomTab(modOptions, __instance, screen, gameBtn, roleBtn); CustomScreens.Add(screen); CustomTabs.Add(tab); - Rend = tab.transform.FindChild("Btn/Tab Background").GetComponent(); - Rend.enabled = false; + SpriteRenderer rend = tab.transform.FindChild("Btn/Tab Background").GetComponent(); + rend.enabled = false; - UpdateListeners(__instance, gameBtn.GetComponentInChildren(), roleBtn.GetComponentInChildren(), Rend); + UpdateListeners(__instance, gameBtn.GetComponentInChildren(), roleBtn.GetComponentInChildren(), rend); var container = screen.transform.FindChild("GameGroup/SliderInner"); container.DestroyChildren(); @@ -34,6 +34,7 @@ public static class CustomOptionsTab return container.gameObject; } + /*private static void CreateNewResetButton(GameSettingMenu __instance, Transform container) { var resetBtn = __instance.RegularGameSettings.transform.FindChild("GameGroup/SliderInner/ResetToDefault"); @@ -111,7 +112,7 @@ public static class CustomOptionsTab return header.gameObject; } - public static GameObject CreateCustomTab(GameSettingMenu __instance, GameObject newSettings, + public static GameObject CreateCustomTab(IModOptions options, GameSettingMenu __instance, GameObject newSettings, GameObject gameTab, GameObject roleTab) { var newTab = Object.Instantiate(gameTab, gameTab.transform.parent); @@ -128,7 +129,7 @@ public static class CustomOptionsTab btn.OnClick.AddListener((Action)TabAction); var spriteRend = inside.GetComponentInChildren(); - //spriteRend.sprite = LaunchpadAssets.HackButton.LoadAsset(); + spriteRend.sprite = options.OptionsTabIcon.LoadAsset(); spriteRend.gameObject.transform.localScale = new Vector3(0.4f, 0.4f, 0.4f); return newTab; diff --git a/MiraAPI/Patches/Options/GameSettingsMenuPatches.cs b/MiraAPI/Patches/Options/GameSettingsMenuPatches.cs index 1531a7d..d352239 100644 --- a/MiraAPI/Patches/Options/GameSettingsMenuPatches.cs +++ b/MiraAPI/Patches/Options/GameSettingsMenuPatches.cs @@ -25,42 +25,45 @@ public static class GameSettingsMenuPatches CustomOptionsTab.CustomTabs = new(); - __instance.Tabs.transform.position += new Vector3(0.5f, 0, 0); _gameBtn = __instance.transform.FindChild("Header/Tabs/GameTab").gameObject; _roleBtn = __instance.transform.FindChild("Header/Tabs/RoleTab").gameObject; var numberOpt = __instance.RegularGameSettings.GetComponentInChildren(); var toggleOpt = Object.FindObjectOfType(); var stringOpt = __instance.RegularGameSettings.GetComponentInChildren(); - var container = GameManager.Instance.IsNormal() ? CustomOptionsTab.Initialize(__instance).transform : __instance.HideAndSeekScroller.Inner; - foreach (var group in CustomOptionsManager.CustomGroups.Where(group => group.AdvancedRole == null)) + foreach (var pair in CustomOptionsManager.RegisteredMods) { - if (GameManager.Instance.IsNormal()) + var container = CustomOptionsTab.InitializeForMod(pair.Value, __instance).transform; + + foreach (var group in CustomOptionsManager.CustomGroups.Where(group => group.AdvancedRole == null && group.ParentMod == pair.Key)) { + if (GameManager.Instance.IsNormal()) + { + group.Header = CustomOptionsTab.CreateHeader(toggleOpt, container, group.Title); + CreateOptionsFor(__instance, toggleOpt, numberOpt, stringOpt, container, + group.CustomToggleOptions, group.CustomNumberOptions, group.CustomStringOptions); + continue; + } + + if (!group.Options.Any(x => x.ShowInHideNSeek)) + { + continue; + } + group.Header = CustomOptionsTab.CreateHeader(toggleOpt, container, group.Title); + __instance.AllHideAndSeekItems = __instance.AllHideAndSeekItems.Append(group.Header.transform).ToArray(); + CreateOptionsFor(__instance, toggleOpt, numberOpt, stringOpt, container, group.CustomToggleOptions, group.CustomNumberOptions, group.CustomStringOptions); - continue; } - if (!group.Options.Any(x => x.ShowInHideNSeek)) - { - continue; - } - - group.Header = CustomOptionsTab.CreateHeader(toggleOpt, container, group.Title); - __instance.AllHideAndSeekItems = __instance.AllHideAndSeekItems.Append(group.Header.transform).ToArray(); - CreateOptionsFor(__instance, toggleOpt, numberOpt, stringOpt, container, - group.CustomToggleOptions, group.CustomNumberOptions, group.CustomStringOptions); + CustomOptionsManager.CustomToggleOptions.Where(option => option.Group == null && option.ParentMod == pair.Key), + CustomOptionsManager.CustomNumberOptions.Where(option => option.Group == null && option.ParentMod == pair.Key), + CustomOptionsManager.CustomStringOptions.Where(option => option.Group == null && option.ParentMod == pair.Key)); } - CreateOptionsFor(__instance, toggleOpt, numberOpt, stringOpt, container, - CustomOptionsManager.CustomToggleOptions.Where(option => option.Group == null), - CustomOptionsManager.CustomNumberOptions.Where(option => option.Group == null), - CustomOptionsManager.CustomStringOptions.Where(option => option.Group == null)); - if (!numberOpt || !toggleOpt || !stringOpt) { Logger.Error("OPTION PREFABS MISSING"); @@ -84,7 +87,6 @@ public static class GameSettingsMenuPatches __instance.RolesSettings.gameObject.SetActive(false); //CustomOptionsTab.CustomScreen.gameObject.SetActive(true); - CustomOptionsTab.Rend.enabled = true; __instance.GameSettingsHightlight.enabled = false; __instance.RolesSettingsHightlight.enabled = false; diff --git a/MiraAPI/Patches/Options/ToHudStringPatch.cs b/MiraAPI/Patches/Options/ToHudStringPatch.cs index 8e2c633..fae516d 100644 --- a/MiraAPI/Patches/Options/ToHudStringPatch.cs +++ b/MiraAPI/Patches/Options/ToHudStringPatch.cs @@ -89,7 +89,7 @@ public static class ToHudStringPatch if (CurrentPage != 0) { - PluginInfo currentPlugin = CustomOptionsManager.RegisteredMods[CurrentPage - 1]; + PluginInfo currentPlugin = CustomOptionsManager.RegisteredMods.Keys.ToArray()[CurrentPage - 1]; if (currentPlugin == null) { CurrentPage = 0;