De-duplicate some code

This commit is contained in:
Atony committed 2026-10-04 23:18:39 -05:00
1 parent aec2cfcad3
commit 206b00c11f
3 files changed
+194 -120

No files matched your search

+186 -120
View File
@@ -8,6 +8,7 @@ using Innersloth.Assets;
using MiraAPI.Modifiers; using MiraAPI.Modifiers;
using MiraAPI.Modifiers.Types; using MiraAPI.Modifiers.Types;
using MiraAPI.Roles; using MiraAPI.Roles;
using MiraAPI.Translation;
using MiraAPI.Utilities; using MiraAPI.Utilities;
using MiraAPI.Utilities.Assets; using MiraAPI.Utilities.Assets;
using Reactor.Utilities.Extensions; using Reactor.Utilities.Extensions;
@@ -134,44 +135,43 @@ public static class RoleGuidePatches
HudManager.Instance.SettingsButton, HudManager.Instance.SettingsButton,
__instance.TabButtons[2].transform.parent); __instance.TabButtons[2].transform.parent);
SearchSortingOrderButton = sortingOrderButton.GetComponent<PassiveButton>(); SearchSortingOrderButton = sortingOrderButton.GetComponent<PassiveButton>();
SearchSortingOrderButton.name = "SearchSortingOrderButton"; FixSearchButton(
_searchSortingOrderIdle = SearchSortingOrderButton.inactiveSprites.GetComponent<SpriteRenderer>(); SearchSortingOrderButton,
_searchSortingOrderIdle.sprite = MiraAssets.SortingAzIdleSprite; "SearchSortingOrderButton",
_searchSortingOrderHover = SearchSortingOrderButton.activeSprites.GetComponent<SpriteRenderer>(); SwitchMethod,
_searchSortingOrderHover.sprite = MiraAssets.SortingAzHoverSprite; MiraAssets.SortingAzIdleSprite,
SearchSortingOrderButton.OnClick = new Button.ButtonClickedEvent(); MiraAssets.SortingAzHoverSprite,
SearchSortingOrderButton.OnClick.AddListener(new Action(SwitchMethod)); new Vector3(2.4f, 0.765f, -0.1f),
sortingOrderButton.transform.localPosition = new Vector3(2.4f, 0.765f, -0.1f); out _searchSortingOrderIdle,
sortingOrderButton.transform.localScale = Vector3.one; out _searchSortingOrderHover);
sortingOrderButton.transform.GetChild(2).gameObject.SetActive(false);
var sortingGroupButton = Object.Instantiate( var sortingGroupButton = Object.Instantiate(
sortingOrderButton, sortingOrderButton,
sortingOrderButton.transform.parent); sortingOrderButton.transform.parent);
SearchSortingGroupButton = sortingGroupButton.GetComponent<PassiveButton>(); SearchSortingGroupButton = sortingGroupButton.GetComponent<PassiveButton>();
SearchSortingGroupButton.name = "SearchSortingGroupButton"; FixSearchButton(
_searchSortingGroupIdle = SearchSortingGroupButton.inactiveSprites.GetComponent<SpriteRenderer>(); SearchSortingGroupButton,
_searchSortingGroupIdle.sprite = MiraAssets.GroupNoneIdleSprite; "SearchSortingGroupButton",
_searchSortingGroupHover = SearchSortingGroupButton.activeSprites.GetComponent<SpriteRenderer>(); SwitchGrouping,
_searchSortingGroupHover.sprite = MiraAssets.GroupNoneHoverSprite; MiraAssets.GroupNoneIdleSprite,
SearchSortingGroupButton.OnClick = new Button.ButtonClickedEvent(); MiraAssets.GroupNoneHoverSprite,
SearchSortingGroupButton.OnClick.AddListener(new Action(SwitchGrouping)); new Vector3(1.8f, 0.765f, -0.1f),
sortingGroupButton.transform.localPosition = new Vector3(1.8f, 0.765f, -0.1f); out _searchSortingGroupIdle,
sortingGroupButton.transform.localScale = Vector3.one; out _searchSortingGroupHover);
var sortingFilterButton = Object.Instantiate( var sortingFilterButton = Object.Instantiate(
sortingOrderButton, sortingOrderButton,
sortingOrderButton.transform.parent); sortingOrderButton.transform.parent);
SearchSortingFilterButton = sortingFilterButton.GetComponent<PassiveButton>(); SearchSortingFilterButton = sortingFilterButton.GetComponent<PassiveButton>();
SearchSortingFilterButton.name = "SearchSortingFilterButton"; FixSearchButton(
_searchSortingFilterIdle = SearchSortingFilterButton.inactiveSprites.GetComponent<SpriteRenderer>(); SearchSortingFilterButton,
_searchSortingFilterIdle.sprite = MiraAssets.VisibleOnIdleSprite; "SearchSortingFilterButton",
_searchSortingFilterHover = SearchSortingFilterButton.activeSprites.GetComponent<SpriteRenderer>(); SwitchFilter,
_searchSortingFilterHover.sprite = MiraAssets.VisibleOnHoverSprite; MiraAssets.VisibleOnIdleSprite,
SearchSortingFilterButton.OnClick = new Button.ButtonClickedEvent(); MiraAssets.VisibleOnHoverSprite,
SearchSortingFilterButton.OnClick.AddListener(new Action(SwitchFilter)); new Vector3(1f, 0.765f, -0.1f),
sortingFilterButton.transform.localPosition = new Vector3(1f, 0.765f, -0.1f); out _searchSortingFilterIdle,
sortingFilterButton.transform.localScale = Vector3.one; out _searchSortingFilterHover);
__instance.numOfTabs = 4; __instance.numOfTabs = 4;
__instance.TabButtons[2].SelectButton(true); __instance.TabButtons[2].SelectButton(true);
@@ -228,15 +228,15 @@ public static class RoleGuidePatches
sortingOrderButton, sortingOrderButton,
sortingOrderButton.transform.parent); sortingOrderButton.transform.parent);
SearchIconButton = searchIconButton.GetComponent<PassiveButton>(); SearchIconButton = searchIconButton.GetComponent<PassiveButton>();
SearchIconButton.name = "SearchIconButton"; FixSearchButton(
_searchIconIdle = SearchIconButton.inactiveSprites.GetComponent<SpriteRenderer>(); SearchIconButton,
_searchIconIdle.sprite = MiraAssets.SearchIconIdleSprite; "SearchIconButton",
_searchIconHover = SearchIconButton.activeSprites.GetComponent<SpriteRenderer>(); ClearSearchText,
_searchIconHover.sprite = MiraAssets.SearchIconHoverSprite; MiraAssets.SearchIconIdleSprite,
SearchIconButton.OnClick = new Button.ButtonClickedEvent(); MiraAssets.SearchIconHoverSprite,
SearchIconButton.OnClick.AddListener(new Action(ClearSearchText)); new Vector3(-2.79f, 0.765f, -0.1f),
searchIconButton.transform.localPosition = new Vector3(-2.79f, 0.765f, -0.1f); out _searchIconIdle,
searchIconButton.transform.localScale = Vector3.one; out _searchIconHover);
var searchBox = Object.Instantiate( var searchBox = Object.Instantiate(
__instance.TabButtons[2].gameObject, __instance.TabButtons[2].gameObject,
@@ -301,83 +301,40 @@ public static class RoleGuidePatches
searchBoxTmp.transform.localPosition = new Vector3(-1.438f, 0.756f, -0.2f); searchBoxTmp.transform.localPosition = new Vector3(-1.438f, 0.756f, -0.2f);
var playerButton = __instance.TabButtons[0]; var playerButton = __instance.TabButtons[0];
var playerCollider = playerButton.GetComponent<BoxCollider2D>(); FixTabButton(
playerButton.transform.GetChild(0).gameObject.SetActive(false); playerButton,
var playerBtnInactive = playerButton.inactiveSprites.GetComponent<SpriteRenderer>(); MiraAssets.WikiPlayersButtonIdleSprite,
playerBtnInactive.sprite = MiraAssets.WikiPlayersButtonIdleSprite; MiraAssets.WikiPlayersButtonOpenSprite,
playerBtnInactive.size = Vector2.one; MiraAssets.WikiPlayersButtonHoverSprite);
playerBtnInactive.transform.GetChild(0).gameObject.SetActive(false);
var playerBtnSelected = playerButton.selectedSprites.GetComponent<SpriteRenderer>();
playerBtnSelected.sprite = MiraAssets.WikiPlayersButtonOpenSprite;
playerBtnSelected.size = Vector2.one;
playerBtnSelected.transform.GetChild(0).gameObject.SetActive(false);
var playerBtnHighlight = playerButton.activeSprites.GetComponent<SpriteRenderer>();
playerBtnHighlight.sprite = MiraAssets.WikiPlayersButtonHoverSprite;
playerBtnHighlight.size = Vector2.one;
playerBtnHighlight.transform.GetChild(0).gameObject.SetActive(false);
var settingButton = __instance.TabButtons[1]; var settingButton = __instance.TabButtons[1];
var settingsCollider = settingButton.GetComponent<BoxCollider2D>(); FixTabButton(
settingButton.transform.GetChild(0).gameObject.SetActive(false); settingButton,
var settingBtnInactive = settingButton.inactiveSprites.GetComponent<SpriteRenderer>(); MiraAssets.WikiSettingsButtonIdleSprite,
settingBtnInactive.sprite = MiraAssets.WikiSettingsButtonIdleSprite; MiraAssets.WikiSettingsButtonOpenSprite,
settingBtnInactive.size = Vector2.one; MiraAssets.WikiSettingsButtonHoverSprite);
settingBtnInactive.transform.GetChild(0).gameObject.SetActive(false);
var settingBtnSelected = settingButton.selectedSprites.GetComponent<SpriteRenderer>();
settingBtnSelected.sprite = MiraAssets.WikiSettingsButtonOpenSprite;
settingBtnSelected.size = Vector2.one;
settingBtnSelected.transform.GetChild(0).gameObject.SetActive(false);
var settingBtnHighlight = settingButton.activeSprites.GetComponent<SpriteRenderer>();
settingBtnHighlight.sprite = MiraAssets.WikiSettingsButtonHoverSprite;
settingBtnHighlight.size = Vector2.one;
settingBtnHighlight.transform.GetChild(0).gameObject.SetActive(false);
var rolesButton = __instance.TabButtons[2]; var rolesButton = __instance.TabButtons[2];
FixTabButton(
rolesButton,
MiraAssets.WikiRolesButtonIdleSprite,
MiraAssets.WikiRolesButtonOpenSprite,
MiraAssets.WikiRolesButtonHoverSprite);
rolesButton.OnClick = new Button.ButtonClickedEvent(); rolesButton.OnClick = new Button.ButtonClickedEvent();
rolesButton.OnClick.AddListener((Action)(() => OpenRolesTab())); rolesButton.OnClick.AddListener((Action)(() => OpenRolesTab()));
var rolesCollider = rolesButton.GetComponent<BoxCollider2D>();
rolesButton.transform.GetChild(0).gameObject.SetActive(false);
var rolesBtnInactive = rolesButton.inactiveSprites.GetComponent<SpriteRenderer>();
rolesBtnInactive.sprite = MiraAssets.WikiRolesButtonIdleSprite;
rolesBtnInactive.size = Vector2.one;
rolesBtnInactive.transform.GetChild(0).gameObject.SetActive(false);
var rolesBtnSelected = rolesButton.selectedSprites.GetComponent<SpriteRenderer>();
rolesBtnSelected.sprite = MiraAssets.WikiRolesButtonOpenSprite;
rolesBtnSelected.size = Vector2.one;
rolesBtnSelected.transform.GetChild(0).gameObject.SetActive(false);
var rolesBtnHighlight = rolesButton.activeSprites.GetComponent<SpriteRenderer>();
rolesBtnHighlight.sprite = MiraAssets.WikiRolesButtonHoverSprite;
rolesBtnHighlight.size = Vector2.one;
rolesBtnHighlight.transform.GetChild(0).gameObject.SetActive(false);
var modifiersButton = Object.Instantiate( var modifiersButton = Object.Instantiate(
__instance.TabButtons[2], __instance.TabButtons[2],
__instance.TabButtons[2].transform.parent); __instance.TabButtons[2].transform.parent);
FixTabButton(
modifiersButton,
MiraAssets.WikiRolesButtonIdleSprite,
MiraAssets.WikiRolesButtonOpenSprite,
MiraAssets.WikiRolesButtonHoverSprite);
modifiersButton.OnClick = new Button.ButtonClickedEvent(); modifiersButton.OnClick = new Button.ButtonClickedEvent();
modifiersButton.OnClick.AddListener((Action)(() => OpenModifiersTab())); modifiersButton.OnClick.AddListener((Action)(() => OpenModifiersTab()));
var modifiersCollider = modifiersButton.GetComponent<BoxCollider2D>();
modifiersButton.transform.GetChild(0).gameObject.SetActive(false);
var modifiersBtnInactive = modifiersButton.inactiveSprites.GetComponent<SpriteRenderer>();
modifiersBtnInactive.sprite = MiraAssets.WikiRolesButtonIdleSprite;
modifiersBtnInactive.size = Vector2.one;
modifiersBtnInactive.transform.GetChild(0).gameObject.SetActive(false);
var modifiersBtnSelected = modifiersButton.selectedSprites.GetComponent<SpriteRenderer>();
modifiersBtnSelected.sprite = MiraAssets.WikiRolesButtonOpenSprite;
modifiersBtnSelected.size = Vector2.one;
modifiersBtnSelected.transform.GetChild(0).gameObject.SetActive(false);
var modifiersBtnHighlight = modifiersButton.activeSprites.GetComponent<SpriteRenderer>();
modifiersBtnHighlight.sprite = MiraAssets.WikiRolesButtonHoverSprite;
modifiersBtnHighlight.size = Vector2.one;
modifiersBtnHighlight.transform.GetChild(0).gameObject.SetActive(false);
__instance.TabButtons.Add(modifiersButton); __instance.TabButtons.Add(modifiersButton);
playerCollider.size = settingsCollider.size =
rolesCollider.size = modifiersCollider.size = new Vector2(0.8f, 0.74f);
playerCollider.offset = settingsCollider.offset =
rolesCollider.offset = modifiersCollider.offset = Vector2.zero;
playerButton.transform.localScale = settingButton.transform.localScale =
rolesButton.transform.localScale =
modifiersButton.transform.localScale = new Vector3(0.7f, 0.7f, 1);
playerButton.transform.localPosition = new Vector3(-3.6f, 0.656f, -0.2f); playerButton.transform.localPosition = new Vector3(-3.6f, 0.656f, -0.2f);
settingButton.transform.localPosition = new Vector3(-3.6f, 0.056f, -0.2f); settingButton.transform.localPosition = new Vector3(-3.6f, 0.056f, -0.2f);
rolesButton.transform.localPosition = new Vector3(-3.6f, -0.544f, -0.2f); rolesButton.transform.localPosition = new Vector3(-3.6f, -0.544f, -0.2f);
@@ -409,6 +366,40 @@ public static class RoleGuidePatches
return false; return false;
} }
public static void FixTabButton(MatchInfoGuideTabButton button, Sprite inactive, Sprite selected, Sprite hover)
{
var buttonCollider = button.GetComponent<BoxCollider2D>();
button.transform.GetChild(0).gameObject.SetActive(false);
var settingBtnInactive = button.inactiveSprites.GetComponent<SpriteRenderer>();
settingBtnInactive.sprite = inactive;
settingBtnInactive.transform.GetChild(0).gameObject.SetActive(false);
var settingBtnSelected = button.selectedSprites.GetComponent<SpriteRenderer>();
settingBtnSelected.sprite = selected;
settingBtnSelected.transform.GetChild(0).gameObject.SetActive(false);
var settingBtnHighlight = button.activeSprites.GetComponent<SpriteRenderer>();
settingBtnHighlight.sprite = hover;
settingBtnInactive.size = settingBtnSelected.size = settingBtnHighlight.size = Vector2.one;
settingBtnHighlight.transform.GetChild(0).gameObject.SetActive(false);
buttonCollider.size = new Vector2(0.8f, 0.74f);
buttonCollider.offset = Vector2.zero;
button.transform.localScale = new Vector3(0.7f, 0.7f, 1);
}
public static void FixSearchButton(PassiveButton button, string objName, Action onClick, Sprite inactive, Sprite hover, Vector3 pos, out SpriteRenderer inactiveSprite, out SpriteRenderer hoverSprite)
{
button.name = objName;
inactiveSprite = button.inactiveSprites.GetComponent<SpriteRenderer>();
inactiveSprite.sprite = inactive;
hoverSprite = button.activeSprites.GetComponent<SpriteRenderer>();
hoverSprite.sprite = hover;
button.OnClick = new Button.ButtonClickedEvent();
button.OnClick.AddListener(onClick);
button.transform.localPosition = pos;
button.transform.localScale = Vector3.one;
button.transform.GetChild(2).gameObject.SetActive(false);
}
public static void OpenModifiersTab() public static void OpenModifiersTab()
{ {
_advancedInfoTabScroller?.gameObject.SetActive(false); _advancedInfoTabScroller?.gameObject.SetActive(false);
@@ -716,7 +707,7 @@ public static class RoleGuidePatches
modifier.ParentMod.MiraPlugin.GetAbbreviatedModName())); modifier.ParentMod.MiraPlugin.GetAbbreviatedModName()));
} }
foreach (var roleBehaviour in RoleManager.Instance.AllRoles.ToArray().OrderBy(x => x.GetRoleName())) foreach (var roleBehaviour in CustomRoleManager.AllStoredRoleBehaviours)
{ {
if (roleBehaviour.Role is not RoleTypes.Crewmate and not RoleTypes.Impostor and if (roleBehaviour.Role is not RoleTypes.Crewmate and not RoleTypes.Impostor and
not RoleTypes.CrewmateGhost and not RoleTypes.CrewmateGhost and
@@ -725,11 +716,25 @@ public static class RoleGuidePatches
var panel = Object.Instantiate( var panel = Object.Instantiate(
instance.MatchInfoRolePanelPrefab, instance.MatchInfoRolePanelPrefab,
inner); inner);
var amount = string abbreviation;
GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetNumPerGame(roleBehaviour.Role); int amount;
var chance = int chance;
GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetChancePerGame(roleBehaviour.Role); if (roleBehaviour is ICustomRole custom)
panel.SetPanel( {
amount = custom.GetCount().GetValueOrDefault(0);
chance = custom.GetChance().GetValueOrDefault(0);
abbreviation = custom.ParentMod.MiraPlugin.GetAbbreviatedModName();
}
else
{
abbreviation = "AU";
amount =
GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetNumPerGame(roleBehaviour.Role);
chance =
GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetChancePerGame(roleBehaviour.Role);
}
panel.SetRolePanel(
roleBehaviour, roleBehaviour,
amount, amount,
chance); chance);
@@ -752,9 +757,7 @@ public static class RoleGuidePatches
panel, panel,
roleBehaviour.GetRoleName(), roleBehaviour.GetRoleName(),
roleBehaviour.GetCategoryTitle(), roleBehaviour.GetCategoryTitle(),
roleBehaviour is ICustomRole custom abbreviation));
? custom.ParentMod.MiraPlugin.GetAbbreviatedModName()
: "AU"));
} }
} }
} }
@@ -840,16 +843,27 @@ public static class RoleGuidePatches
foreach (var (roleData, holder) in RolePanels) foreach (var (roleData, holder) in RolePanels)
{ {
var panel = holder.Panel; var panel = holder.Panel;
var amount = GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetNumPerGame(roleData.Role); int amount;
var chance = GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetChancePerGame(roleData.Role); int chance;
var showVal = roleData is ICustomRole custom ? custom.ForceShowRoleOnWiki : null; int forciblyShow = 0;
var forciblyShow = showVal switch if (roleData is ICustomRole custom)
{ {
true => 2, amount = custom.GetCount().GetValueOrDefault(0);
false => 1, chance = custom.GetChance().GetValueOrDefault(0);
_ => 0, if (custom.ForceShowRoleOnWiki.HasValue)
}; {
panel.SetPanel( forciblyShow = custom.ForceShowRoleOnWiki.Value ? 2 : 1;
}
}
else
{
amount =
GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetNumPerGame(roleData.Role);
chance =
GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetChancePerGame(roleData.Role);
}
panel.SetRolePanel(
roleData, roleData,
amount, amount,
chance); chance);
@@ -1026,11 +1040,28 @@ public static class RoleGuidePatches
[HarmonyPostfix] [HarmonyPostfix]
[HarmonyPriority(Priority.First)] [HarmonyPriority(Priority.First)]
[HarmonyPatch(typeof(MatchInfoGuide), nameof(MatchInfoGuide.SetActiveTab))] [HarmonyPatch(typeof(MatchInfoGuide), nameof(MatchInfoGuide.SetActiveTab))]
private static void SetActiveTab() private static void SetActiveTab(int tabIndex)
{ {
if (titleText) if (titleText)
{ {
titleText.text = TranslationController.Instance.GetString(StringNames.MatchInfoGuideTitle); switch (tabIndex)
{
case 0:
titleText.text = MiraLocaleManager.Get("MiraApi.Wiki.PlayersTab");
break;
case 1:
titleText.text = MiraLocaleManager.Get("MiraApi.Wiki.SettingsTab");
break;
case 2:
titleText.text = MiraLocaleManager.Get("Roles");
break;
case 3:
titleText.text = MiraLocaleManager.Get("Modifiers");
break;
default:
titleText.text = TranslationController.Instance.GetString(StringNames.MatchInfoGuideTitle);
break;
}
} }
_advancedInfoTabScroller?.gameObject.SetActive(false); _advancedInfoTabScroller?.gameObject.SetActive(false);
@@ -1143,6 +1174,41 @@ public static class RoleGuidePatches
return false; return false;
} }
public static void SetRolePanel(
this MatchInfoRolePanel instance,
RoleBehaviour role,
int numPerGame,
int chancePerGame)
{
instance.roleCount.text = string.Format(
CultureInfo.InvariantCulture,
"{0} at {1}%",
numPerGame.ToString(CultureInfo.InvariantCulture),
chancePerGame);
if (role is ICustomRole customRole)
{
instance.roleName.text = customRole.RoleName;
instance.roleDescription.text =
$"<size=60%>{role.GetCategoryTitle()}</size>\n" + customRole.RoleMedDescription;
instance.roleIcon.sprite = customRole.Configuration.Icon?.LoadAsset();
instance.roleCount.text += $" ({customRole.ParentMod.MiraPlugin.GetAbbreviatedModName()})";
}
else
{
instance.roleName.text = role.NiceName;
instance.roleDescription.text = $"<size=60%>{role.GetCategoryTitle()}</size>\n" + role.BlurbMed;
instance.roleIcon.sprite = role.RoleIconColor;
instance.roleCount.text += " (AU)";
}
instance.roleIcon.SetSizeLimit(0.13f);
instance.roleIcon.material.SetInt(PlayerMaterial.MaskLayer, 50);
instance.roleName.fontMaterial.SetFloat(instance.STENCIL_NAME, 50f);
instance.roleDescription.fontMaterial.SetFloat(instance.STENCIL_NAME, 50f);
instance.roleCount.fontMaterial.SetFloat(instance.STENCIL_NAME, 50f);
instance.roleIcon.transform.localScale = new Vector3(4f, 4f, 1f);
}
public static void SetModifierPanel( public static void SetModifierPanel(
this MatchInfoRolePanel instance, this MatchInfoRolePanel instance,
GameModifier modifier, GameModifier modifier,
+2
View File
@@ -53,4 +53,6 @@ Outlive the timer or eliminate the crew.</string>
<string name="MiraApi.AbilityType.SelectiveMeeting">Selective Meeting Ability</string> <string name="MiraApi.AbilityType.SelectiveMeeting">Selective Meeting Ability</string>
<string name="MiraApi.AbilityType.MeetingMenu">Meeting Menu Ability</string> <string name="MiraApi.AbilityType.MeetingMenu">Meeting Menu Ability</string>
<string name="Options">Options</string> <string name="Options">Options</string>
<string name="MiraApi.Wiki.PlayersTab">Player List</string>
<string name="MiraApi.Wiki.SettingsTab">Game Settings</string>
</resources> </resources>
+6
View File
@@ -45,6 +45,11 @@ public static class CustomRoleManager
/// </summary> /// </summary>
public static IReadOnlyList<RoleBehaviour> CustomRoleBehaviours { get; private set; } = []; public static IReadOnlyList<RoleBehaviour> CustomRoleBehaviours { get; private set; } = [];
/// <summary>
/// Gets the <see cref="IReadOnlyList{T}"/> of all roles as <see cref="RoleBehaviour"/> objects.
/// </summary>
public static IReadOnlyList<RoleBehaviour> AllStoredRoleBehaviours { get; private set; } = [];
/// <summary> /// <summary>
/// Gets the <see cref="IReadOnlyList{T}"/> of custom roles as <see cref="ICustomRole"/> objects. /// Gets the <see cref="IReadOnlyList{T}"/> of custom roles as <see cref="ICustomRole"/> objects.
/// </summary> /// </summary>
@@ -77,6 +82,7 @@ public static class CustomRoleManager
CustomRoleBehaviours = [.. CustomRoles.Values]; CustomRoleBehaviours = [.. CustomRoles.Values];
CustomMiraRoles = [.. CustomRoles.Values.OfType<ICustomRole>()]; CustomMiraRoles = [.. CustomRoles.Values.OfType<ICustomRole>()];
AllStoredRoleBehaviours = [.. RoleManager.Instance.AllRoles];
} }
internal static void RegisterRoleTypes(List<Type> roles, MiraPluginInfo pluginInfo) internal static void RegisterRoleTypes(List<Type> roles, MiraPluginInfo pluginInfo)