diff --git a/MiraAPI/PluginLoading/MiraPluginInfo.cs b/MiraAPI/PluginLoading/MiraPluginInfo.cs index 8214316..1947666 100644 --- a/MiraAPI/PluginLoading/MiraPluginInfo.cs +++ b/MiraAPI/PluginLoading/MiraPluginInfo.cs @@ -6,9 +6,9 @@ using System.Collections.Generic; namespace MiraAPI.PluginLoading; -public class MiraPluginInfo(string id, IMiraPlugin miraPlugin, PluginInfo info) +public class MiraPluginInfo(IMiraPlugin miraPlugin, PluginInfo info) { - public string PluginId { get; set; } = id; + public string PluginId { get; set; } = info.Metadata.GUID; public IMiraPlugin MiraPlugin { get; set; } = miraPlugin; public PluginInfo PluginInfo { get; set; } = info; public ConfigFile PluginConfig { get; set; } = miraPlugin.GetConfigFile(); diff --git a/MiraAPI/PluginLoading/MiraPluginManager.cs b/MiraAPI/PluginLoading/MiraPluginManager.cs index 45dccb2..a23e928 100644 --- a/MiraAPI/PluginLoading/MiraPluginManager.cs +++ b/MiraAPI/PluginLoading/MiraPluginManager.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using MiraAPI.Hud; +using Reactor.Networking; namespace MiraAPI.PluginLoading; @@ -27,15 +28,14 @@ internal class MiraPluginManager internal void Initialize() { Instance = this; - IL2CPPChainloader.Instance.PluginLoad += (_, assembly, plugin) => + IL2CPPChainloader.Instance.PluginLoad += (pluginInfo, assembly, plugin) => { if (!plugin.GetType().GetInterfaces().Contains(typeof(IMiraPlugin))) { return; } - var id = MetadataHelper.GetMetadata(plugin.GetType()).GUID; - var info = new MiraPluginInfo(id, plugin as IMiraPlugin, IL2CPPChainloader.Instance.Plugins[id]); + var info = new MiraPluginInfo(plugin as IMiraPlugin, pluginInfo); RegisterAllOptions(assembly, info); @@ -44,7 +44,7 @@ internal class MiraPluginManager RegisteredPlugins.Add(assembly, info); - Logger.Info($"Registering mod {id} with Mira API."); + Logger.Info($"Registering mod {pluginInfo.Metadata.GUID} with Mira API."); }; } @@ -92,10 +92,16 @@ internal class MiraPluginManager { continue; } + + if (!ModList.GetById(pluginInfo.PluginId).IsRequiredOnAllClients) + { + Logger.Error("Custom roles are only supported on all clients."); + return; + } ClassInjector.RegisterTypeInIl2Cpp(type); - var role = CustomRoleManager.RegisterRole(type, attribute.RoleId, pluginInfo); + var role = CustomRoleManager.RegisterRole(type, pluginInfo); try { diff --git a/MiraAPI/Roles/CustomRoleManager.cs b/MiraAPI/Roles/CustomRoleManager.cs index 329b3c6..0c3ff2f 100644 --- a/MiraAPI/Roles/CustomRoleManager.cs +++ b/MiraAPI/Roles/CustomRoleManager.cs @@ -20,23 +20,19 @@ public static class CustomRoleManager { public static readonly Dictionary CustomRoles = new(); - private static int GetNextRoleId(ushort requestedId) + private static ushort _roleId = 100; + + private static ushort GetNextRoleId() { - while (CustomRoles.ContainsKey(requestedId) || requestedId <= Enum.GetNames().Length) - { - Logger.Error(requestedId + ", " + (requestedId+1)); - requestedId++; - } - - return requestedId; + return _roleId++; } - public static void RegisterInRoleManager() + internal static void RegisterInRoleManager() { RoleManager.Instance.AllRoles = RoleManager.Instance.AllRoles.Concat(CustomRoles.Values).ToArray(); } - internal static RoleBehaviour RegisterRole(Type roleType, ushort roleId, MiraPluginInfo parentMod) + internal static RoleBehaviour RegisterRole(Type roleType, MiraPluginInfo parentMod) { if (!(typeof(RoleBehaviour).IsAssignableFrom(roleType) && typeof(ICustomRole).IsAssignableFrom(roleType))) { @@ -52,7 +48,7 @@ public static class CustomRoleManager return null; } - roleBehaviour.Role = (RoleTypes)GetNextRoleId(roleId); + roleBehaviour.Role = (RoleTypes)GetNextRoleId(); roleBehaviour.TeamType = customRole.Team == ModdedRoleTeams.Neutral ? RoleTeamTypes.Crewmate : (RoleTeamTypes)customRole.Team; roleBehaviour.NameColor = customRole.RoleColor; roleBehaviour.StringName = CustomStringName.CreateAndRegister(customRole.RoleName); @@ -72,7 +68,7 @@ public static class CustomRoleManager RoleManager.GhostRoles.Add(roleBehaviour.Role); } - CustomRoles.Add(roleId, roleBehaviour); + CustomRoles.Add(_roleId, roleBehaviour); if (customRole.HideSettings) { diff --git a/MiraAPI/Roles/RegisterCustomRoleAttribute.cs b/MiraAPI/Roles/RegisterCustomRoleAttribute.cs index f32cdd7..db9a0e7 100644 --- a/MiraAPI/Roles/RegisterCustomRoleAttribute.cs +++ b/MiraAPI/Roles/RegisterCustomRoleAttribute.cs @@ -3,16 +3,4 @@ namespace MiraAPI.Roles; [AttributeUsage(AttributeTargets.Class)] -public class RegisterCustomRoleAttribute : Attribute -{ - public ushort RoleId { get; } - - public RegisterCustomRoleAttribute() - { - RoleId = (ushort)(20 + CustomRoleManager.CustomRoles.Count); - } - public RegisterCustomRoleAttribute(ushort roleId) - { - RoleId = roleId; - } -} \ No newline at end of file +public class RegisterCustomRoleAttribute : Attribute; \ No newline at end of file diff --git a/MiraAPI/Roles/RoleId.cs b/MiraAPI/Roles/RoleId.cs new file mode 100644 index 0000000..bb7b714 --- /dev/null +++ b/MiraAPI/Roles/RoleId.cs @@ -0,0 +1,17 @@ +using System; +using System.Linq; + +namespace MiraAPI.Roles; + +public class RoleId +{ + public static ushort Get() where T : RoleBehaviour + { + if (!CustomRoleManager.CustomRoles.Values.OfType().Any()) + { + throw new InvalidOperationException($"Role {typeof(T)} is not registered"); + } + + return (ushort)CustomRoleManager.CustomRoles.Values.OfType().Single().Role; + } +} \ No newline at end of file