From fd9adc62e70d69add7f0d17b27e243b5204d85db Mon Sep 17 00:00:00 2001 From: XtraCube <72575280+XtraCube@users.noreply.github.com> Date: Thu, 20 Jun 2024 17:19:57 -0400 Subject: [PATCH] WIP unfinished --- MiraAPI.Example/ExamplePlugin.cs | 5 +- MiraAPI/GameModes/ActiveMode.cs | 7 ++ MiraAPI/GameModes/DefaultMode.cs | 2 +- .../Attributes/ModdedOptionAttribute.cs | 2 +- MiraAPI/GameOptions/ModdedOptionsManager.cs | 15 ---- MiraAPI/IMiraConfig.cs | 3 +- MiraAPI/MiraPluginInfo.cs | 25 ++++++ MiraAPI/MiraPluginManager.cs | 50 ++++++++++++ MiraAPI/Patches/HudManagerPatches.cs | 1 + MiraAPI/Resources/Menu_Button.png | Bin 4938 -> 5519 bytes MiraAPI/Roles/CustomRoleManager.cs | 75 +++++------------- MiraAPI/Roles/RegisterCustomRoleAttribute.cs | 37 +-------- MiraAPI/Utilities/Helpers.cs | 2 +- 13 files changed, 114 insertions(+), 110 deletions(-) create mode 100644 MiraAPI/GameModes/ActiveMode.cs create mode 100644 MiraAPI/MiraPluginInfo.cs create mode 100644 MiraAPI/MiraPluginManager.cs diff --git a/MiraAPI.Example/ExamplePlugin.cs b/MiraAPI.Example/ExamplePlugin.cs index 007f0c4..cc1e769 100644 --- a/MiraAPI.Example/ExamplePlugin.cs +++ b/MiraAPI.Example/ExamplePlugin.cs @@ -15,8 +15,8 @@ namespace MiraAPI.Example; public partial class ExamplePlugin : BasePlugin, IMiraConfig { public Harmony Harmony { get; } = new(Id); - public static ExamplePlugin Instance { get; private set; } - public ModdedOptionTabSettings TabSettings => new ModdedOptionTabSettings() + + public ModdedOptionTabSettings TabSettings => new() { Title = "MiraAPI Example Mod", TabIcon = MiraAssets.Empty @@ -24,7 +24,6 @@ public partial class ExamplePlugin : BasePlugin, IMiraConfig public override void Load() { - Instance = this; Harmony.PatchAll(); } } \ No newline at end of file diff --git a/MiraAPI/GameModes/ActiveMode.cs b/MiraAPI/GameModes/ActiveMode.cs new file mode 100644 index 0000000..d687695 --- /dev/null +++ b/MiraAPI/GameModes/ActiveMode.cs @@ -0,0 +1,7 @@ +namespace MiraAPI.GameModes; + +public struct ActiveMode +{ + public string PluginId { get; set; } + public int ModeId { get; set; } +} \ No newline at end of file diff --git a/MiraAPI/GameModes/DefaultMode.cs b/MiraAPI/GameModes/DefaultMode.cs index 2e7fcb0..0993fb6 100644 --- a/MiraAPI/GameModes/DefaultMode.cs +++ b/MiraAPI/GameModes/DefaultMode.cs @@ -4,6 +4,6 @@ public class DefaultMode : CustomGameMode { public override string Name => "Default"; - public override string Description => "Default Among Us GameMode"; + public override string Description => "Default Among Us Game Mode"; public override int Id => 0; } \ No newline at end of file diff --git a/MiraAPI/GameOptions/Attributes/ModdedOptionAttribute.cs b/MiraAPI/GameOptions/Attributes/ModdedOptionAttribute.cs index e2379b5..151ec90 100644 --- a/MiraAPI/GameOptions/Attributes/ModdedOptionAttribute.cs +++ b/MiraAPI/GameOptions/Attributes/ModdedOptionAttribute.cs @@ -19,7 +19,7 @@ namespace MiraAPI.GameOptions.Attributes { foreach (var type in assembly.GetTypes()) { - foreach (PropertyInfo property in type.GetProperties()) + foreach (var property in type.GetProperties()) { foreach (var attribute in property.GetCustomAttributes()) { diff --git a/MiraAPI/GameOptions/ModdedOptionsManager.cs b/MiraAPI/GameOptions/ModdedOptionsManager.cs index d8d5dcf..2f6ef31 100644 --- a/MiraAPI/GameOptions/ModdedOptionsManager.cs +++ b/MiraAPI/GameOptions/ModdedOptionsManager.cs @@ -18,21 +18,6 @@ namespace MiraAPI.GameOptions private static Dictionary OriginalTypes = new(); public static Dictionary RegisteredMods = new(); - public static void Initialize() - { - IL2CPPChainloader.Instance.PluginLoad += (_, assembly, plugin) => - { - if (plugin.GetType().GetInterfaces().Contains(typeof(IMiraConfig))) - { - IMiraConfig config = (IMiraConfig)Activator.CreateInstance(plugin.GetType()); - RegisteredMods.Add(assembly, config); - } - - RegisterOptionGroups(assembly); - - ModdedOptionAttribute.Register(assembly); - }; - } private static void RegisterOptionGroups(Assembly assembly) { diff --git a/MiraAPI/IMiraConfig.cs b/MiraAPI/IMiraConfig.cs index 3cde9a5..5c12a44 100644 --- a/MiraAPI/IMiraConfig.cs +++ b/MiraAPI/IMiraConfig.cs @@ -1,5 +1,4 @@ -using MiraAPI.Utilities; -using MiraAPI.Utilities.Assets; +using MiraAPI.Utilities.Assets; using UnityEngine; namespace MiraAPI diff --git a/MiraAPI/MiraPluginInfo.cs b/MiraAPI/MiraPluginInfo.cs new file mode 100644 index 0000000..bb739be --- /dev/null +++ b/MiraAPI/MiraPluginInfo.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using MiraAPI.GameModes; +using MiraAPI.GameOptions; +using MiraAPI.Roles; + +namespace MiraAPI; + +public class MiraPluginInfo +{ + public string PluginId { get; set; } + public IMiraConfig Config { get; set; } + + public readonly List OptionGroups = []; + public readonly List Options = []; + + public readonly Dictionary CustomRoles = []; + public readonly Dictionary GameModes = []; + + public MiraPluginInfo(string id, IMiraConfig config) + { + PluginId = id; + Config = config; + } + +} \ No newline at end of file diff --git a/MiraAPI/MiraPluginManager.cs b/MiraAPI/MiraPluginManager.cs new file mode 100644 index 0000000..ba52a7f --- /dev/null +++ b/MiraAPI/MiraPluginManager.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using BepInEx; +using BepInEx.Unity.IL2CPP; +using MiraAPI.GameOptions.Attributes; +using MiraAPI.Roles; +using MiraAPI.Utilities; + +namespace MiraAPI; + +public class MiraPluginManager +{ + public Dictionary RegisteredPlugins = []; + + public void Initialize() + { + IL2CPPChainloader.Instance.PluginLoad += (_, assembly, plugin) => + { + if (!plugin.GetType().GetInterfaces().Contains(typeof(IMiraConfig))) return; + + var id = MetadataHelper.GetMetadata(plugin.GetType()).GUID; + var info = new MiraPluginInfo(id, plugin as IMiraConfig); + + RegisterRoleAttribute(assembly, info); + + ModdedOptionAttribute.Register(assembly); + + RegisteredPlugins.Add(assembly, info); + + }; + } + + private static void RegisterRoleAttribute(Assembly assembly, MiraPluginInfo pluginInfo) + { + foreach (var type in assembly.GetTypes()) + { + var attribute = type.GetCustomAttribute(); + if (attribute == null) continue; + + Helpers.RegisterIl2CppType(type); + var role = CustomRoleManager.RegisterRole(type, attribute.RoleId); + + pluginInfo.CustomRoles.Add((ushort)role.Role, role as ICustomRole); + } + } + + + +} \ No newline at end of file diff --git a/MiraAPI/Patches/HudManagerPatches.cs b/MiraAPI/Patches/HudManagerPatches.cs index 8fcf456..c0f92e9 100644 --- a/MiraAPI/Patches/HudManagerPatches.cs +++ b/MiraAPI/Patches/HudManagerPatches.cs @@ -6,6 +6,7 @@ using MiraAPI.Patches.Options; using MiraAPI.Roles; using Reactor.Utilities.Extensions; using UnityEngine; +using UnityEngine.Events; namespace MiraAPI.Patches { diff --git a/MiraAPI/Resources/Menu_Button.png b/MiraAPI/Resources/Menu_Button.png index f8d15661595f0a820f8ed8b0e6889d135405b8d7..8fa22c7e775d7c7f86a05d410349bae173ee3e03 100644 GIT binary patch delta 4075 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 delta 3489 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 i*Y|1v=Sdlkn#}HG75e-d!;{weo CustomRoles = []; - public static readonly Dictionary> ModRoles = []; - - public static void RegisterInRoleManager() + public static Dictionary CustomRoles = new(); + + public static int GetNextRoleId(ushort requestedId) { - RoleManager.Instance.AllRoles = RoleManager.Instance.AllRoles.Concat(CustomRoles.Values).ToArray(); + while (CustomRoles.ContainsKey(requestedId)) + { + requestedId++; + } + + return requestedId; } - internal static void RegisterRole(Type roleType, ushort roleId, string modId) + internal static RoleBehaviour RegisterRole(Type roleType, ushort roleId) { - if (!IL2CPPChainloader.Instance.Plugins.TryGetValue(modId, out PluginInfo info)) - { - Debug.LogError($"{modId} is not a valid mod!"); - return; - } - if (!(typeof(RoleBehaviour).IsAssignableFrom(roleType) && typeof(ICustomRole).IsAssignableFrom(roleType))) { - return; - } - - if (CustomRoles.Any(behaviour => behaviour.GetType() == roleType)) - { - return; + Debug.LogError($"{roleType?.Name} does not inherit from RoleBehaviour or ICustomRole."); + return null; } var roleBehaviour = (RoleBehaviour)new GameObject(roleType.Name).DontDestroy().AddComponent(Il2CppType.From(roleType)); if (roleBehaviour is not ICustomRole customRole) { - return; + roleBehaviour.gameObject.Destroy(); + return null; } - if (CustomRoles.ContainsKey(roleId)) - { - Debug.LogError($"Role ID conflict for {customRole.RoleName}. Use a different ID."); - return; - } - - roleBehaviour.Role = (RoleTypes)roleId; + roleBehaviour.Role = (RoleTypes)GetNextRoleId(roleId); roleBehaviour.TeamType = customRole.Team == ModdedRoleTeams.Neutral ? RoleTeamTypes.Crewmate : (RoleTeamTypes)customRole.Team; roleBehaviour.NameColor = customRole.RoleColor; roleBehaviour.StringName = CustomStringName.CreateAndRegister(customRole.RoleName); @@ -75,48 +63,27 @@ public static class CustomRoleManager { RoleManager.GhostRoles.Add(roleBehaviour.Role); } - - if (ModRoles.TryGetValue(info, out List roles)) - { - roles.Add(roleBehaviour); - } - else - { - ModRoles.TryAdd(info, [roleBehaviour]); - } - - CustomRoles.Add(roleId, roleBehaviour); + + CustomRoles.Add(roleId, customRole); if (customRole.HideSettings) { - return; + return roleBehaviour; } var config = PluginSingleton.Instance.Config; config.Bind(customRole.NumConfigDefinition, 1); config.Bind(customRole.ChanceConfigDefinition, 100); + return roleBehaviour; } - public static List GetRolesRegistered(string modId) - { - PluginInfo info = ModRoles.Keys.First(key => key.Metadata.GUID == modId); - if (ModRoles.TryGetValue(info, out List roles)) - { - return roles; - } - else - { - Debug.LogError($"{modId} has no roles registered."); - return null; - } - } public static bool GetCustomRoleBehaviour(RoleTypes roleType, out ICustomRole result) { CustomRoles.TryGetValue((ushort)roleType, out var temp); - if (temp is ICustomRole role) + if (temp != null) { - result = role; + result = temp; return true; } diff --git a/MiraAPI/Roles/RegisterCustomRoleAttribute.cs b/MiraAPI/Roles/RegisterCustomRoleAttribute.cs index 0c49aeb..87fdc39 100644 --- a/MiraAPI/Roles/RegisterCustomRoleAttribute.cs +++ b/MiraAPI/Roles/RegisterCustomRoleAttribute.cs @@ -7,40 +7,11 @@ using System.Reflection; namespace MiraAPI.Roles; [AttributeUsage(AttributeTargets.Class)] -public class RegisterCustomRoleAttribute : Attribute -{ - private static readonly HashSet RegisteredAssemblies = []; - public ushort RoleId { get; } - public string ModId { get; } +public class RegisterCustomRoleAttribute(ushort roleId) : Attribute +{ + public ushort RoleId { get; } = roleId; - public RegisterCustomRoleAttribute(string modId) + public RegisterCustomRoleAttribute() : this((ushort)(20 + CustomRoleManager.CustomRoles.Count)) { - ModId = modId; - RoleId = (ushort)(20 + CustomRoleManager.CustomRoles.Count); - } - public RegisterCustomRoleAttribute(string modId, ushort roleId) - { - ModId = modId; - RoleId = roleId; - } - - public static void Initialize() - { - IL2CPPChainloader.Instance.PluginLoad += (_, assembly, plugin) => Register(assembly); - } - - public static void Register(Assembly assembly) - { - if (!RegisteredAssemblies.Add(assembly)) return; - - foreach (var type in assembly.GetTypes()) - { - var attribute = type.GetCustomAttribute(); - if (attribute != null) - { - Helpers.RegisterType(type); - CustomRoleManager.RegisterRole(type, attribute.RoleId, attribute.ModId); - } - } } } \ No newline at end of file diff --git a/MiraAPI/Utilities/Helpers.cs b/MiraAPI/Utilities/Helpers.cs index 5cef351..ceee3b1 100644 --- a/MiraAPI/Utilities/Helpers.cs +++ b/MiraAPI/Utilities/Helpers.cs @@ -17,7 +17,7 @@ namespace MiraAPI.Utilities return ShipStatus.Instance.AllRooms.ToList().Find(room => room.roomArea.OverlapPoint(pos)); } - public static void RegisterType(Type type) + public static void RegisterIl2CppType(Type type) { if (ClassInjector.IsTypeRegisteredInIl2Cpp(type)) {