diff --git a/MiraAPI/GameOptions/Attributes/ModdedEnumOptionAttribute.cs b/MiraAPI/GameOptions/Attributes/ModdedEnumOptionAttribute.cs index 54680f2..da3a399 100644 --- a/MiraAPI/GameOptions/Attributes/ModdedEnumOptionAttribute.cs +++ b/MiraAPI/GameOptions/Attributes/ModdedEnumOptionAttribute.cs @@ -32,3 +32,33 @@ public class ModdedEnumOptionAttribute(string title, Type enumType, string[]? va : throw new InvalidOperationException($"HolderOption for option \"{Title}\" with EnumType ${enumType.FullName} is not a ModdedEnumOption"); } } + +/// +/// Generic attribute for creating an enum option. +/// +/// An enum type. +[AttributeUsage(AttributeTargets.Property)] +public class ModdedEnumOptionAttribute(string title, string[]? values = null) + : ModdedOptionAttribute(title) where T : struct, Enum +{ + internal override IModdedOption CreateOption(object? value, PropertyInfo property) + { + var opt = new ModdedEnumOption(Title, (T)(value ?? 0), values); + return opt; + } + + /// + public override void SetValue(object value) + { + var opt = HolderOption as ModdedEnumOption; + opt?.SetValue((int)value); + } + + /// + public override object GetValue() + { + return HolderOption is ModdedEnumOption opt + ? Enum.ToObject(typeof(T), opt.Value) + : throw new InvalidOperationException($"HolderOption for option \"{Title}\" is not a ModdedEnumOption<{typeof(T).Name}>"); + } +} diff --git a/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs b/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs index 3c6c84c..4a92267 100644 --- a/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs +++ b/MiraAPI/GameOptions/OptionTypes/ModdedEnumOption.cs @@ -35,9 +35,10 @@ public class ModdedEnumOption : ModdedOption data.Title = StringName; data.Type = global::OptionTypes.String; - data.Values = values is null ? - Enum.GetNames(enumType).Select(CustomStringName.CreateAndRegister).ToArray() - : values.Select(CustomStringName.CreateAndRegister).ToArray(); + data.Values = (values is null + ? Enum.GetNames(enumType) + : values) + .Select(CustomStringName.CreateAndRegister).ToArray(); data.Index = Value; } @@ -50,7 +51,7 @@ public class ModdedEnumOption : ModdedOption stringOption.SetUpFromData(Data, 20); stringOption.OnValueChanged = (Il2CppSystem.Action)ValueChanged; - // SetUpFromData method doesnt work correctly so we must set the values manually + // SetUpFromData method doesn't work correctly so we must set the values manually stringOption.Title = StringName; stringOption.Values = (Data as StringGameSetting)?.Values ?? new Il2CppStructArray(0); stringOption.Value = Value; @@ -126,8 +127,9 @@ public class ModdedEnumOption : ModdedOption where T : struct, Enum data.Title = StringName; data.Type = global::OptionTypes.String; data.Values = (values is null - ? Enum.GetNames().Select(CustomStringName.CreateAndRegister) - : values.Select(CustomStringName.CreateAndRegister)).ToArray(); + ? Enum.GetNames() + : values) + .Select(CustomStringName.CreateAndRegister).ToArray(); data.Index = Convert.ToInt32(Value, NumberFormatInfo.InvariantInfo); }