mirror of
https://github.com/All-Of-Us-Mods/MiraAPI.git
synced 2026-10-20 11:39:45 +00:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bc188191de |
No files matched your search
+6
-3
@@ -1,17 +1,20 @@
|
|||||||
using MiraAPI.Example.GameOver;
|
using MiraAPI.Example.Extension.GameOver;
|
||||||
using MiraAPI.Example.Roles;
|
using MiraAPI.Example.Extension.Roles;
|
||||||
using MiraAPI.GameEnd;
|
using MiraAPI.GameEnd;
|
||||||
using MiraAPI.Hud;
|
using MiraAPI.Hud;
|
||||||
using MiraAPI.Utilities.Assets;
|
using MiraAPI.Utilities.Assets;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace MiraAPI.Example.Buttons;
|
namespace MiraAPI.Example.Extension.Buttons;
|
||||||
|
|
||||||
public class NeutralKillerButton : CustomActionButton
|
public class NeutralKillerButton : CustomActionButton
|
||||||
{
|
{
|
||||||
public override string Name => "Win Game";
|
public override string Name => "Win Game";
|
||||||
|
|
||||||
public override float Cooldown => 0f;
|
public override float Cooldown => 0f;
|
||||||
|
|
||||||
public override LoadableAsset<Sprite> Sprite => ExampleAssets.ExampleButton;
|
public override LoadableAsset<Sprite> Sprite => ExampleAssets.ExampleButton;
|
||||||
|
|
||||||
protected override void OnClick()
|
protected override void OnClick()
|
||||||
{
|
{
|
||||||
CustomGameOver.Trigger<NeutralKillerGameOver>([PlayerControl.LocalPlayer.Data]);
|
CustomGameOver.Trigger<NeutralKillerGameOver>([PlayerControl.LocalPlayer.Data]);
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using System;
|
||||||
|
using BepInEx;
|
||||||
|
using BepInEx.Unity.IL2CPP;
|
||||||
|
using HarmonyLib;
|
||||||
|
using MiraAPI.PluginLoading;
|
||||||
|
using Reactor;
|
||||||
|
using Reactor.Networking;
|
||||||
|
using Reactor.Networking.Attributes;
|
||||||
|
|
||||||
|
namespace MiraAPI.Example.Extension;
|
||||||
|
|
||||||
|
[BepInAutoPlugin("mira.example.extension", "MiraExampleExtensionMod")]
|
||||||
|
[BepInProcess("Among Us.exe")]
|
||||||
|
[BepInDependency(ReactorPlugin.Id)]
|
||||||
|
[BepInDependency(MiraApiPlugin.Id)]
|
||||||
|
[BepInDependency(ExamplePlugin.Id)]
|
||||||
|
[ReactorModFlags(ModFlags.RequireOnAllClients)]
|
||||||
|
public partial class ExampleExtensionPlugin : BasePlugin, IMiraExtension
|
||||||
|
{
|
||||||
|
public Harmony Harmony { get; } = new(Id);
|
||||||
|
|
||||||
|
public override void Load()
|
||||||
|
{
|
||||||
|
Harmony.PatchAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Type GetBasePluginType()
|
||||||
|
{
|
||||||
|
return typeof(ExamplePlugin);
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-2
@@ -1,9 +1,9 @@
|
|||||||
using MiraAPI.Example.Roles;
|
using MiraAPI.Example.Extension.Roles;
|
||||||
using MiraAPI.GameEnd;
|
using MiraAPI.GameEnd;
|
||||||
using MiraAPI.Utilities;
|
using MiraAPI.Utilities;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace MiraAPI.Example.GameOver;
|
namespace MiraAPI.Example.Extension.GameOver;
|
||||||
|
|
||||||
public class NeutralKillerGameOver : CustomGameOver
|
public class NeutralKillerGameOver : CustomGameOver
|
||||||
{
|
{
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Version>1.0.0</Version>
|
||||||
|
<Description>Example extension for Mira API</Description>
|
||||||
|
<Authors>Angxl, XtraCube</Authors>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\MiraAPI\MiraAPI.csproj" />
|
||||||
|
<ProjectReference Include="..\MiraAPI.Example\MiraAPI.Example.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<Import Project="..\AmongUs.props" />
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
using MiraAPI.Example.Extension.Options;
|
||||||
|
using MiraAPI.GameOptions;
|
||||||
|
using MiraAPI.Modifiers.Types;
|
||||||
|
|
||||||
|
namespace MiraAPI.Example.Extension.Modifiers;
|
||||||
|
|
||||||
|
public class ExtensionModifier : GameModifier
|
||||||
|
{
|
||||||
|
public override string ModifierName => "Extension Modifier";
|
||||||
|
|
||||||
|
public override string GetDescription() => "This is from the extension mod!";
|
||||||
|
|
||||||
|
public override int GetAssignmentChance() => (int)OptionGroupSingleton<ExtensionModifierOptions>.Instance.ModifierChance;
|
||||||
|
|
||||||
|
public override int GetAmountPerGame() => (int)OptionGroupSingleton<ExtensionModifierOptions>.Instance.ModifierLimit;
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
using MiraAPI.Example.Roles;
|
||||||
|
using MiraAPI.GameOptions;
|
||||||
|
using MiraAPI.GameOptions.Attributes;
|
||||||
|
|
||||||
|
namespace MiraAPI.Example.Extension.Options;
|
||||||
|
|
||||||
|
public class ExtendedFreezerOptions : AbstractOptionGroup<FreezerRole>
|
||||||
|
{
|
||||||
|
public override string GroupName => "Extended Freezer Role Options";
|
||||||
|
|
||||||
|
[ModdedNumberOption("Freeze Uses", 1, 5)]
|
||||||
|
public float FreezeUses { get; set; } = 1;
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
using MiraAPI.Example.Extension.Modifiers;
|
||||||
|
using MiraAPI.GameOptions;
|
||||||
|
using MiraAPI.GameOptions.Attributes;
|
||||||
|
using MiraAPI.Utilities;
|
||||||
|
|
||||||
|
namespace MiraAPI.Example.Extension.Options;
|
||||||
|
|
||||||
|
public class ExtensionModifierOptions : AbstractOptionGroup<ExtensionModifier>
|
||||||
|
{
|
||||||
|
public override string GroupName => "Extension Modifier Options";
|
||||||
|
|
||||||
|
[ModdedNumberOption("Modifier Chance", 0, 100, 10, MiraNumberSuffixes.Percent)]
|
||||||
|
public float ModifierChance { get; set; } = 100f;
|
||||||
|
|
||||||
|
[ModdedNumberOption("Modifier Limit", 0, 10)]
|
||||||
|
public float ModifierLimit { get; set; } = 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
using HarmonyLib;
|
||||||
|
using MiraAPI.Example.Buttons.Freezer;
|
||||||
|
using MiraAPI.Example.Extension.Options;
|
||||||
|
using MiraAPI.GameOptions;
|
||||||
|
|
||||||
|
namespace MiraAPI.Example.Extension.Patches;
|
||||||
|
|
||||||
|
[HarmonyPatch(typeof(FreezeButton), nameof(FreezeButton.MaxUses), MethodType.Getter)]
|
||||||
|
public static class FreezeButtonPatch
|
||||||
|
{
|
||||||
|
public static void Postfix(ref int __result)
|
||||||
|
{
|
||||||
|
__result = (int)OptionGroupSingleton<ExtendedFreezerOptions>.Instance.FreezeUses;
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
-3
@@ -1,16 +1,20 @@
|
|||||||
using MiraAPI.Example.GameOver;
|
using MiraAPI.Example.Extension.GameOver;
|
||||||
using MiraAPI.GameEnd;
|
using MiraAPI.GameEnd;
|
||||||
using MiraAPI.Roles;
|
using MiraAPI.Roles;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace MiraAPI.Example.Roles;
|
namespace MiraAPI.Example.Extension.Roles;
|
||||||
|
|
||||||
public class NeutralKillerRole : ImpostorRole, ICustomRole
|
public class NeutralKillerRole : ImpostorRole, ICustomRole
|
||||||
{
|
{
|
||||||
public string RoleName => "Outcast Killer";
|
public string RoleName => "Outcast Killer";
|
||||||
|
|
||||||
public string RoleDescription => "Outcast who can kill.";
|
public string RoleDescription => "Outcast who can kill.";
|
||||||
public string RoleLongDescription => RoleDescription;
|
|
||||||
|
public string RoleLongDescription => this.RoleDescription;
|
||||||
|
|
||||||
public Color RoleColor => Color.magenta;
|
public Color RoleColor => Color.magenta;
|
||||||
|
|
||||||
public ModdedRoleTeams Team => ModdedRoleTeams.Custom;
|
public ModdedRoleTeams Team => ModdedRoleTeams.Custom;
|
||||||
|
|
||||||
public CustomRoleConfiguration Configuration => new(this)
|
public CustomRoleConfiguration Configuration => new(this)
|
||||||
@@ -16,7 +16,7 @@ public class FreezeButton : CustomActionButton<PlayerControl>
|
|||||||
|
|
||||||
public override float Cooldown => OptionGroupSingleton<FreezerRoleSettings>.Instance.FreezeDuration;
|
public override float Cooldown => OptionGroupSingleton<FreezerRoleSettings>.Instance.FreezeDuration;
|
||||||
|
|
||||||
public override int MaxUses => (int)OptionGroupSingleton<FreezerRoleSettings>.Instance.FreezeUses;
|
public override int MaxUses => 1;
|
||||||
|
|
||||||
public override LoadableAsset<Sprite> Sprite => ExampleAssets.ExampleButton;
|
public override LoadableAsset<Sprite> Sprite => ExampleAssets.ExampleButton;
|
||||||
|
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ public static class ExampleEventHandlers
|
|||||||
[RegisterEvent(15)]
|
[RegisterEvent(15)]
|
||||||
public static void HandleVoteEvent(HandleVoteEvent @event)
|
public static void HandleVoteEvent(HandleVoteEvent @event)
|
||||||
{
|
{
|
||||||
if (@event.VoteData.Owner.Data.Role is not NeutralKillerRole) return;
|
if (@event.VoteData.Owner.Data.Role is not FreezerRole) return;
|
||||||
|
|
||||||
@event.VoteData.SetRemainingVotes(0);
|
@event.VoteData.SetRemainingVotes(0);
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,4 @@ public class FreezerRoleSettings : AbstractOptionGroup<FreezerRole>
|
|||||||
|
|
||||||
[ModdedNumberOption("Freeze Duration", 1, 15, 1, MiraNumberSuffixes.Seconds)]
|
[ModdedNumberOption("Freeze Duration", 1, 15, 1, MiraNumberSuffixes.Seconds)]
|
||||||
public float FreezeDuration { get; set; } = 5;
|
public float FreezeDuration { get; set; } = 5;
|
||||||
|
|
||||||
[ModdedNumberOption("Freeze Uses", 1, 5)]
|
|
||||||
public float FreezeUses { get; set; } = 1;
|
|
||||||
}
|
}
|
||||||
@@ -7,6 +7,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiraAPI", "MiraAPI\MiraAPI.
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiraAPI.Example", "MiraAPI.Example\MiraAPI.Example.csproj", "{19B76855-16CC-43CC-A0A6-5A7FFB43F077}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiraAPI.Example", "MiraAPI.Example\MiraAPI.Example.csproj", "{19B76855-16CC-43CC-A0A6-5A7FFB43F077}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiraAPI.Example.Extension", "MiraAPI.Example.Extension\MiraAPI.Example.Extension.csproj", "{526FF017-80E1-4094-804D-741AF35AA226}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -21,6 +23,10 @@ Global
|
|||||||
{19B76855-16CC-43CC-A0A6-5A7FFB43F077}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{19B76855-16CC-43CC-A0A6-5A7FFB43F077}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{19B76855-16CC-43CC-A0A6-5A7FFB43F077}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{19B76855-16CC-43CC-A0A6-5A7FFB43F077}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{19B76855-16CC-43CC-A0A6-5A7FFB43F077}.Release|Any CPU.Build.0 = Release|Any CPU
|
{19B76855-16CC-43CC-A0A6-5A7FFB43F077}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{526FF017-80E1-4094-804D-741AF35AA226}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{526FF017-80E1-4094-804D-741AF35AA226}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{526FF017-80E1-4094-804D-741AF35AA226}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{526FF017-80E1-4094-804D-741AF35AA226}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace MiraAPI.PluginLoading;
|
||||||
|
|
||||||
|
public interface IMiraExtension
|
||||||
|
{
|
||||||
|
public Type GetBasePluginType();
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ using System.Collections.ObjectModel;
|
|||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using BepInEx;
|
||||||
using BepInEx.Unity.IL2CPP;
|
using BepInEx.Unity.IL2CPP;
|
||||||
using MiraAPI.Colors;
|
using MiraAPI.Colors;
|
||||||
using MiraAPI.Events;
|
using MiraAPI.Events;
|
||||||
@@ -35,86 +36,24 @@ public sealed class MiraPluginManager
|
|||||||
Instance = this;
|
Instance = this;
|
||||||
IL2CPPChainloader.Instance.PluginLoad += (pluginInfo, assembly, plugin) =>
|
IL2CPPChainloader.Instance.PluginLoad += (pluginInfo, assembly, plugin) =>
|
||||||
{
|
{
|
||||||
if (plugin is not IMiraPlugin miraPlugin)
|
if (plugin is IMiraPlugin miraPlugin)
|
||||||
{
|
{
|
||||||
return;
|
var miraInfo = new MiraPluginInfo(miraPlugin, pluginInfo);
|
||||||
|
RegisterPlugin(miraInfo, assembly);
|
||||||
|
_registeredPlugins.Add(assembly, miraInfo);
|
||||||
}
|
}
|
||||||
|
if (plugin is IMiraExtension miraExtension)
|
||||||
var info = new MiraPluginInfo(miraPlugin, pluginInfo);
|
|
||||||
var roles = new List<Type>();
|
|
||||||
|
|
||||||
var oldConfigSetting = info.PluginConfig.SaveOnConfigSet;
|
|
||||||
info.PluginConfig.SaveOnConfigSet = false;
|
|
||||||
|
|
||||||
foreach (var type in assembly.GetTypes())
|
|
||||||
{
|
{
|
||||||
if (type.GetCustomAttribute<MiraIgnoreAttribute>() != null)
|
var basePlugin = miraExtension.GetBasePluginType();
|
||||||
|
var basePluginInfo = _registeredPlugins.Values.FirstOrDefault(x => x.MiraPlugin.GetType() == basePlugin);
|
||||||
|
if (basePluginInfo == null)
|
||||||
{
|
{
|
||||||
continue;
|
Logger<MiraApiPlugin>.Error($"Base plugin {basePlugin.Name} not found for extension {pluginInfo.Metadata.GUID}.");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var method in type.GetMethods())
|
RegisterPlugin(basePluginInfo, assembly);
|
||||||
{
|
|
||||||
var eventAttribute = method.GetCustomAttribute<RegisterEventAttribute>();
|
|
||||||
if (eventAttribute == null)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!method.IsStatic)
|
|
||||||
{
|
|
||||||
Logger<MiraApiPlugin>.Error($"Event method {method.Name} in {type.Name} must be static.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var parameters = method.GetParameters();
|
|
||||||
if (parameters.Length != 1 || !parameters[0].ParameterType.IsSubclassOf(typeof(MiraEvent)))
|
|
||||||
{
|
|
||||||
Logger<MiraApiPlugin>.Error($"Invalid event registration method {method.Name} in {type.Name}");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var paramType = parameters[0].ParameterType;
|
|
||||||
MiraEventManager.RegisterEventHandler(paramType, method, eventAttribute.Priority);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RegisterModifier(type, info))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RegisterOptions(type, info))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RegisterRole(type, info, out var role))
|
|
||||||
{
|
|
||||||
roles.Add(role);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RegisterButton(type, info))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RegisterGameOver(type))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
RegisterColorClasses(type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
info.PluginConfig.Save();
|
|
||||||
info.PluginConfig.SaveOnConfigSet = oldConfigSetting;
|
|
||||||
|
|
||||||
info.OptionGroups.Sort((x, y) => x.GroupPriority.CompareTo(y.GroupPriority));
|
|
||||||
QueuedRoleRegistrations.Add(info, roles);
|
|
||||||
|
|
||||||
_registeredPlugins.Add(assembly, info);
|
|
||||||
Logger<MiraApiPlugin>.Info($"Registering mod {pluginInfo.Metadata.GUID} with Mira API.");
|
|
||||||
};
|
};
|
||||||
IL2CPPChainloader.Instance.Finished += PaletteManager.RegisterAllColors;
|
IL2CPPChainloader.Instance.Finished += PaletteManager.RegisterAllColors;
|
||||||
IL2CPPChainloader.Instance.Finished += () =>
|
IL2CPPChainloader.Instance.Finished += () =>
|
||||||
@@ -133,6 +72,84 @@ public sealed class MiraPluginManager
|
|||||||
return Instance._registeredPlugins.Values.FirstOrDefault(plugin => plugin.PluginId == pluginId);
|
return Instance._registeredPlugins.Values.FirstOrDefault(plugin => plugin.PluginId == pluginId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void RegisterPlugin(MiraPluginInfo info, Assembly assembly)
|
||||||
|
{
|
||||||
|
var roles = new List<Type>();
|
||||||
|
|
||||||
|
var oldConfigSetting = info.PluginConfig.SaveOnConfigSet;
|
||||||
|
info.PluginConfig.SaveOnConfigSet = false;
|
||||||
|
|
||||||
|
foreach (var type in assembly.GetTypes())
|
||||||
|
{
|
||||||
|
if (type.GetCustomAttribute<MiraIgnoreAttribute>() != null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var method in type.GetMethods())
|
||||||
|
{
|
||||||
|
var eventAttribute = method.GetCustomAttribute<RegisterEventAttribute>();
|
||||||
|
if (eventAttribute == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!method.IsStatic)
|
||||||
|
{
|
||||||
|
Logger<MiraApiPlugin>.Error($"Event method {method.Name} in {type.Name} must be static.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var parameters = method.GetParameters();
|
||||||
|
if (parameters.Length != 1 || !parameters[0].ParameterType.IsSubclassOf(typeof(MiraEvent)))
|
||||||
|
{
|
||||||
|
Logger<MiraApiPlugin>.Error($"Invalid event registration method {method.Name} in {type.Name}");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var paramType = parameters[0].ParameterType;
|
||||||
|
MiraEventManager.RegisterEventHandler(paramType, method, eventAttribute.Priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RegisterModifier(type, info))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RegisterOptions(type, info))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RegisterRole(type, info, out var role))
|
||||||
|
{
|
||||||
|
roles.Add(role);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RegisterButton(type, info))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RegisterGameOver(type))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
RegisterColorClasses(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
info.PluginConfig.Save();
|
||||||
|
info.PluginConfig.SaveOnConfigSet = oldConfigSetting;
|
||||||
|
|
||||||
|
info.OptionGroups.Sort((x, y) => x.GroupPriority.CompareTo(y.GroupPriority));
|
||||||
|
QueuedRoleRegistrations.TryAdd(info, []);
|
||||||
|
QueuedRoleRegistrations[info].AddRange(roles);
|
||||||
|
|
||||||
|
Logger<MiraApiPlugin>.Info($"Registering mod {info.PluginId} with Mira API.");
|
||||||
|
}
|
||||||
|
|
||||||
private static bool RegisterGameOver(Type type)
|
private static bool RegisterGameOver(Type type)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
Reference in new issue
Block a user