From 0d746869de78c3a8abacbce425e5f6561f9ceb0e Mon Sep 17 00:00:00 2001 From: ang-xd Date: Sat, 18 May 2024 01:30:57 -0400 Subject: [PATCH] Enum options --- MiraAPI.Example/ExampleOptions.cs | 11 ++++ MiraAPI.Example/ExamplePlugin.cs | 2 +- .../Attributes/ModdedEnumOptionAttribute.cs | 33 ++++++++++++ .../OptionTypes/ModdedEnumOption.cs | 51 +++++++++++++++++++ MiraAPI/GameOptions/UI/ModdedOptionsTab.cs | 5 +- .../Options/GameSettingsMenuPatches.cs | 2 +- MiraAPI/Patches/Options/HudStringPatch.cs | 6 +-- 7 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 MiraAPI/GameOptions/Attributes/ModdedEnumOptionAttribute.cs create mode 100644 MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs diff --git a/MiraAPI.Example/ExampleOptions.cs b/MiraAPI.Example/ExampleOptions.cs index 0ee7d49..0f04cf0 100644 --- a/MiraAPI.Example/ExampleOptions.cs +++ b/MiraAPI.Example/ExampleOptions.cs @@ -1,14 +1,25 @@ using MiraAPI.GameOptions; using MiraAPI.GameOptions.Attributes; +using UnityEngine; namespace MiraAPI.Example { public class ExampleOptions : IModdedOptionGroup { public string GroupName => "General Group"; + public Color GroupColor => Color.red; + [ModdedToggleOption("Use Thing")] public bool useThing { get; set; } = true; [ModdedToggleOption("Use another thing")] public bool useAnotherThing { get; set; } = false; [ModdedNumberOption("Sussy level", min: 0, max: 10)] public float sussyLevel { get; set; } = 4f; [ModdedStringOption("Sus choices", ["hello", "hello 2", "hello 3"])] public int susChoices { get; set; } = 0; + [ModdedEnumOption("Enum test", typeof(TestEnum))] public TestEnum enumTest { get; set; } = TestEnum.Hello; + } + + public enum TestEnum + { + Hello, + Hi, + Bye } } diff --git a/MiraAPI.Example/ExamplePlugin.cs b/MiraAPI.Example/ExamplePlugin.cs index 3371c5d..007f0c4 100644 --- a/MiraAPI.Example/ExamplePlugin.cs +++ b/MiraAPI.Example/ExamplePlugin.cs @@ -18,7 +18,7 @@ public partial class ExamplePlugin : BasePlugin, IMiraConfig public static ExamplePlugin Instance { get; private set; } public ModdedOptionTabSettings TabSettings => new ModdedOptionTabSettings() { - Title = "Example Mod", + Title = "MiraAPI Example Mod", TabIcon = MiraAssets.Empty }; diff --git a/MiraAPI/GameOptions/Attributes/ModdedEnumOptionAttribute.cs b/MiraAPI/GameOptions/Attributes/ModdedEnumOptionAttribute.cs new file mode 100644 index 0000000..0b9d7e2 --- /dev/null +++ b/MiraAPI/GameOptions/Attributes/ModdedEnumOptionAttribute.cs @@ -0,0 +1,33 @@ +using MiraAPI.GameOptions.OptionTypes; +using System; +using System.Reflection; + +namespace MiraAPI.GameOptions.Attributes +{ + public class ModdedEnumOptionAttribute : ModdedOptionAttribute + { + public Type EnumType; + public ModdedEnumOptionAttribute(string title, Type enumType, Type roleType = null) : base(title, roleType) + { + EnumType = enumType; + } + + public override IModdedOption CreateOption(object value, PropertyInfo property) + { + var opt = new ModdedEnumOption(Title, (int)value, EnumType, RoleType); + return opt; + } + + public override void SetValue(object value) + { + ModdedEnumOption opt = HolderOption as ModdedEnumOption; + opt.SetValue((int)value); + } + + public override object GetValue() + { + ModdedEnumOption opt = HolderOption as ModdedEnumOption; + return Enum.ToObject(EnumType.GetType(), opt.Value); + } + } +} diff --git a/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs b/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs new file mode 100644 index 0000000..6a00e2d --- /dev/null +++ b/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs @@ -0,0 +1,51 @@ +using Reactor.Localization.Utilities; +using System; +using System.Linq; +using UnityEngine; + +namespace MiraAPI.GameOptions.OptionTypes +{ + public class ModdedEnumOption : ModdedOption + { + public string[] Values; + + public ModdedEnumOption(string title, int defaultValue, Type enumType, System.Type roleType) : base(title, defaultValue, roleType) + { + Values = Enum.GetNames(enumType); + } + + public override OptionBehaviour CreateOption(ToggleOption toggleOpt, NumberOption numberOpt, StringOption stringOpt, Transform container) + { + var stringOption = UnityEngine.Object.Instantiate(stringOpt, container); + + stringOption.name = Title; + stringOption.Title = StringName; + stringOption.Value = Value; + stringOption.Values = Values.Select(CustomStringName.CreateAndRegister).ToArray(); + stringOption.OnValueChanged = (Il2CppSystem.Action)ValueChanged; + stringOption.OnEnable(); + + OptionBehaviour = stringOption; + + return stringOption; + } + + public override string GetHudStringText() + { + return Title + ": " + Values[Value]; + } + + public override int GetValueFromOptionBehaviour(OptionBehaviour optionBehaviour) + { + return optionBehaviour.GetInt(); + } + + public override void OnValueChanged(int newValue) + { + if (OptionBehaviour is null) return; + + StringOption opt = OptionBehaviour as StringOption; + opt.Value = newValue; + } + } +} diff --git a/MiraAPI/GameOptions/UI/ModdedOptionsTab.cs b/MiraAPI/GameOptions/UI/ModdedOptionsTab.cs index f9a09ef..cf5c6ae 100644 --- a/MiraAPI/GameOptions/UI/ModdedOptionsTab.cs +++ b/MiraAPI/GameOptions/UI/ModdedOptionsTab.cs @@ -65,12 +65,13 @@ public static class ModdedOptionsTab })); } - public static GameObject CreateHeader(ToggleOption toggleOpt, Transform container, string title) + public static GameObject CreateHeader(ToggleOption toggleOpt, Transform container, string title, Color color) { var header = Object.Instantiate(toggleOpt, container); header.Title = StringNames.None; header.TitleText.text = title; + header.TitleText.color = color; header.name = "Header"; var checkBox = header.transform.FindChild("CheckBox")?.gameObject; @@ -146,7 +147,7 @@ public static class ModdedOptionsTab var launchpadGroup = newSettings.transform.FindChild("GameGroup").gameObject; var text = launchpadGroup.transform.FindChild("Text").gameObject.GetComponent(); text.gameObject.GetComponent().Destroy(); - text.text = $"{config.TabSettings.Title}"; + text.text = $"{config.TabSettings.Title} Options"; return newSettings; } diff --git a/MiraAPI/Patches/Options/GameSettingsMenuPatches.cs b/MiraAPI/Patches/Options/GameSettingsMenuPatches.cs index 04ff2bb..333ddcd 100644 --- a/MiraAPI/Patches/Options/GameSettingsMenuPatches.cs +++ b/MiraAPI/Patches/Options/GameSettingsMenuPatches.cs @@ -38,7 +38,7 @@ public static class GameSettingsMenuPatches foreach (var group in ModdedOptionsManager.Groups.Where(group => group.AdvancedRole == null && group.ParentMod == pair.Value)) { - group.Header = ModdedOptionsTab.CreateHeader(toggleOpt, container, group.GroupName); + group.Header = ModdedOptionsTab.CreateHeader(toggleOpt, container, group.GroupName, group.GroupColor); CreateOptionsFor(__instance, toggleOpt, numberOpt, stringOpt, container, ModdedOptionsManager.Options.Where(x => x.Group == group).ToList()); } diff --git a/MiraAPI/Patches/Options/HudStringPatch.cs b/MiraAPI/Patches/Options/HudStringPatch.cs index 7daa59d..f079c8f 100644 --- a/MiraAPI/Patches/Options/HudStringPatch.cs +++ b/MiraAPI/Patches/Options/HudStringPatch.cs @@ -69,7 +69,7 @@ public static class ToHudStringPatch return; } - var sb = new StringBuilder($"{currentPlugin.TabSettings.Title}:\n"); + var sb = new StringBuilder($"{currentPlugin.TabSettings.Title} Options:\n"); var groupsWithRoles = ModdedOptionsManager.Groups.Where(group => group.AdvancedRole != null && group.ParentMod == currentPlugin); var groupsWithoutRoles = ModdedOptionsManager.Groups.Where(group => group.AdvancedRole == null && group.ParentMod == currentPlugin); @@ -84,7 +84,7 @@ public static class ToHudStringPatch continue; } - sb.AppendLine($"\n{group.GroupName}"); + sb.AppendLine($"\n{group.GroupColor.ToTextColor()}{group.GroupName}"); AddOptions(sb, ModdedOptionsManager.Options.Where(x => x.Group == group).ToList()); } @@ -100,7 +100,7 @@ public static class ToHudStringPatch continue; } - sb.AppendLine($"{group.GroupName}"); + sb.AppendLine($"{group.GroupColor.ToTextColor()}{group.GroupName}"); AddOptions(sb, ModdedOptionsManager.Options.Where(x => x.Group == group).ToList()); sb.Append("\n"); }