Compare commits

...
5 Commits
Author SHA1 Message Date
Az b79c14ce50 resolve warnings that i am responsible for 2026-10-22 22:41:49 -04:00
Az 17dafadec8 move away from using GetCallingAssembly and GetExecutingAssembly 2026-10-22 22:35:17 -04:00
Az f9274eda09 consolidate code 2026-10-22 22:02:33 -04:00
Az 10daf01a55 facepalm 2026-10-22 21:32:13 -04:00
Az 1daffd7560 code ordering and cleanup 2026-10-22 21:15:57 -04:00
17 changed files with 346 additions and 343 deletions

No files matched your search

+3
View File
@@ -104,3 +104,6 @@ dotnet_diagnostic.S1244.severity = none
# S2325: Methods and properties that don't access instance data should be static # S2325: Methods and properties that don't access instance data should be static
dotnet_diagnostic.S2325.severity = none dotnet_diagnostic.S2325.severity = none
# IDE0005: Using directive is unnecessary.
dotnet_diagnostic.IDE0005.severity = warning
+1 -1
View File
@@ -8,7 +8,7 @@
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile> <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
<VersionPrefix>0.5.0</VersionPrefix> <VersionPrefix>0.6.0</VersionPrefix>
<VersionSuffix>dev</VersionSuffix> <VersionSuffix>dev</VersionSuffix>
<Authors>All Of Us, XtraCube, Angxl</Authors> <Authors>All Of Us, XtraCube, Angxl</Authors>
+9 -6
View File
@@ -1,14 +1,17 @@
using MiraAPI.Utilities.Assets; using System.Reflection;
using MiraAPI.Utilities.Assets;
namespace MiraAPI.Example; namespace MiraAPI.Example;
public static class ExampleAssets public static class ExampleAssets
{ {
public static LoadableResourceAsset ExampleButton { get; } = new("MiraAPI.Example.Resources.ExampleButton.png"); private static readonly Assembly _assembly = typeof(MiraAssets).Assembly;
public static LoadableResourceAsset CallMeetingButton { get; } = new("MiraAPI.Example.Resources.CallMeeting.png");
public static LoadableResourceAsset ExampleButton { get; } = new("MiraAPI.Example.Resources.ExampleButton.png", _assembly);
public static LoadableResourceAsset CallMeetingButton { get; } = new("MiraAPI.Example.Resources.CallMeeting.png", _assembly);
// Credit to EpicHorrors for the teleport button asset. // Credit to EpicHorrors for the teleport button asset.
public static LoadableResourceAsset TeleportButton { get; } = new("MiraAPI.Example.Resources.TeleportButton.png"); public static LoadableResourceAsset TeleportButton { get; } = new("MiraAPI.Example.Resources.TeleportButton.png", _assembly);
public static LoadableResourceAsset SharpshootButton { get; } = new("MiraAPI.Example.Resources.SharpshootButton.png"); public static LoadableResourceAsset SharpshootButton { get; } = new("MiraAPI.Example.Resources.SharpshootButton.png", _assembly);
public static LoadableResourceAsset Banner { get; } = new("MiraAPI.Example.Resources.FortniteBanner.jpeg"); public static LoadableResourceAsset Banner { get; } = new("MiraAPI.Example.Resources.FortniteBanner.jpeg", _assembly);
} }
+2 -2
View File
@@ -31,7 +31,7 @@ public static class ExampleEventHandlers
MiraEventManager.RegisterEventHandler<CompleteTaskEvent>(@event => MiraEventManager.RegisterEventHandler<CompleteTaskEvent>(@event =>
{ {
Logger<ExamplePlugin>.Info($"{@event.Player.Data.PlayerName} completed {@event.Task.TaskType.ToString()}"); Logger<ExamplePlugin>.Info($"{@event.Player.Data.PlayerName} completed {@event.Task.TaskType}");
}); });
// You can also unregister event handlers using the handle returned from RegisterEventHandler. // You can also unregister event handlers using the handle returned from RegisterEventHandler.
@@ -89,7 +89,7 @@ public static class ExampleEventHandlers
[RegisterEvent] [RegisterEvent]
public static void UpdateSystemEventHandler(UpdateSystemEvent @event) public static void UpdateSystemEventHandler(UpdateSystemEvent @event)
{ {
Logger<ExamplePlugin>.Error(@event.SystemType.ToString()); Logger<ExamplePlugin>.Error(@event.SystemType);
} }
// Example event handler // Example event handler
+2 -2
View File
@@ -35,7 +35,7 @@ public static class MiraEventManager
} }
catch (Exception ex) catch (Exception ex)
{ {
Error($"Error invoking event handler for {typeof(T).Name}: {ex.ToString()}"); Error($"Error invoking event handler for {typeof(T).Name}: {ex}");
} }
} }
@@ -65,7 +65,7 @@ public static class MiraEventManager
} }
catch (Exception ex) catch (Exception ex)
{ {
Error($"Error invoking event handler for {type.Name}: {ex.ToString()}"); Error($"Error invoking event handler for {type.Name}: {ex}");
} }
} }
+1 -1
View File
@@ -102,7 +102,7 @@ public partial class MiraApiPlugin : BasePlugin, IMiraPlugin
PluginManager = new MiraPluginManager(); PluginManager = new MiraPluginManager();
PluginManager.Initialize(this, this); PluginManager.Initialize(this, this);
MiraLocaleManager.Register("mira.api"); MiraLocaleManager.Register("mira.api", typeof(MiraApiPlugin).Assembly);
LocalizationManager.Register(new MiraLocalizationProvider()); LocalizationManager.Register(new MiraLocalizationProvider());
IL2CPPChainloader.Instance.Finished += IL2CPPChainloader.Instance.Finished +=
+4 -4
View File
@@ -77,7 +77,7 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr)
} }
catch (Exception e) catch (Exception e)
{ {
Error($"Error while deactivating modifier {modifier.ModifierName}: {e.ToString()}"); Error($"Error while deactivating modifier {modifier.ModifierName}: {e}");
} }
Modifiers.Remove(modifier); Modifiers.Remove(modifier);
@@ -95,7 +95,7 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr)
} }
catch (Exception e) catch (Exception e)
{ {
Error($"Error while activating modifier {modifier.ModifierName}: {e.ToString()}"); Error($"Error while activating modifier {modifier.ModifierName}: {e}");
} }
if (modifier is TimedModifier { AutoStart: true } timer) if (modifier is TimedModifier { AutoStart: true } timer)
@@ -122,7 +122,7 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr)
} }
catch (Exception e) catch (Exception e)
{ {
Error($"Error while (fixed) updating modifier {modifier.ModifierName}: {e.ToString()}"); Error($"Error while (fixed) updating modifier {modifier.ModifierName}: {e}");
} }
} }
@@ -153,7 +153,7 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr)
} }
catch (Exception e) catch (Exception e)
{ {
Error($"Error while updating modifier {modifier.ModifierName}: {e.ToString()}"); Error($"Error while updating modifier {modifier.ModifierName}: {e}");
} }
} }
} }
+1 -2
View File
@@ -1,5 +1,4 @@
using System.Globalization; using MiraAPI.GameModes;
using MiraAPI.GameModes;
using MiraAPI.PluginLoading; using MiraAPI.PluginLoading;
namespace MiraAPI.Modifiers.Types; namespace MiraAPI.Modifiers.Types;
+2 -2
View File
@@ -571,7 +571,7 @@ public static class CustomMurderRpc
} }
catch (Exception e) catch (Exception e)
{ {
Error($"Error with kill animation: {e.ToString()}"); Error($"Error with kill animation: {e}");
} }
} }
@@ -705,7 +705,7 @@ public static class CustomMurderRpc
} }
catch (Exception e) catch (Exception e)
{ {
Error($"Error with kill animation: {e.ToString()}"); Error($"Error with kill animation: {e}");
} }
} }
+4 -2
View File
@@ -186,9 +186,11 @@ public static class TaskAdderPatches
systemTypes = SystemTypes.UpperEngine; systemTypes = SystemTypes.UpperEngine;
} }
if (!folders.TryGetValue(systemTypes.ToString(), out var taskFolder3)) var systemType = systemTypes.ToString();
if (!folders.TryGetValue(systemType, out var taskFolder3))
{ {
taskFolder3 = folders[systemTypes.ToString()] = Object.Instantiate(__instance.RootFolderPrefab, __instance.transform); taskFolder3 = folders[systemType] = Object.Instantiate(__instance.RootFolderPrefab, __instance.transform);
taskFolder3.SetFolderColor(TaskFolder.FolderColor.Tan); taskFolder3.SetFolderColor(TaskFolder.FolderColor.Tan);
taskFolder3.gameObject.SetActive(false); taskFolder3.gameObject.SetActive(false);
taskFolder3.FolderName = systemTypes == SystemTypes.UpperEngine taskFolder3.FolderName = systemTypes == SystemTypes.UpperEngine
+33 -39
View File
@@ -25,6 +25,26 @@ public class MiraPluginInfo
PluginId = info.Metadata.GUID; PluginId = info.Metadata.GUID;
} }
/// <summary>
/// Gets the plugin's ID, as defined in the plugin's BepInEx metadata.
/// </summary>
public string PluginId { get; }
/// <summary>
/// Gets the plugin's instance as an <see cref="IMiraPlugin"/>.
/// </summary>
public IMiraPlugin MiraPlugin { get; }
/// <summary>
/// Gets the plugin's BepInEx metadata.
/// </summary>
public PluginInfo PluginInfo { get; }
/// <summary>
/// Gets the plugin's <see cref="ConfigFile"/>.
/// </summary>
public ConfigFile PluginConfig { get; }
/// <summary> /// <summary>
/// Gets a <see cref="IReadOnlyCollection{T}"/> of this <see cref="IMiraPlugin"/>'s <see cref="BaseModifier"/>s. This is not safe for <see cref="BaseModifier"/>s with constructors. /// Gets a <see cref="IReadOnlyCollection{T}"/> of this <see cref="IMiraPlugin"/>'s <see cref="BaseModifier"/>s. This is not safe for <see cref="BaseModifier"/>s with constructors.
/// </summary> /// </summary>
@@ -45,15 +65,6 @@ public class MiraPluginInfo
/// </summary> /// </summary>
public ReadOnlyDictionary<ushort, RoleBehaviour> Roles { get; private set; } = null!; public ReadOnlyDictionary<ushort, RoleBehaviour> Roles { get; private set; } = null!;
/// <summary>
/// Gets a read only dictionary of Game Mode IDs and the AbstractGameMode object they are associated with.
/// </summary>
/// <returns>Read only dictionary of IDs and Game Modes.</returns>
public ReadOnlyDictionary<uint, AbstractGameMode> GetModes()
{
return new ReadOnlyDictionary<uint, AbstractGameMode>(GameModes);
}
/// <summary> /// <summary>
/// Gets a <see cref="IReadOnlyCollection{T}"/> of this <see cref="IMiraPlugin"/>'s <see cref="CustomActionButton"/>. /// Gets a <see cref="IReadOnlyCollection{T}"/> of this <see cref="IMiraPlugin"/>'s <see cref="CustomActionButton"/>.
/// </summary> /// </summary>
@@ -74,6 +85,15 @@ public class MiraPluginInfo
/// </summary> /// </summary>
public IReadOnlyCollection<OptionPreset> Presets { get; internal set; } = null!; public IReadOnlyCollection<OptionPreset> Presets { get; internal set; } = null!;
/// <summary>
/// Gets a read only dictionary of Game Mode IDs and the AbstractGameMode object they are associated with.
/// </summary>
/// <returns>Read only dictionary of IDs and Game Modes.</returns>
public ReadOnlyDictionary<uint, AbstractGameMode> GetModes()
{
return new ReadOnlyDictionary<uint, AbstractGameMode>(GameModes);
}
internal void SavePublicCollections() internal void SavePublicCollections()
{ {
Presets = [.. InternalPresets]; Presets = [.. InternalPresets];
@@ -87,39 +107,13 @@ public class MiraPluginInfo
} }
internal List<OptionPreset> InternalPresets { get; } = []; internal List<OptionPreset> InternalPresets { get; } = [];
internal List<AbstractOptionGroup> InternalOptionGroups { get; } = [];
internal List<IModdedOption> InternalOptions { get; } = []; internal List<IModdedOption> InternalOptions { get; } = [];
internal List<BaseModifier> InternalModifiers { get; } = []; internal List<BaseModifier> InternalModifiers { get; } = [];
internal List<CustomActionButton> InternalButtons { get; } = [];
internal List<AbstractOptionGroup> InternalOptionGroups { get; } = [];
internal List<MeetingActionButton> InternalMeetingButtons { get; } = [];
internal List<TargetedMeetingButton> InternalTargetedMeetingButtons { get; } = [];
internal Dictionary<uint, AbstractGameMode> GameModes { get; } = []; internal Dictionary<uint, AbstractGameMode> GameModes { get; } = [];
internal Dictionary<ushort, RoleBehaviour> InternalRoles { get; } = []; internal Dictionary<ushort, RoleBehaviour> InternalRoles { get; } = [];
internal List<CustomActionButton> InternalButtons { get; } = [];
internal List<TargetedMeetingButton> InternalTargetedMeetingButtons { get; } = [];
internal List<MeetingActionButton> InternalMeetingButtons { get; } = [];
/// <summary>
/// Gets the plugin's ID, as defined in the plugin's BepInEx metadata.
/// </summary>
public string PluginId { get; }
/// <summary>
/// Gets the plugin's instance as an <see cref="IMiraPlugin"/>.
/// </summary>
public IMiraPlugin MiraPlugin { get; }
/// <summary>
/// Gets the plugin's BepInEx metadata.
/// </summary>
public PluginInfo PluginInfo { get; }
/// <summary>
/// Gets the plugin's <see cref="ConfigFile"/>.
/// </summary>
public ConfigFile PluginConfig { get; }
} }
+103 -193
View File
@@ -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.Configuration; using BepInEx.Configuration;
using BepInEx.Unity.IL2CPP; using BepInEx.Unity.IL2CPP;
using HarmonyLib; using HarmonyLib;
@@ -24,7 +25,6 @@ using MiraAPI.Roles;
using MiraAPI.Translation; using MiraAPI.Translation;
using MiraAPI.Utilities; using MiraAPI.Utilities;
using Reactor.Networking; using Reactor.Networking;
using Reactor.Utilities;
namespace MiraAPI.PluginLoading; namespace MiraAPI.PluginLoading;
@@ -49,100 +49,14 @@ public sealed class MiraPluginManager
Instance = this; Instance = this;
CustomGameModeManager.RegisterDefaultMode(); CustomGameModeManager.RegisterDefaultMode();
CustomGameModeManager.GetAndSetGameMode(); CustomGameModeManager.GetAndSetGameMode();
if (IL2CPPChainloader.Instance.Plugins.TryGetValue(MiraApiPlugin.Id, out var newPlugin)) if (IL2CPPChainloader.Instance.Plugins.TryGetValue(MiraApiPlugin.Id, out var newPlugin))
{ {
var assembly = Assembly.GetCallingAssembly(); var info = RegisterPlugin(typeof(MiraPluginManager).Assembly, apiPlugin, newPlugin, miraApiPlugin, true);
var info = new MiraPluginInfo(apiPlugin, newPlugin);
var roles = new List<Type>();
var oldConfigSetting = info.PluginConfig.SaveOnConfigSet;
info.PluginConfig.SaveOnConfigSet = false;
foreach (var type in assembly.GetTypes())
{
if (type.IsAbstract || type.GetCustomAttribute<MiraIgnoreAttribute>() != null)
{
continue;
}
foreach (var method in AccessTools.GetDeclaredMethods(type))
{
var eventAttribute = method.GetCustomAttribute<RegisterEventAttribute>();
if (eventAttribute == null)
{
continue;
}
if (!method.IsStatic)
{
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)))
{
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 (RegisterLocalTabs(type, miraApiPlugin))
{
continue;
}
if (RegisterRole(type, info, out var role))
{
roles.Add(role);
continue;
}
if (RegisterButton(type, info))
{
continue;
}
if (RegisterGameOver(type))
{
continue;
}
if (RegisterGameModeAttribute(type, info))
{
continue;
}
RegisterColorClasses(type);
RegisterKeybinds(type, miraApiPlugin);
}
info.PluginConfig.Save();
info.PluginConfig.SaveOnConfigSet = oldConfigSetting;
MiraApiConfig = info.PluginConfig; MiraApiConfig = info.PluginConfig;
info.InternalOptionGroups.Sort((x, y) => x.GroupPriority.CompareTo(y.GroupPriority));
QueuedRoleRegistrations.Add(info, roles);
_registeredPlugins.Add(assembly, info);
MiraApiPluginInfo = info; MiraApiPluginInfo = info;
info.SavePublicCollections();
PresetManager.CreateDefaultPreset(info);
PresetManager.LoadPresets(info);
Info($"Registering Mira API as mod."); Info($"Registering Mira API as mod.");
} }
@@ -153,110 +67,14 @@ public sealed class MiraPluginManager
return; return;
} }
var info = new MiraPluginInfo(miraPlugin, pluginInfo); RegisterPlugin(assembly, miraPlugin, pluginInfo, plugin, false);
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 AccessTools.GetDeclaredMethods(type))
{
var eventAttribute = method.GetCustomAttribute<RegisterEventAttribute>();
if (eventAttribute == null)
{
continue;
}
if (!method.IsStatic)
{
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)))
{
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 (RegisterLocalTabs(type, plugin))
{
continue;
}
if (RegisterRole(type, info, out var role))
{
roles.Add(role);
continue;
}
if (RegisterButton(type, info))
{
continue;
}
if (RegisterGameOver(type))
{
continue;
}
if (RegisterMeetingAbility(type, info))
{
continue;
}
if (RegisterTargetedMeetingAbility(type, info))
{
continue;
}
if (RegisterGameModeAttribute(type, info))
{
continue;
}
RegisterColorClasses(type);
RegisterKeybinds(type, plugin);
}
info.PluginConfig.Save();
info.PluginConfig.SaveOnConfigSet = oldConfigSetting;
info.InternalOptionGroups.Sort((x, y) => x.GroupPriority.CompareTo(y.GroupPriority));
QueuedRoleRegistrations.Add(info, roles);
_registeredPlugins.Add(assembly, info);
info.SavePublicCollections();
PresetManager.CreateDefaultPreset(info);
PresetManager.LoadPresets(info);
Info($"Registering mod {pluginInfo.Metadata.GUID} with Mira API."); Info($"Registering mod {pluginInfo.Metadata.GUID} with Mira API.");
}; };
IL2CPPChainloader.Instance.Finished += PaletteManager.RegisterAllColors;
IL2CPPChainloader.Instance.Finished += () => IL2CPPChainloader.Instance.Finished += () =>
{ {
PaletteManager.RegisterAllColors();
// Save all buttons into a read-only collection for easy access // Save all buttons into a read-only collection for easy access
CustomButtonManager.Buttons = new ReadOnlyCollection<CustomActionButton>(CustomButtonManager.CustomButtons); CustomButtonManager.Buttons = new ReadOnlyCollection<CustomActionButton>(CustomButtonManager.CustomButtons);
CustomButtonManager.EventTypes = new ReadOnlyDictionary<Type, Type>(CustomButtonManager.ButtonEventTypes); CustomButtonManager.EventTypes = new ReadOnlyDictionary<Type, Type>(CustomButtonManager.ButtonEventTypes);
@@ -269,9 +87,101 @@ public sealed class MiraPluginManager
ModifierManager.Modifiers = new ReadOnlyCollection<BaseModifier>(ModifierManager.InternalModifiers); ModifierManager.Modifiers = new ReadOnlyCollection<BaseModifier>(ModifierManager.InternalModifiers);
}; };
}
RegisterKeybinds(typeof(MiraGlobalKeybinds), PluginSingleton<MiraApiPlugin>.Instance); private MiraPluginInfo RegisterPlugin(Assembly assembly, IMiraPlugin plugin, PluginInfo pluginInfo, BasePlugin basePlugin, bool isMira)
RegisterLocalTabs(typeof(MiraApiSettings), PluginSingleton<MiraApiPlugin>.Instance); {
var info = new MiraPluginInfo(plugin, pluginInfo);
var roles = new List<Type>();
var oldConfigSetting = info.PluginConfig.SaveOnConfigSet;
info.PluginConfig.SaveOnConfigSet = false;
ProcessAssemblyTypes(assembly, info, basePlugin, roles, isMira);
info.PluginConfig.Save();
info.PluginConfig.SaveOnConfigSet = oldConfigSetting;
info.InternalOptionGroups.Sort((x, y) => x.GroupPriority.CompareTo(y.GroupPriority));
QueuedRoleRegistrations.Add(info, roles);
_registeredPlugins.Add(assembly, info);
info.SavePublicCollections();
PresetManager.CreateDefaultPreset(info);
PresetManager.LoadPresets(info);
return info;
}
private static void ProcessAssemblyTypes(Assembly assembly, MiraPluginInfo info, BasePlugin basePlugin, List<Type> roles, bool isMira)
{
foreach (var type in assembly.GetTypes())
{
if ((isMira && type.IsAbstract) || type.GetCustomAttribute<MiraIgnoreAttribute>() != null)
continue;
RegisterEvents(type);
if (RegisterModifier(type, info))
continue;
if (RegisterOptions(type, info))
continue;
if (RegisterLocalTabs(type, basePlugin))
continue;
if (RegisterRole(type, info, out var role))
{
roles.Add(role);
continue;
}
if (RegisterButton(type, info))
continue;
if (RegisterGameOver(type))
continue;
if (RegisterMeetingAbility(type, info))
continue;
if (RegisterTargetedMeetingAbility(type, info))
continue;
if (RegisterGameModeAttribute(type, info))
continue;
RegisterColorClasses(type);
RegisterKeybinds(type, basePlugin);
}
}
private static void RegisterEvents(Type type)
{
foreach (var method in AccessTools.GetDeclaredMethods(type))
{
var eventAttribute = method.GetCustomAttribute<RegisterEventAttribute>();
if (eventAttribute == null)
continue;
if (!method.IsStatic)
{
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)))
{
Error($"Invalid event registration method {method.Name} in {type.Name}");
continue;
}
var paramType = parameters[0].ParameterType;
MiraEventManager.RegisterEventHandler(paramType, method, eventAttribute.Priority);
}
} }
/// <summary> /// <summary>
@@ -358,7 +268,7 @@ public sealed class MiraPluginManager
} }
catch (Exception e) catch (Exception e)
{ {
Error($"Failed to register options for {type.Name}: {e.ToString()}"); Error($"Failed to register options for {type.Name}: {e}");
} }
return false; return false;
@@ -543,7 +453,7 @@ public sealed class MiraPluginManager
} }
catch (Exception e) catch (Exception e)
{ {
Error($"Failed to register options for {type.Name}: {e.ToString()}"); Error($"Failed to register options for {type.Name}: {e}");
} }
return false; return false;
+37 -11
View File
@@ -72,6 +72,7 @@ public static class MiraLocaleManager
/// </summary> /// </summary>
public static Dictionary<MiraLanguage, string> LangCultureList { get; } = new() public static Dictionary<MiraLanguage, string> LangCultureList { get; } = new()
{ {
// Vanilla
{ MiraLanguage.English, "en-US" }, { MiraLanguage.English, "en-US" },
{ MiraLanguage.Latam, "es-419" }, { MiraLanguage.Latam, "es-419" },
{ MiraLanguage.Brazilian, "pt-BR" }, { MiraLanguage.Brazilian, "pt-BR" },
@@ -88,15 +89,17 @@ public static class MiraLocaleManager
{ MiraLanguage.SChinese, "zh-CN" }, { MiraLanguage.SChinese, "zh-CN" },
{ MiraLanguage.TChinese, "zh-TW" }, { MiraLanguage.TChinese, "zh-TW" },
{ MiraLanguage.Irish, "ga-IE" }, { MiraLanguage.Irish, "ga-IE" },
{ MiraLanguage.Polish, "pl-PL" }, // Custom
{ MiraLanguage.Turkish, "tr-TR" }, // Custom // Custom
{ MiraLanguage.Swedish, "sv-SE" }, // Custom { MiraLanguage.Polish, "pl-PL" },
{ MiraLanguage.Lithuanian, "lt-LT" }, // Custom { MiraLanguage.Turkish, "tr-TR" },
{ MiraLanguage.Czech, "cs-CZ" }, // Custom { MiraLanguage.Swedish, "sv-SE" },
{ MiraLanguage.LChinese, "lzh-CN" }, // Custom { MiraLanguage.Lithuanian, "lt-LT" },
{ MiraLanguage.Greek, "el-GR" }, // Custom { MiraLanguage.Czech, "cs-CZ" },
{ MiraLanguage.Arabic, "arb" }, // Custom { MiraLanguage.LChinese, "lzh-CN" },
{ MiraLanguage.Hebrew, "heb" }, // Custom { MiraLanguage.Greek, "el-GR" },
{ MiraLanguage.Arabic, "arb" },
{ MiraLanguage.Hebrew, "heb" },
}; };
/// <summary> /// <summary>
@@ -123,26 +126,49 @@ public static class MiraLocaleManager
/// Call once per mod during plugin Load(). /// Call once per mod during plugin Load().
/// </summary> /// </summary>
/// <param name="modGuid">The mod GUID (e.g., "mira.example").</param> /// <param name="modGuid">The mod GUID (e.g., "mira.example").</param>
[Obsolete("Pass typeof(YourPlugin).Assembly directly to Register for better performance.")]
public static void Register(string modGuid) public static void Register(string modGuid)
{ {
var callingAssembly = Assembly.GetCallingAssembly(); var callingAssembly = Assembly.GetCallingAssembly();
LoadInternalStrings(callingAssembly, callingAssembly.GetName().Name!, modGuid); LoadInternalStrings(callingAssembly, callingAssembly.GetName().Name!, modGuid);
} }
/// <summary>
/// Registers translations for a mod.
/// Call once per mod during plugin Load().
/// </summary>
/// <param name="modGuid">The mod GUID (e.g., "mira.example").</param>
/// <param name="assembly">The <see cref="Assembly"/> to load the strings from.</param>
public static void Register(string modGuid, Assembly assembly)
{
LoadInternalStrings(assembly, assembly.GetName().Name!, modGuid);
}
/// <summary> /// <summary>
/// Registers translations for a mod. /// Registers translations for a mod.
/// Call once per mod during plugin Load(). /// Call once per mod during plugin Load().
/// </summary> /// </summary>
/// <param name="modGuid">The mod GUID (e.g., "mira.example").</param> /// <param name="modGuid">The mod GUID (e.g., "mira.example").</param>
/// <param name="internalName">The mod's root namespace (e.g., "mira.api").</param> /// <param name="internalName">The mod's root namespace (e.g., "mira.api").</param>
[Obsolete("Pass typeof(YourPlugin).Assembly directly to Register for better performance.")]
public static void Register(string modGuid, string internalName) public static void Register(string modGuid, string internalName)
{ {
var callingAssembly = Assembly.GetCallingAssembly(); var callingAssembly = Assembly.GetCallingAssembly();
LoadInternalStrings(callingAssembly, internalName, modGuid); LoadInternalStrings(callingAssembly, internalName, modGuid);
} }
/// <summary>
/// Registers translations for a mod.
/// Call once per mod during plugin Load().
/// </summary>
/// <param name="modGuid">The mod GUID (e.g., "mira.example").</param>
/// <param name="internalName">The mod's root namespace (e.g., "mira.api").</param>
/// <param name="assembly">The <see cref="Assembly"/> to load the strings from.</param>
public static void Register(string modGuid, string internalName, Assembly assembly)
{
LoadInternalStrings(assembly, internalName, modGuid);
}
/// <summary> /// <summary>
/// Translates a key into the current language. /// Translates a key into the current language.
/// </summary> /// </summary>
@@ -1,3 +1,4 @@
using System;
using System.Reflection; using System.Reflection;
using UnityEngine; using UnityEngine;
@@ -6,17 +7,39 @@ namespace MiraAPI.Utilities.Assets;
/// <summary> /// <summary>
/// A utility class for loading .WAV audio assets from the DLL's embedded resources. /// A utility class for loading .WAV audio assets from the DLL's embedded resources.
/// </summary> /// </summary>
/// <param name="path">The path of the wave file.</param> public class LoadableAudioResourceAsset : LoadableAsset<AudioClip>
public class LoadableAudioResourceAsset(string path) : LoadableAsset<AudioClip>
{ {
private readonly Assembly _assembly = Assembly.GetCallingAssembly(); private readonly string _path;
private readonly Assembly _assembly;
/// <summary>
/// Initializes a new instance of the <see cref="LoadableAudioResourceAsset"/> class with the provided resource path and the assembly containing the asset.
/// </summary>
/// <param name="path">The path of the wave file.</param>
/// <param name="assembly">The <see cref="Assembly"/> containing the asset.</param>
public LoadableAudioResourceAsset(string path, Assembly assembly)
{
_path = path;
_assembly = assembly;
}
/// <summary>
/// Initializes a new instance of the <see cref="LoadableAudioResourceAsset"/> class with the provided resource path.
/// </summary>
/// <param name="path">The path of the wave file.</param>
[Obsolete("Pass typeof(YourPlugin).Assembly directly to the constructor for better performance.")]
public LoadableAudioResourceAsset(string path)
{
_path = path;
_assembly = Assembly.GetCallingAssembly();
}
/// <inheritdoc /> /// <inheritdoc />
public override AudioClip LoadAsset() public override AudioClip LoadAsset()
{ {
if (!LoadedAsset) if (!LoadedAsset)
{ {
LoadedAsset = AudioTools.LoadAudioFromResources(path, _assembly); LoadedAsset = AudioTools.LoadAudioFromResources(_path, _assembly);
} }
return LoadedAsset!; return LoadedAsset!;
@@ -1,4 +1,5 @@
using System.Reflection; using System;
using System.Reflection;
using UnityEngine; using UnityEngine;
namespace MiraAPI.Utilities.Assets; namespace MiraAPI.Utilities.Assets;
@@ -6,18 +7,44 @@ namespace MiraAPI.Utilities.Assets;
/// <summary> /// <summary>
/// A utility class for loading assets from embedded resources. /// A utility class for loading assets from embedded resources.
/// </summary> /// </summary>
/// <param name="path">The path to the embedded resource.</param> public class LoadableResourceAsset : LoadableAsset<Sprite>
/// <param name="pixelsPerUnit">The pixels per unit for the loaded sprite.</param>
public class LoadableResourceAsset(string path, float pixelsPerUnit = 100f) : LoadableAsset<Sprite>
{ {
private readonly Assembly _assembly = Assembly.GetCallingAssembly(); private readonly string _path;
private readonly float _pixelsPerUnit;
private readonly Assembly _assembly;
/// <summary>
/// Initializes a new instance of the <see cref="LoadableResourceAsset"/> class with the provided resource path and the assembly containing the asset.
/// </summary>
/// <param name="path">The path to the embedded resource.</param>
/// <param name="assembly">The <see cref="Assembly"/> containing the asset.</param>
/// <param name="pixelsPerUnit">The pixels per unit for the loaded sprite.</param>
public LoadableResourceAsset(string path, Assembly assembly, float pixelsPerUnit = 100f)
{
_path = path;
_assembly = assembly;
_pixelsPerUnit = pixelsPerUnit;
}
/// <summary>
/// Initializes a new instance of the <see cref="LoadableResourceAsset"/> class with the provided resource path and the assembly containing the asset.
/// </summary>
/// <param name="path">The path to the embedded resource.</param>
/// <param name="pixelsPerUnit">The pixels per unit for the loaded sprite.</param>
[Obsolete("Pass typeof(YourPlugin).Assembly directly to the constructor for better performance.")]
public LoadableResourceAsset(string path, float pixelsPerUnit = 100f)
{
_path = path;
_pixelsPerUnit = pixelsPerUnit;
_assembly = Assembly.GetCallingAssembly();
}
/// <inheritdoc /> /// <inheritdoc />
public override Sprite LoadAsset() public override Sprite LoadAsset()
{ {
if (!LoadedAsset) if (!LoadedAsset)
{ {
LoadedAsset = SpriteTools.LoadSpriteFromPath(path, _assembly, pixelsPerUnit); LoadedAsset = SpriteTools.LoadSpriteFromPath(_path, _assembly, _pixelsPerUnit);
} }
return LoadedAsset!; return LoadedAsset!;
+69 -66
View File
@@ -1,4 +1,5 @@
using Reactor.Utilities; using System.Reflection;
using Reactor.Utilities;
using UnityEngine; using UnityEngine;
namespace MiraAPI.Utilities.Assets; namespace MiraAPI.Utilities.Assets;
@@ -8,11 +9,13 @@ namespace MiraAPI.Utilities.Assets;
/// </summary> /// </summary>
public static class MiraAssets public static class MiraAssets
{ {
private static readonly Assembly _assembly = typeof(MiraAssets).Assembly;
static MiraAssets() static MiraAssets()
{ {
var boxTex = SpriteTools.LoadTextureFromResourcePath( var boxTex = SpriteTools.LoadTextureFromResourcePath(
"MiraAPI.Resources.RoundedBox.png", "MiraAPI.Resources.RoundedBox.png",
System.Reflection.Assembly.GetExecutingAssembly()); _assembly);
var boxSprite = Sprite.Create( var boxSprite = Sprite.Create(
boxTex, boxTex,
new Rect(0, 0, boxTex.width, boxTex.height), new Rect(0, 0, boxTex.width, boxTex.height),
@@ -58,7 +61,7 @@ public static class MiraAssets
/// <summary> /// <summary>
/// Gets the empty <see cref="Sprite"/> asset. /// Gets the empty <see cref="Sprite"/> asset.
/// </summary> /// </summary>
public static LoadableResourceAsset Empty { get; } = new("MiraAPI.Resources.Empty.png"); public static LoadableResourceAsset Empty { get; } = new("MiraAPI.Resources.Empty.png", _assembly);
/// <summary> /// <summary>
/// Gets the RoundedBox <see cref="Sprite"/>, which is a rounded rectangle used for UI elements. /// Gets the RoundedBox <see cref="Sprite"/>, which is a rounded rectangle used for UI elements.
@@ -68,312 +71,312 @@ public static class MiraAssets
/// <summary> /// <summary>
/// Gets the Next Button sprite. /// Gets the Next Button sprite.
/// </summary> /// </summary>
public static LoadableResourceAsset NextButton { get; } = new("MiraAPI.Resources.NextButton.png"); public static LoadableResourceAsset NextButton { get; } = new("MiraAPI.Resources.NextButton.png", _assembly);
/// <summary> /// <summary>
/// Gets the Mira settings icon. /// Gets the Mira settings icon.
/// </summary> /// </summary>
public static LoadableResourceAsset SettingsIcon { get; } = new("MiraAPI.Resources.Settings.png"); public static LoadableResourceAsset SettingsIcon { get; } = new("MiraAPI.Resources.Settings.png", _assembly);
/// <summary> /// <summary>
/// Gets the highlighted Next Button sprite. /// Gets the highlighted Next Button sprite.
/// </summary> /// </summary>
public static LoadableResourceAsset NextButtonActive { get; } = new("MiraAPI.Resources.NextButtonActive.png"); public static LoadableResourceAsset NextButtonActive { get; } = new("MiraAPI.Resources.NextButtonActive.png", _assembly);
/// <summary> /// <summary>
/// Gets the Cog icon used in Role Settings Menu. /// Gets the Cog icon used in Role Settings Menu.
/// </summary> /// </summary>
public static LoadableResourceAsset Cog { get; } = new("MiraAPI.Resources.Cog.png"); public static LoadableResourceAsset Cog { get; } = new("MiraAPI.Resources.Cog.png", _assembly);
/// <summary> /// <summary>
/// Gets the Checkmark Box used in the Settings Menu. /// Gets the Checkmark Box used in the Settings Menu.
/// </summary> /// </summary>
public static LoadableResourceAsset CheckmarkBox { get; } = new("MiraAPI.Resources.CheckMarkBox.png"); public static LoadableResourceAsset CheckmarkBox { get; } = new("MiraAPI.Resources.CheckMarkBox.png", _assembly);
/// <summary> /// <summary>
/// Gets the Reset Box used in the Settings Menu. /// Gets the Reset Box used in the Settings Menu.
/// </summary> /// </summary>
public static LoadableResourceAsset ResetButton { get; } = new("MiraAPI.Resources.ResetButton.png"); public static LoadableResourceAsset ResetButton { get; } = new("MiraAPI.Resources.ResetButton.png", _assembly);
/// <summary> /// <summary>
/// Gets the Checkmark used in the Settings Menu. /// Gets the Checkmark used in the Settings Menu.
/// </summary> /// </summary>
public static LoadableResourceAsset Checkmark { get; } = new("MiraAPI.Resources.Checkmark.png"); public static LoadableResourceAsset Checkmark { get; } = new("MiraAPI.Resources.Checkmark.png", _assembly);
/// <summary> /// <summary>
/// Gets the white CategoryHeader used in the Settings Menu. /// Gets the white CategoryHeader used in the Settings Menu.
/// </summary> /// </summary>
public static LoadableResourceAsset CategoryHeader { get; } = new("MiraAPI.Resources.CategoryHeader.png"); public static LoadableResourceAsset CategoryHeader { get; } = new("MiraAPI.Resources.CategoryHeader.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the Keybind icons. /// Gets the sprite used for the Keybind icons.
/// </summary> /// </summary>
public static LoadableResourceAsset KeybindButton { get; } = new("MiraAPI.Resources.KeybindButton.png"); public static LoadableResourceAsset KeybindButton { get; } = new("MiraAPI.Resources.KeybindButton.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for crewmate role files in TaskAdderGame. /// Gets the sprite used for crewmate role files in TaskAdderGame.
/// </summary> /// </summary>
public static LoadableResourceAsset CrewmateFile { get; } = new("MiraAPI.Resources.CrewmateFile.png"); public static LoadableResourceAsset CrewmateFile { get; } = new("MiraAPI.Resources.CrewmateFile.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for impostor role files in TaskAdderGame. /// Gets the sprite used for impostor role files in TaskAdderGame.
/// </summary> /// </summary>
public static LoadableResourceAsset ImpostorFile { get; } = new("MiraAPI.Resources.ImpostorFile.png"); public static LoadableResourceAsset ImpostorFile { get; } = new("MiraAPI.Resources.ImpostorFile.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for custom team role files in TaskAdderGame. /// Gets the sprite used for custom team role files in TaskAdderGame.
/// </summary> /// </summary>
public static LoadableResourceAsset CustomTeamFile { get; } = new("MiraAPI.Resources.CustomFile.png"); public static LoadableResourceAsset CustomTeamFile { get; } = new("MiraAPI.Resources.CustomFile.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for modifier file in TaskAdderGame. /// Gets the sprite used for modifier file in TaskAdderGame.
/// </summary> /// </summary>
public static LoadableResourceAsset ModifierFile { get; } = new("MiraAPI.Resources.ModifierFile.png"); public static LoadableResourceAsset ModifierFile { get; } = new("MiraAPI.Resources.ModifierFile.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the Classic gamemode. /// Gets the sprite used for the Classic gamemode.
/// </summary> /// </summary>
public static LoadableResourceAsset ClassicGamemodeIcon { get; } = new("MiraAPI.Resources.ClassicGamemodeIcon.png"); public static LoadableResourceAsset ClassicGamemodeIcon { get; } = new("MiraAPI.Resources.ClassicGamemodeIcon.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the Hide n Seek gamemode. /// Gets the sprite used for the Hide n Seek gamemode.
/// </summary> /// </summary>
public static LoadableResourceAsset HnSGamemodeIcon { get; } = new("MiraAPI.Resources.HnSGamemodeIcon.png"); public static LoadableResourceAsset HnSGamemodeIcon { get; } = new("MiraAPI.Resources.HnSGamemodeIcon.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for timed modifier file in TaskAdderGame. /// Gets the sprite used for timed modifier file in TaskAdderGame.
/// </summary> /// </summary>
public static LoadableResourceAsset TimedModifierFile { get; } = new("MiraAPI.Resources.TimedModifierFile.png"); public static LoadableResourceAsset TimedModifierFile { get; } = new("MiraAPI.Resources.TimedModifierFile.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the new chat button while hovering. /// Gets the sprite used for the new chat button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset ChatHoverSprite { get; } = new("MiraAPI.Resources.NormalChatHover.png"); public static LoadableResourceAsset ChatHoverSprite { get; } = new("MiraAPI.Resources.NormalChatHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the new chat button while hovering. /// Gets the sprite used for the new chat button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset ChatIdleSprite { get; } = new("MiraAPI.Resources.NormalChatIdle.png"); public static LoadableResourceAsset ChatIdleSprite { get; } = new("MiraAPI.Resources.NormalChatIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the new chat button while hovering. /// Gets the sprite used for the new chat button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset ChatOpenSprite { get; } = new("MiraAPI.Resources.NormalChatOpen.png"); public static LoadableResourceAsset ChatOpenSprite { get; } = new("MiraAPI.Resources.NormalChatOpen.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for players button while hovering. /// Gets the sprite used for players button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset WikiPlayersButtonHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarPlayersButtonHover.png"); public static LoadableResourceAsset WikiPlayersButtonHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarPlayersButtonHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the players button while hovering. /// Gets the sprite used for the players button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset WikiPlayersButtonIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarPlayersButtonIdle.png"); public static LoadableResourceAsset WikiPlayersButtonIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarPlayersButtonIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the players button while hovering. /// Gets the sprite used for the players button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset WikiPlayersButtonOpenSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarPlayersButtonOpen.png"); public static LoadableResourceAsset WikiPlayersButtonOpenSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarPlayersButtonOpen.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the settings button while hovering. /// Gets the sprite used for the settings button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset WikiSettingsButtonHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarSettingsButtonHover.png"); public static LoadableResourceAsset WikiSettingsButtonHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarSettingsButtonHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the settings button while hovering. /// Gets the sprite used for the settings button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset WikiSettingsButtonIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarSettingsButtonIdle.png"); public static LoadableResourceAsset WikiSettingsButtonIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarSettingsButtonIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the settings button while hovering. /// Gets the sprite used for the settings button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset WikiSettingsButtonOpenSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarSettingsButtonOpen.png"); public static LoadableResourceAsset WikiSettingsButtonOpenSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarSettingsButtonOpen.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset WikiRolesButtonHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarRolesButtonHover.png"); public static LoadableResourceAsset WikiRolesButtonHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarRolesButtonHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset WikiRolesButtonIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarRolesButtonIdle.png"); public static LoadableResourceAsset WikiRolesButtonIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarRolesButtonIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset WikiRolesButtonOpenSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarRolesButtonOpen.png"); public static LoadableResourceAsset WikiRolesButtonOpenSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarRolesButtonOpen.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the modifiers button while hovering. /// Gets the sprite used for the modifiers button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset WikiModifiersButtonHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarModifiersButtonHover.png"); public static LoadableResourceAsset WikiModifiersButtonHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarModifiersButtonHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the modifiers button while hovering. /// Gets the sprite used for the modifiers button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset WikiModifiersButtonIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarModifiersButtonIdle.png"); public static LoadableResourceAsset WikiModifiersButtonIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarModifiersButtonIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the modifiers button while hovering. /// Gets the sprite used for the modifiers button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset WikiModifiersButtonOpenSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarModifiersButtonOpen.png"); public static LoadableResourceAsset WikiModifiersButtonOpenSprite { get; } = new("MiraAPI.Resources.Wiki.SidebarModifiersButtonOpen.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset GroupCountHoverSprite { get; } = new("MiraAPI.Resources.Wiki.GroupCountHover.png"); public static LoadableResourceAsset GroupCountHoverSprite { get; } = new("MiraAPI.Resources.Wiki.GroupCountHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset GroupCountIdleSprite { get; } = new("MiraAPI.Resources.Wiki.GroupCountIdle.png"); public static LoadableResourceAsset GroupCountIdleSprite { get; } = new("MiraAPI.Resources.Wiki.GroupCountIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset GroupFactionHoverSprite { get; } = new("MiraAPI.Resources.Wiki.GroupFactionHover.png"); public static LoadableResourceAsset GroupFactionHoverSprite { get; } = new("MiraAPI.Resources.Wiki.GroupFactionHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset GroupFactionIdleSprite { get; } = new("MiraAPI.Resources.Wiki.GroupFactionIdle.png"); public static LoadableResourceAsset GroupFactionIdleSprite { get; } = new("MiraAPI.Resources.Wiki.GroupFactionIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset GroupNoneHoverSprite { get; } = new("MiraAPI.Resources.Wiki.GroupNoneHover.png"); public static LoadableResourceAsset GroupNoneHoverSprite { get; } = new("MiraAPI.Resources.Wiki.GroupNoneHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset GroupNoneIdleSprite { get; } = new("MiraAPI.Resources.Wiki.GroupNoneIdle.png"); public static LoadableResourceAsset GroupNoneIdleSprite { get; } = new("MiraAPI.Resources.Wiki.GroupNoneIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset SearchClearHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SearchClearHover.png"); public static LoadableResourceAsset SearchClearHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SearchClearHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset SearchClearIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SearchClearIdle.png"); public static LoadableResourceAsset SearchClearIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SearchClearIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset SearchIconHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SearchIconHover.png"); public static LoadableResourceAsset SearchIconHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SearchIconHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset SearchIconIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SearchIconIdle.png"); public static LoadableResourceAsset SearchIconIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SearchIconIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset SortingAzHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SortingAzHover.png"); public static LoadableResourceAsset SortingAzHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SortingAzHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset SortingAzIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SortingAzIdle.png"); public static LoadableResourceAsset SortingAzIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SortingAzIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset SortingZaHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SortingZaHover.png"); public static LoadableResourceAsset SortingZaHoverSprite { get; } = new("MiraAPI.Resources.Wiki.SortingZaHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset SortingZaIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SortingZaIdle.png"); public static LoadableResourceAsset SortingZaIdleSprite { get; } = new("MiraAPI.Resources.Wiki.SortingZaIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset VisibleAllHoverSprite { get; } = new("MiraAPI.Resources.Wiki.VisibleAllHover.png"); public static LoadableResourceAsset VisibleAllHoverSprite { get; } = new("MiraAPI.Resources.Wiki.VisibleAllHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset VisibleAllIdleSprite { get; } = new("MiraAPI.Resources.Wiki.VisibleAllIdle.png"); public static LoadableResourceAsset VisibleAllIdleSprite { get; } = new("MiraAPI.Resources.Wiki.VisibleAllIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset VisibleOffHoverSprite { get; } = new("MiraAPI.Resources.Wiki.VisibleOffHover.png"); public static LoadableResourceAsset VisibleOffHoverSprite { get; } = new("MiraAPI.Resources.Wiki.VisibleOffHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset VisibleOffIdleSprite { get; } = new("MiraAPI.Resources.Wiki.VisibleOffIdle.png"); public static LoadableResourceAsset VisibleOffIdleSprite { get; } = new("MiraAPI.Resources.Wiki.VisibleOffIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset VisibleOnHoverSprite { get; } = new("MiraAPI.Resources.Wiki.VisibleOnHover.png"); public static LoadableResourceAsset VisibleOnHoverSprite { get; } = new("MiraAPI.Resources.Wiki.VisibleOnHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the roles button while hovering. /// Gets the sprite used for the roles button while hovering.
/// </summary> /// </summary>
public static LoadableResourceAsset VisibleOnIdleSprite { get; } = new("MiraAPI.Resources.Wiki.VisibleOnIdle.png"); public static LoadableResourceAsset VisibleOnIdleSprite { get; } = new("MiraAPI.Resources.Wiki.VisibleOnIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for crewmates. /// Gets the sprite used for crewmates.
/// </summary> /// </summary>
public static LoadableResourceAsset IconCrewmate { get; } = new("MiraAPI.Resources.Wiki.IconCrewmate.png"); public static LoadableResourceAsset IconCrewmate { get; } = new("MiraAPI.Resources.Wiki.IconCrewmate.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for impostors. /// Gets the sprite used for impostors.
/// </summary> /// </summary>
public static LoadableResourceAsset IconImpostor { get; } = new("MiraAPI.Resources.Wiki.IconImpostor.png"); public static LoadableResourceAsset IconImpostor { get; } = new("MiraAPI.Resources.Wiki.IconImpostor.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for neutrals. /// Gets the sprite used for neutrals.
/// </summary> /// </summary>
public static LoadableResourceAsset IconNeutral { get; } = new("MiraAPI.Resources.Wiki.IconNeutral.png"); public static LoadableResourceAsset IconNeutral { get; } = new("MiraAPI.Resources.Wiki.IconNeutral.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for the player list. /// Gets the sprite used for the player list.
/// </summary> /// </summary>
public static LoadableResourceAsset IconPlayerList { get; } = new("MiraAPI.Resources.Wiki.IconPlayerList.png"); public static LoadableResourceAsset IconPlayerList { get; } = new("MiraAPI.Resources.Wiki.IconPlayerList.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for settings. /// Gets the sprite used for settings.
/// </summary> /// </summary>
public static LoadableResourceAsset IconSettings { get; } = new("MiraAPI.Resources.Wiki.IconSettings.png"); public static LoadableResourceAsset IconSettings { get; } = new("MiraAPI.Resources.Wiki.IconSettings.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used for terminology. /// Gets the sprite used for terminology.
/// </summary> /// </summary>
public static LoadableResourceAsset IconTerminology { get; } = new("MiraAPI.Resources.Wiki.IconTerminology.png"); public static LoadableResourceAsset IconTerminology { get; } = new("MiraAPI.Resources.Wiki.IconTerminology.png", _assembly);
/// <summary> /// <summary>
/// Gets the Page switching sprite. /// Gets the Page switching sprite.
/// </summary> /// </summary>
public static LoadableResourceAsset PageLeftHover { get; } = new("MiraAPI.Resources.Wiki.PageLeftHover.png"); public static LoadableResourceAsset PageLeftHover { get; } = new("MiraAPI.Resources.Wiki.PageLeftHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the Page switching sprite. /// Gets the Page switching sprite.
/// </summary> /// </summary>
public static LoadableResourceAsset PageLeftIdle { get; } = new("MiraAPI.Resources.Wiki.PageLeftIdle.png"); public static LoadableResourceAsset PageLeftIdle { get; } = new("MiraAPI.Resources.Wiki.PageLeftIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the Page switching sprite. /// Gets the Page switching sprite.
/// </summary> /// </summary>
public static LoadableResourceAsset PageRightHover { get; } = new("MiraAPI.Resources.Wiki.PageRightHover.png"); public static LoadableResourceAsset PageRightHover { get; } = new("MiraAPI.Resources.Wiki.PageRightHover.png", _assembly);
/// <summary> /// <summary>
/// Gets the Page switching sprite. /// Gets the Page switching sprite.
/// </summary> /// </summary>
public static LoadableResourceAsset PageRightIdle { get; } = new("MiraAPI.Resources.Wiki.PageRightIdle.png"); public static LoadableResourceAsset PageRightIdle { get; } = new("MiraAPI.Resources.Wiki.PageRightIdle.png", _assembly);
/// <summary> /// <summary>
/// Gets the sprite used below the tab icons in the wiki. /// Gets the sprite used below the tab icons in the wiki.
/// </summary> /// </summary>
public static LoadableResourceAsset TabButtonContainer { get; } = new("MiraAPI.Resources.Wiki.TabButtonContainer.png"); public static LoadableResourceAsset TabButtonContainer { get; } = new("MiraAPI.Resources.Wiki.TabButtonContainer.png", _assembly);
internal static LoadableResourceAsset BlankSprite { get; } = new("MiraAPI.Resources.BlankSprite.png"); internal static LoadableResourceAsset BlankSprite { get; } = new("MiraAPI.Resources.BlankSprite.png", _assembly);
} }
+15 -2
View File
@@ -492,16 +492,29 @@ public static class Extensions
} }
/// <summary> /// <summary>
/// Gets a proper string for an <see cref="Enum"/>. (with spaces). /// Gets a proper string for an <see cref="Enum"/> (with spaces).
/// </summary> /// </summary>
/// <param name="enum">The <see cref="Enum"/> you would like to change.</param> /// <param name="enum">The <see cref="Enum"/> you would like to change.</param>
/// <returns>A proper string for the <see cref="Enum"/>.</returns> /// <returns>A proper string for the provided <see cref="Enum"/>.</returns>
public static string ToDisplayString(this Enum @enum) public static string ToDisplayString(this Enum @enum)
{ {
var regex = new Regex(@"([^\^])([A-Z][a-z$])", default, Regex.InfiniteMatchTimeout); var regex = new Regex(@"([^\^])([A-Z][a-z$])", default, Regex.InfiniteMatchTimeout);
return regex.Replace(@enum.ToString(), m => $"{m.Groups[1].Value} {m.Groups[2].Value}"); return regex.Replace(@enum.ToString(), m => $"{m.Groups[1].Value} {m.Groups[2].Value}");
} }
/// <summary>
/// Gets a proper string for a(n) <typeparamref name="T"/> value (with spaces).
/// </summary>
/// <typeparam name="T">The type of the enum value.</typeparam>
/// <param name="enum">The <typeparamref name="T"/> enum value you would like to change.</param>
/// <returns>A proper string for the provided <typeparamref name="T"/> value.</returns>
public static string ToDisplayString<T>(this T @enum)
where T : struct, Enum
{
var regex = new Regex(@"([^\^])([A-Z][a-z$])", default, Regex.InfiniteMatchTimeout);
return regex.Replace(@enum.ToString(), m => $"{m.Groups[1].Value} {m.Groups[2].Value}");
}
/// <summary> /// <summary>
/// Gets the constructors of a type that match the specified arguments. /// Gets the constructors of a type that match the specified arguments.
/// </summary> /// </summary>