From 1ab662bcf122736a247df37a3d14389780262181 Mon Sep 17 00:00:00 2001 From: David Higueros <111460331+TheDavSmasher@users.noreply.github.com> Date: Mon, 21 Sep 2026 18:48:09 -0600 Subject: [PATCH 1/5] Adds a generic IModdedOptionList definition for easier typed iteration --- MiraAPI/GameOptions/IModdedOption.cs | 19 ++++++++++++++++--- .../OptionTypes/ModdedOptionList.cs | 13 +++++++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/MiraAPI/GameOptions/IModdedOption.cs b/MiraAPI/GameOptions/IModdedOption.cs index 099194e1..7ecc57cb 100644 --- a/MiraAPI/GameOptions/IModdedOption.cs +++ b/MiraAPI/GameOptions/IModdedOption.cs @@ -1,8 +1,8 @@ -using System; -using System.Collections.Generic; -using BepInEx.Configuration; +using BepInEx.Configuration; using MiraAPI.Networking; using MiraAPI.PluginLoading; +using System; +using System.Collections.Generic; using UnityEngine; namespace MiraAPI.GameOptions; @@ -122,3 +122,16 @@ public interface IModdedOption public interface IModdedOptionList : IReadOnlyList { } + +/// +/// Interface for list of options. +/// +/// The type of . +public interface IModdedOptionList : IModdedOptionList where T : IModdedOption +{ + /// + new T this[int index] { get; } + + /// + new IEnumerator GetEnumerator(); +} diff --git a/MiraAPI/GameOptions/OptionTypes/ModdedOptionList.cs b/MiraAPI/GameOptions/OptionTypes/ModdedOptionList.cs index 5a764b21..88b32c50 100644 --- a/MiraAPI/GameOptions/OptionTypes/ModdedOptionList.cs +++ b/MiraAPI/GameOptions/OptionTypes/ModdedOptionList.cs @@ -9,7 +9,7 @@ namespace MiraAPI.GameOptions.OptionTypes; /// Represents a modded option list. /// /// The type of options. -public class ModdedOptionList : IModdedOptionList where T : IModdedOption +public class ModdedOptionList : IModdedOptionList where T : IModdedOption { /// public int Count { get; } @@ -40,10 +40,10 @@ public ModdedOptionList(IEnumerable options) Options = options.ToArray(); } - /// - public IEnumerator GetEnumerator() + /// + public IEnumerator GetEnumerator() { - return ((IEnumerable)Options).GetEnumerator(); + return Options.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() @@ -51,6 +51,11 @@ IEnumerator IEnumerable.GetEnumerator() return Options.GetEnumerator(); } + IEnumerator IEnumerable.GetEnumerator() + { + return ((IEnumerable)Options).GetEnumerator(); + } + /// /// Indexes the option of type . /// From ffe9194d54a882913879623d50a410bc7f34f7d8 Mon Sep 17 00:00:00 2001 From: David Higueros <111460331+TheDavSmasher@users.noreply.github.com> Date: Fri, 25 Sep 2026 11:47:12 -0600 Subject: [PATCH 2/5] Resolved warnings --- MiraAPI/GameOptions/IModdedOption.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/MiraAPI/GameOptions/IModdedOption.cs b/MiraAPI/GameOptions/IModdedOption.cs index 7ecc57cb..5d424bbc 100644 --- a/MiraAPI/GameOptions/IModdedOption.cs +++ b/MiraAPI/GameOptions/IModdedOption.cs @@ -1,8 +1,8 @@ -using BepInEx.Configuration; +using System; +using System.Collections.Generic; +using BepInEx.Configuration; using MiraAPI.Networking; using MiraAPI.PluginLoading; -using System; -using System.Collections.Generic; using UnityEngine; namespace MiraAPI.GameOptions; @@ -127,11 +127,12 @@ public interface IModdedOptionList : IReadOnlyList /// Interface for list of options. /// /// The type of . -public interface IModdedOptionList : IModdedOptionList where T : IModdedOption +public interface IModdedOptionList : IModdedOptionList + where T : IModdedOption { - /// + /// new T this[int index] { get; } - /// + /// new IEnumerator GetEnumerator(); } From 1b587547f770f8dfcbe8c5c21e4bc396724ec862 Mon Sep 17 00:00:00 2001 From: David Higueros <111460331+TheDavSmasher@users.noreply.github.com> Date: Fri, 25 Sep 2026 12:43:14 -0600 Subject: [PATCH 3/5] Added ConfigName property to IModdedOptionList to optionally rename the individual options --- MiraAPI/GameOptions/IModdedOption.cs | 6 ++++++ MiraAPI/GameOptions/ModdedOptionsManager.cs | 4 +++- MiraAPI/GameOptions/OptionTypes/ModdedOptionList.cs | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/MiraAPI/GameOptions/IModdedOption.cs b/MiraAPI/GameOptions/IModdedOption.cs index 5d424bbc..fdf71a62 100644 --- a/MiraAPI/GameOptions/IModdedOption.cs +++ b/MiraAPI/GameOptions/IModdedOption.cs @@ -121,6 +121,12 @@ public interface IModdedOption /// public interface IModdedOptionList : IReadOnlyList { + /// + /// Gets the function to name the keys of the individual options in the configuration file. + /// + /// Return to use the default of the property's name with its index appended. + /// + Func? ConfigName { get; init; } } /// diff --git a/MiraAPI/GameOptions/ModdedOptionsManager.cs b/MiraAPI/GameOptions/ModdedOptionsManager.cs index 387a1f80..3518084b 100644 --- a/MiraAPI/GameOptions/ModdedOptionsManager.cs +++ b/MiraAPI/GameOptions/ModdedOptionsManager.cs @@ -198,9 +198,11 @@ internal static void RegisterPropertyOptionList(Type type, PropertyInfo property return; } + Func configName = optionList.ConfigName ?? (i => property.Name + i); + for (int i = 0; i < optionList.Count; i++) { - RegisterOption(optionList[i], group, property.Name + i, pluginInfo); + RegisterOption(optionList[i], group, configName(i), pluginInfo); } } diff --git a/MiraAPI/GameOptions/OptionTypes/ModdedOptionList.cs b/MiraAPI/GameOptions/OptionTypes/ModdedOptionList.cs index a09b15be..11b54c3c 100644 --- a/MiraAPI/GameOptions/OptionTypes/ModdedOptionList.cs +++ b/MiraAPI/GameOptions/OptionTypes/ModdedOptionList.cs @@ -20,6 +20,9 @@ public class ModdedOptionList : IModdedOptionList /// public IReadOnlyList Options { get; } + /// + public Func? ConfigName { get; init; } + /// /// Initializes a new instance of the class. /// From 2d4619f2cfe813848013726122d9d7c7a3818972 Mon Sep 17 00:00:00 2001 From: David Higueros <111460331+TheDavSmasher@users.noreply.github.com> Date: Fri, 25 Sep 2026 12:44:44 -0600 Subject: [PATCH 4/5] Used generic interface for ModdedOptionList --- MiraAPI/GameOptions/OptionTypes/ModdedOptionList.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MiraAPI/GameOptions/OptionTypes/ModdedOptionList.cs b/MiraAPI/GameOptions/OptionTypes/ModdedOptionList.cs index 11b54c3c..257ae6ee 100644 --- a/MiraAPI/GameOptions/OptionTypes/ModdedOptionList.cs +++ b/MiraAPI/GameOptions/OptionTypes/ModdedOptionList.cs @@ -9,7 +9,7 @@ namespace MiraAPI.GameOptions.OptionTypes; /// Represents a modded option list. /// /// The type of options. -public class ModdedOptionList : IModdedOptionList +public class ModdedOptionList : IModdedOptionList where T : IModdedOption { /// From 7ee4d7da969a0e5ccb085dca6240dcb66aaf7cb0 Mon Sep 17 00:00:00 2001 From: Atony <75191600+AtonyGit@users.noreply.github.com> Date: Mon, 5 Oct 2026 01:00:01 -0500 Subject: [PATCH 5/5] Bump appended number for option lists --- MiraAPI/GameOptions/ModdedOptionsManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MiraAPI/GameOptions/ModdedOptionsManager.cs b/MiraAPI/GameOptions/ModdedOptionsManager.cs index 3518084b..b893040c 100644 --- a/MiraAPI/GameOptions/ModdedOptionsManager.cs +++ b/MiraAPI/GameOptions/ModdedOptionsManager.cs @@ -198,7 +198,7 @@ internal static void RegisterPropertyOptionList(Type type, PropertyInfo property return; } - Func configName = optionList.ConfigName ?? (i => property.Name + i); + Func configName = optionList.ConfigName ?? (i => property.Name + (i + 1)); for (int i = 0; i < optionList.Count; i++) { @@ -279,7 +279,7 @@ internal static void RegisterAttributeOptionList( option.Visible = () => visibilityFunc(i); } - RegisterOption(option, group, property.Name + i, pluginInfo); + RegisterOption(option, group, property.Name + (i + 1), pluginInfo); } }