diff --git a/MiraAPI.Example/ExampleOptions2.cs b/MiraAPI.Example/ExampleOptions2.cs
new file mode 100644
index 0000000..e6b8fb6
--- /dev/null
+++ b/MiraAPI.Example/ExampleOptions2.cs
@@ -0,0 +1,27 @@
+using MiraAPI.GameOptions;
+using MiraAPI.GameOptions.OptionTypes;
+
+namespace MiraAPI.Example;
+
+public class ExampleOptions2 : IModdedOptionGroup
+{
+ public string GroupName => "Example 2";
+
+ public ModdedToggleOption UseThing { get; } = new("Use Thingy 5", false);
+
+ public ModdedToggleOption UseThing2 { get; } = new("Use Thingy 6", false);
+
+ public ModdedStringOption Sussy { get; } = new("Sussy", 0, ["Sussy 1", "Sussy 2", "Sussy 3"]);
+
+ public ModdedEnumOption SussyEnum { get; } = new("Sussy Enum", 0, typeof(SussyEnum));
+
+ public ModdedNumberOption YeezyLevel { get; } = new("Yeezy Level", 50, 0, 100, 25, NumberSuffixes.Multiplier);
+}
+
+public enum SussyEnum
+{
+ Sussy,
+ Baka,
+ Imposter,
+ Kanye
+}
\ No newline at end of file
diff --git a/MiraAPI.Example/MiraAPI.Example.csproj b/MiraAPI.Example/MiraAPI.Example.csproj
index 0f097ae..193a9ed 100644
--- a/MiraAPI.Example/MiraAPI.Example.csproj
+++ b/MiraAPI.Example/MiraAPI.Example.csproj
@@ -12,14 +12,14 @@
Steam
- 2024.3.5
+ 2024.6.18
-
-
-
-
+
+
+
+
diff --git a/MiraAPI/GameOptions/IModdedOption.cs b/MiraAPI/GameOptions/IModdedOption.cs
index 059657d..9822eb1 100644
--- a/MiraAPI/GameOptions/IModdedOption.cs
+++ b/MiraAPI/GameOptions/IModdedOption.cs
@@ -9,7 +9,7 @@ public interface IModdedOption
{
public uint Id { get; }
public BaseGameSetting Data { get; }
- public ModdedOptionGroup Group { get; set; }
+ public IModdedOptionGroup Group { get; set; }
public IMiraPlugin ParentMod { get; set; }
public Type AdvancedRole { get; }
public OptionBehaviour OptionBehaviour { get; protected set; }
diff --git a/MiraAPI/GameOptions/ModdedGroupSingleton.cs b/MiraAPI/GameOptions/ModdedGroupSingleton.cs
index 4d1ee95..8019537 100644
--- a/MiraAPI/GameOptions/ModdedGroupSingleton.cs
+++ b/MiraAPI/GameOptions/ModdedGroupSingleton.cs
@@ -3,7 +3,7 @@ using System.Linq;
namespace MiraAPI.GameOptions;
-public class ModdedGroupSingleton where T : ModdedOptionGroup
+public class ModdedGroupSingleton where T : IModdedOptionGroup
{
private static T _instance;
diff --git a/MiraAPI/GameOptions/ModdedOptionGroup.cs b/MiraAPI/GameOptions/ModdedOptionGroup.cs
deleted file mode 100644
index 6d0dfa9..0000000
--- a/MiraAPI/GameOptions/ModdedOptionGroup.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using MiraAPI.PluginLoading;
-using System;
-using UnityEngine;
-
-namespace MiraAPI.GameOptions;
-
-public class ModdedOptionGroup
-{
- public IMiraPlugin ParentMod;
- public GameObject Header;
- public string GroupName;
- public Func GroupVisible;
- public Color GroupColor;
- public Type AdvancedRole;
-}
\ No newline at end of file
diff --git a/MiraAPI/GameOptions/ModdedOptionsManager.cs b/MiraAPI/GameOptions/ModdedOptionsManager.cs
index 67ef5c1..02e99f9 100644
--- a/MiraAPI/GameOptions/ModdedOptionsManager.cs
+++ b/MiraAPI/GameOptions/ModdedOptionsManager.cs
@@ -14,9 +14,9 @@ public class ModdedOptionsManager
{
public static readonly Dictionary ModdedOptions = new();
public static readonly List Options = [];
- public static readonly List Groups = [];
+ public static readonly List Groups = [];
private static readonly Dictionary OptionAttributes = new();
- public static readonly Dictionary OriginalTypes = new();
+ public static readonly Dictionary OriginalTypes = new();
public static uint NextId = 1;
public static IModdedOption RegisterOption(Type type, ModdedOptionAttribute attribute, PropertyInfo property)
diff --git a/MiraAPI/GameOptions/OptionTypes/ModdedNumberOption.cs b/MiraAPI/GameOptions/OptionTypes/ModdedNumberOption.cs
index 11c21c5..72882db 100644
--- a/MiraAPI/GameOptions/OptionTypes/ModdedNumberOption.cs
+++ b/MiraAPI/GameOptions/OptionTypes/ModdedNumberOption.cs
@@ -19,7 +19,7 @@ public class ModdedNumberOption : ModdedOption
public bool ZeroInfinity { get; }
- public ModdedNumberOption(string title, float defaultValue, float min, float max, float increment, NumberSuffixes suffixType, bool zeroInfinity, Type roleType=null) : base(title, defaultValue, roleType)
+ public ModdedNumberOption(string title, float defaultValue, float min, float max, float increment, NumberSuffixes suffixType, bool zeroInfinity=false, Type roleType=null) : base(title, defaultValue, roleType)
{
Min = min;
Max = max;
diff --git a/MiraAPI/GameOptions/OptionTypes/ModdedOption.cs b/MiraAPI/GameOptions/OptionTypes/ModdedOption.cs
index 882a81c..366ab2d 100644
--- a/MiraAPI/GameOptions/OptionTypes/ModdedOption.cs
+++ b/MiraAPI/GameOptions/OptionTypes/ModdedOption.cs
@@ -21,7 +21,7 @@ public abstract class ModdedOption : IModdedOption
public Func Visible { get; set; }
public Type AdvancedRole { get; }
public OptionBehaviour OptionBehaviour { get; set; }
- public ModdedOptionGroup Group { get; set; } = null;
+ public IModdedOptionGroup Group { get; set; } = null;
public IMiraPlugin ParentMod { get; set; } = null;
protected ModdedOption(string title, T defaultValue, Type roleType) : this()
diff --git a/MiraAPI/MiraAPI.csproj b/MiraAPI/MiraAPI.csproj
index c1e2979..aad0751 100644
--- a/MiraAPI/MiraAPI.csproj
+++ b/MiraAPI/MiraAPI.csproj
@@ -12,7 +12,7 @@
Steam
- 2024.3.5
+ 2024.6.18
@@ -25,10 +25,10 @@
-
-
-
-
+
+
+
+
diff --git a/MiraAPI/Patches/Options/GameOptionsMenuPatch.cs b/MiraAPI/Patches/Options/GameOptionsMenuPatch.cs
index 202607e..fc494c8 100644
--- a/MiraAPI/Patches/Options/GameOptionsMenuPatch.cs
+++ b/MiraAPI/Patches/Options/GameOptionsMenuPatch.cs
@@ -17,12 +17,12 @@ public static class GameOptionsMenuPatch
[HarmonyPatch(nameof(GameOptionsMenu.CreateSettings))]
public static bool SettingsPatch(GameOptionsMenu __instance)
{
- if (GameSettingMenuPatches.currentSelectedMod == 0) return true;
+ if (GameSettingMenuPatches.CurrentSelectedMod == 0) return true;
__instance.MapPicker.gameObject.SetActive(false);
float num = 2.1f;
- foreach (IModdedOptionGroup group in GameSettingMenuPatches.selectedMod.OptionGroups)
+ foreach (IModdedOptionGroup group in GameSettingMenuPatches.SelectedMod.OptionGroups)
{
CategoryHeaderMasked categoryHeaderMasked = Object.Instantiate(__instance.categoryHeaderOrigin, Vector3.zero, Quaternion.identity, __instance.settingsContainer);
categoryHeaderMasked.SetHeader(CustomStringName.CreateAndRegister(group.GroupName), 20);
diff --git a/MiraAPI/Patches/Options/GameSettingMenuPatches.cs b/MiraAPI/Patches/Options/GameSettingMenuPatches.cs
index 420abbe..fb153d1 100644
--- a/MiraAPI/Patches/Options/GameSettingMenuPatches.cs
+++ b/MiraAPI/Patches/Options/GameSettingMenuPatches.cs
@@ -15,9 +15,11 @@ namespace MiraAPI.Patches.Options;
[HarmonyPatch(typeof(GameSettingMenu))]
public static class GameSettingMenuPatches
{
- public static int currentSelectedMod = 0;
- public static MiraPluginInfo selectedMod = null;
- public static TextMeshPro text;
+ public static int CurrentSelectedMod { get; private set; }
+
+ public static MiraPluginInfo SelectedMod { get; private set; }
+
+ private static TextMeshPro _text;
[HarmonyPrefix]
[HarmonyPatch(nameof(GameSettingMenu.Start))]
@@ -32,11 +34,11 @@ public static class GameSettingMenuPatches
tmpText.name = "SelectedMod";
tmpText.transform.localPosition = new Vector3(-3.3382f, 1.5399f, -2);
- text = tmpText.GetComponent();
- text.fontSizeMax = 3.2f;
+ _text = tmpText.GetComponent();
+ _text.fontSizeMax = 3.2f;
UpdateText(__instance.GameSettingsTab, __instance.RoleSettingsTab);
- text.alignment = TextAlignmentOptions.Center;
+ _text.alignment = TextAlignmentOptions.Center;
GameObject nextButton = Object.Instantiate(__instance.BackButton, __instance.BackButton.transform.parent).gameObject;
nextButton.transform.localPosition = new Vector3(-2.2663f, 1.5272f, -25f);
@@ -49,9 +51,9 @@ public static class GameSettingMenuPatches
passiveButton.OnClick = new ButtonClickedEvent();
passiveButton.OnClick.AddListener((UnityAction)(() =>
{
- if (currentSelectedMod != MiraPluginManager.Instance.RegisteredPlugins.Count)
+ if (CurrentSelectedMod != MiraPluginManager.Instance.RegisteredPlugins.Count)
{
- currentSelectedMod += 1;
+ CurrentSelectedMod += 1;
UpdateText(__instance.GameSettingsTab, __instance.RoleSettingsTab);
}
}));
@@ -63,9 +65,9 @@ public static class GameSettingMenuPatches
backButton.transform.FindChild("Active").gameObject.GetComponent().flipX = backButton.transform.FindChild("Inactive").gameObject.GetComponent().flipX = true;
backButton.gameObject.GetComponent().OnClick.AddListener((UnityAction)(() =>
{
- if (currentSelectedMod != 0)
+ if (CurrentSelectedMod != 0)
{
- currentSelectedMod -= 1;
+ CurrentSelectedMod -= 1;
UpdateText(__instance.GameSettingsTab, __instance.RoleSettingsTab);
}
}));
@@ -73,23 +75,23 @@ public static class GameSettingMenuPatches
public static void UpdateText(GameOptionsMenu settings, RolesSettingsMenu roles)
{
- if (currentSelectedMod == 0)
+ if (CurrentSelectedMod == 0)
{
- text.text = "Default";
- text.fontSizeMax = 3.2f;
+ _text.text = "Default";
+ _text.fontSizeMax = 3.2f;
}
else
{
- text.fontSizeMax = 2f;
- selectedMod = MiraPluginManager.Instance.RegisteredPlugins.ElementAt(currentSelectedMod - 1).Value;
- if (selectedMod == null)
+ _text.fontSizeMax = 2f;
+ SelectedMod = MiraPluginManager.Instance.RegisteredPlugins.ElementAt(CurrentSelectedMod - 1).Value;
+ if (SelectedMod == null)
{
- currentSelectedMod = 0;
+ CurrentSelectedMod = 0;
UpdateText(settings, roles);
}
- string name = selectedMod.PluginInfo.Metadata.Name;
- text.text = name.Substring(0, Math.Min(name.Length, 15));
+ string name = SelectedMod.PluginInfo.Metadata.Name;
+ _text.text = name.Substring(0, Math.Min(name.Length, 15));
}
if (roles is not null && roles.roleChances is not null)
diff --git a/MiraAPI/Patches/Options/RoleSettingMenuPatches.cs b/MiraAPI/Patches/Options/RoleSettingMenuPatches.cs
index ae21f1a..14837d7 100644
--- a/MiraAPI/Patches/Options/RoleSettingMenuPatches.cs
+++ b/MiraAPI/Patches/Options/RoleSettingMenuPatches.cs
@@ -28,7 +28,7 @@ public static class RoleSettingMenuPatches
var maskBg = __instance.scrollBar.transform.FindChild("MaskBg");
- if (GameSettingMenuPatches.currentSelectedMod == 0)
+ if (GameSettingMenuPatches.CurrentSelectedMod == 0)
{
__instance.AllButton.transform.parent.gameObject.SetActive(true);
__instance.AllButton.gameObject.SetActive(true);
@@ -52,7 +52,7 @@ public static class RoleSettingMenuPatches
num -= 0.522f;
int num3 = 0;
- foreach (var role in GameSettingMenuPatches.selectedMod.CustomRoles.Values.OfType().Where(role => role.Team == ModdedRoleTeams.Crewmate))
+ foreach (var role in GameSettingMenuPatches.SelectedMod.CustomRoles.Values.OfType().Where(role => role.Team == ModdedRoleTeams.Crewmate))
{
CreateQuotaOption(__instance, role as RoleBehaviour, ref num, num3);
num3++;
@@ -65,7 +65,7 @@ public static class RoleSettingMenuPatches
num -= 0.522f;
- foreach (var role in GameSettingMenuPatches.selectedMod.CustomRoles.Values.OfType().Where(role => role.Team == ModdedRoleTeams.Impostor))
+ foreach (var role in GameSettingMenuPatches.SelectedMod.CustomRoles.Values.OfType().Where(role => role.Team == ModdedRoleTeams.Impostor))
{
CreateQuotaOption(__instance, role as RoleBehaviour, ref num, num3);
num3++;
@@ -79,7 +79,7 @@ public static class RoleSettingMenuPatches
num -= 0.522f;
- foreach (var role in GameSettingMenuPatches.selectedMod.CustomRoles.Values.OfType().Where(role => role.Team == ModdedRoleTeams.Neutral))
+ foreach (var role in GameSettingMenuPatches.SelectedMod.CustomRoles.Values.OfType().Where(role => role.Team == ModdedRoleTeams.Neutral))
{
CreateQuotaOption(__instance, role as RoleBehaviour, ref num, num3);
num3++;
@@ -92,7 +92,7 @@ public static class RoleSettingMenuPatches
[HarmonyPatch(nameof(RolesSettingsMenu.Update))]
public static bool UpdatePatch()
{
- if (GameSettingMenuPatches.currentSelectedMod == 0)
+ if (GameSettingMenuPatches.CurrentSelectedMod == 0)
{
return true;
}
@@ -132,7 +132,7 @@ public static class RoleSettingMenuPatches
__instance.advancedSettingChildren.Clear();
float num = -0.872f;
- foreach (var option in GameSettingMenuPatches.selectedMod.Options.Where(option => option.AdvancedRole == role.GetType()))
+ foreach (var option in GameSettingMenuPatches.SelectedMod.Options.Where(option => option.AdvancedRole == role.GetType()))
{
OptionBehaviour newOpt = option.CreateOption(__instance.checkboxOrigin, __instance.numberOptionOrigin, __instance.stringOptionOrigin, __instance.AdvancedRolesSettings.transform);
newOpt.transform.localPosition = new Vector3(2.17f, num, -2f);
@@ -210,7 +210,7 @@ public static class RoleSettingMenuPatches
ChangeTab(role, __instance);
}));
- if (index < GameSettingMenuPatches.selectedMod.CustomRoles.Count - 1)
+ if (index < GameSettingMenuPatches.SelectedMod.CustomRoles.Count - 1)
{
yPos += -0.43f;
}
diff --git a/MiraAPI/PluginLoading/MiraPluginInfo.cs b/MiraAPI/PluginLoading/MiraPluginInfo.cs
index f44bc50..8214316 100644
--- a/MiraAPI/PluginLoading/MiraPluginInfo.cs
+++ b/MiraAPI/PluginLoading/MiraPluginInfo.cs
@@ -6,25 +6,16 @@ using System.Collections.Generic;
namespace MiraAPI.PluginLoading;
-public class MiraPluginInfo
+public class MiraPluginInfo(string id, IMiraPlugin miraPlugin, PluginInfo info)
{
- public string PluginId { get; set; }
- public IMiraPlugin MiraPlugin { get; set; }
- public PluginInfo PluginInfo { get; set; }
- public ConfigFile PluginConfig { get; set; }
+ public string PluginId { get; set; } = id;
+ public IMiraPlugin MiraPlugin { get; set; } = miraPlugin;
+ public PluginInfo PluginInfo { get; set; } = info;
+ public ConfigFile PluginConfig { get; set; } = miraPlugin.GetConfigFile();
public readonly List OptionGroups = [];
public readonly List Options = [];
public readonly Dictionary CustomRoles = [];
public readonly Dictionary GameModes = [];
-
- public MiraPluginInfo(string id, IMiraPlugin miraPlugin, PluginInfo info)
- {
- PluginId = id;
- MiraPlugin = miraPlugin;
- PluginInfo = info;
- PluginConfig = miraPlugin.GetConfigFile();
- }
-
}
\ No newline at end of file
diff --git a/MiraAPI/PluginLoading/MiraPluginManager.cs b/MiraAPI/PluginLoading/MiraPluginManager.cs
index 4843658..5178873 100644
--- a/MiraAPI/PluginLoading/MiraPluginManager.cs
+++ b/MiraAPI/PluginLoading/MiraPluginManager.cs
@@ -74,17 +74,19 @@ public class MiraPluginManager
if (typeof(IModdedOptionGroup).IsAssignableFrom(type))
{
IModdedOptionGroup group = (IModdedOptionGroup)Activator.CreateInstance(type);
- ModdedOptionGroup newGroup = new ModdedOptionGroup
- {
- AdvancedRole = group.AdvancedRole,
- GroupColor = group.GroupColor,
- GroupName = group.GroupName,
- GroupVisible = group.GroupVisible
- };
- ModdedOptionsManager.Groups.Add(newGroup);
- ModdedOptionsManager.OriginalTypes.Add(type, newGroup);
+ ModdedOptionsManager.Groups.Add(group);
+ ModdedOptionsManager.OriginalTypes.Add(type, group);
pluginInfo.OptionGroups.Add(group);
+
+ foreach (var property in type.GetProperties())
+ {
+ if (typeof(IModdedOption).IsAssignableFrom(property.PropertyType))
+ {
+ IModdedOption option = (IModdedOption)property.GetValue(group);
+ option.Group = group;
+ }
+ }
}
}
}
diff --git a/nuget.config b/nuget.config
index 3ee52a2..06c3fec 100644
--- a/nuget.config
+++ b/nuget.config
@@ -3,5 +3,8 @@
+
+
+