Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: gompocp/ActionMenuApi
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v0.2.3
Choose a base ref
...
head repository: gompocp/ActionMenuApi
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: main
Choose a head ref
  • 14 commits
  • 41 files changed
  • 1 contributor

Commits on May 27, 2021

  1. Copy the full SHA
    9782325 View commit details

Commits on Jun 4, 2021

  1. Oops forgot to commit this

    gompocp committed Jun 4, 2021
    Copy the full SHA
    a039eda View commit details

Commits on Jun 11, 2021

  1. Restricted Radial Puppet

    gompocp committed Jun 11, 2021
    Copy the full SHA
    eef7610 View commit details
  2. Cleanup

    gompocp committed Jun 11, 2021
    Copy the full SHA
    976b205 View commit details
  3. Additional Cleanup

    gompocp committed Jun 11, 2021
    Copy the full SHA
    b4338cc View commit details

Commits on Jun 16, 2021

  1. Big Cleanup

    gompocp committed Jun 16, 2021
    Copy the full SHA
    b831edb View commit details

Commits on Jul 20, 2021

  1. Copy the full SHA
    57b64e9 View commit details

Commits on Jul 21, 2021

  1. Copy the full SHA
    83616c7 View commit details
  2. Cleanup, Bump version

    gompocp committed Jul 21, 2021
    Copy the full SHA
    433ae9f View commit details

Commits on Jul 26, 2021

  1. Cleanup

    gompocp committed Jul 26, 2021
    Copy the full SHA
    76989a8 View commit details

Commits on Aug 5, 2021

  1. Copy the full SHA
    9feab68 View commit details
  2. Bump version

    gompocp committed Aug 5, 2021
    Copy the full SHA
    8727a22 View commit details

Commits on Aug 6, 2021

  1. Copy the full SHA
    0e1c13b View commit details

Commits on Sep 4, 2021

  1. oops, Updated examples

    gompocp committed Sep 4, 2021
    Copy the full SHA
    81d0a72 View commit details
Showing with 2,142 additions and 1,245 deletions.
  1. +2 −1 .gitignore
  2. +21 −9 ActionMenuApi.sln
  3. +62 −41 ActionMenuApi/AMAPI.cs
  4. +11 −10 ActionMenuApi/ActionMenuApi.cs
  5. +4 −3 ActionMenuApi/ActionMenuApi.csproj
  6. +18 −12 ActionMenuApi/Api/AMUtils.cs
  7. +25 −25 ActionMenuApi/Api/ActionMenuPage.cs
  8. +142 −80 ActionMenuApi/Api/CustomSubMenu.cs
  9. +82 −26 ActionMenuApi/Api/VRCActionMenuPage.cs
  10. +16 −18 ActionMenuApi/{Stuff → Helpers}/Constants.cs
  11. +726 −0 ActionMenuApi/Helpers/ExtensionMethods.cs
  12. +278 −278 ActionMenuApi/{Stuff → Helpers}/Utilities.cs
  13. +6 −7 ActionMenuApi/Logger.cs
  14. +39 −18 ActionMenuApi/Managers/FourAxisPuppetManager.cs
  15. +14 −13 ActionMenuApi/Managers/ModsFolderManager.cs
  16. +81 −28 ActionMenuApi/Managers/RadialPuppetManager.cs
  17. +43 −25 ActionMenuApi/Managers/ResourcesManager.cs
  18. +8 −6 ActionMenuApi/Patches.cs
  19. +4 −3 ActionMenuApi/Pedals/PedalButton.cs
  20. +7 −6 ActionMenuApi/Pedals/PedalFourAxis.cs
  21. +13 −7 ActionMenuApi/Pedals/PedalRadial.cs
  22. +3 −2 ActionMenuApi/Pedals/PedalStruct.cs
  23. +8 −7 ActionMenuApi/Pedals/PedalSubMenu.cs
  24. +12 −8 ActionMenuApi/Pedals/PedalToggle.cs
  25. +0 −481 ActionMenuApi/Stuff/ExtensionMethods.cs
  26. +0 −84 ActionMenuApi/Stuff/LoaderCheck.cs
  27. +24 −25 ActionMenuApi/Types/ActionMenuPageType.cs
  28. +4 −4 ActionMenuApi/Types/Insertion.cs
  29. +3 −3 ActionMenuApi/Types/PedalType.cs
  30. +5 −3 ActionMenuTestMod/ActionMenuTestMod.cs
  31. +1 −0 ActionMenuTestMod/ActionMenuTestMod.csproj
  32. BIN {ActionMenuApi/Stuff → Common}/_dummy2_.dll
  33. BIN {ActionMenuApi/Stuff → Common}/_dummy_.dll
  34. +22 −6 Directory.Build.props
  35. +194 −0 IntegrityCheckGenerator/IntegrityCheckGenerator.cs
  36. +15 −0 IntegrityCheckGenerator/IntegrityCheckGenerator.csproj
  37. +61 −0 IntegrityCheckWeaver/DummyThree.cs
  38. +14 −0 IntegrityCheckWeaver/IntegrityCheckWeaver.csproj
  39. +105 −0 IntegrityCheckWeaver/Program.cs
  40. +63 −0 IntegrityCheckWeaver/Utils.cs
  41. +6 −6 README.md
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@

Libs/*.dll
Output
.idea
ActionMenuApi/obj/*
ActionMenuTestMod/obj/*
IntegrityCheckGenerator/obj/*
IntegrityCheckWeaver/obj/*
*.user

30 changes: 21 additions & 9 deletions ActionMenuApi.sln
Original file line number Diff line number Diff line change
@@ -14,19 +14,31 @@ Project("{DA3EF296-0E10-44D0-8EB4-A44CC02AAB15}") = "ActionMenuApi", "ActionMenu
EndProject
Project("{DA3EF296-0E10-44D0-8EB4-A44CC02AAB15}") = "ActionMenuTestMod", "ActionMenuTestMod\ActionMenuTestMod.csproj", "{7D1FA011-E981-48A0-9267-1C104B848AB8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IntegrityCheckWeaver", "IntegrityCheckWeaver\IntegrityCheckWeaver.csproj", "{2C9765DA-E4B8-4F57-BCF2-26497942E36F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IntegrityCheckGenerator", "IntegrityCheckGenerator\IntegrityCheckGenerator.csproj", "{DEBD456E-4EC7-41C7-8A7E-D5CE3DD47763}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4F1AFCA6-F4AC-49B9-9FEE-3C83C4664835}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4F1AFCA6-F4AC-49B9-9FEE-3C83C4664835}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4F1AFCA6-F4AC-49B9-9FEE-3C83C4664835}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4F1AFCA6-F4AC-49B9-9FEE-3C83C4664835}.Release|Any CPU.Build.0 = Release|Any CPU
{7D1FA011-E981-48A0-9267-1C104B848AB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7D1FA011-E981-48A0-9267-1C104B848AB8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7D1FA011-E981-48A0-9267-1C104B848AB8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7D1FA011-E981-48A0-9267-1C104B848AB8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
{4F1AFCA6-F4AC-49B9-9FEE-3C83C4664835}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4F1AFCA6-F4AC-49B9-9FEE-3C83C4664835}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4F1AFCA6-F4AC-49B9-9FEE-3C83C4664835}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4F1AFCA6-F4AC-49B9-9FEE-3C83C4664835}.Release|Any CPU.Build.0 = Release|Any CPU
{7D1FA011-E981-48A0-9267-1C104B848AB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7D1FA011-E981-48A0-9267-1C104B848AB8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7D1FA011-E981-48A0-9267-1C104B848AB8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7D1FA011-E981-48A0-9267-1C104B848AB8}.Release|Any CPU.Build.0 = Release|Any CPU
{2C9765DA-E4B8-4F57-BCF2-26497942E36F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2C9765DA-E4B8-4F57-BCF2-26497942E36F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2C9765DA-E4B8-4F57-BCF2-26497942E36F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2C9765DA-E4B8-4F57-BCF2-26497942E36F}.Release|Any CPU.Build.0 = Release|Any CPU
{DEBD456E-4EC7-41C7-8A7E-D5CE3DD47763}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DEBD456E-4EC7-41C7-8A7E-D5CE3DD47763}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DEBD456E-4EC7-41C7-8A7E-D5CE3DD47763}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DEBD456E-4EC7-41C7-8A7E-D5CE3DD47763}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
103 changes: 62 additions & 41 deletions ActionMenuApi/AMAPI.cs
Original file line number Diff line number Diff line change
@@ -1,84 +1,105 @@
using System;
using ActionMenuApi.Api;
using ActionMenuApi.Managers;
using ActionMenuApi.Pedals;
using ActionMenuApi.Types;
using MelonLoader;
using UnhollowerRuntimeLib;
using UnityEngine;
using UnityEngine.UI;
using PedalOptionTriggerEvent = PedalOption.MulticastDelegateNPublicSealedBoUnique; //Will this change?, ¯\_(ツ)_/¯
// ReSharper disable HeuristicUnreachableCode
#pragma warning disable 1591

namespace ActionMenuApi
{
[Obsolete("This class is only here for compatibility reasons! Please use ActionMenuApi.Api.CustomSubMenu/VRCActionMenuPage/AMUtils for new updated methods to integrate with the action menu", false)]
[Obsolete(
"This class is only here for compatibility reasons! Please use ActionMenuApi.Api.CustomSubMenu/VRCActionMenuPage/AMUtils for new updated methods to integrate with the action menu",
false)]
public static class AMAPI
{

[Obsolete("This method is only here for compatibility reasons! Please use VRCActionMenuPage.AddButton()", false)]
public static void AddButtonPedalToMenu(ActionMenuPageType pageType, string text, Action triggerEvent, Texture2D icon = null, Insertion insertion = Insertion.Post)
[Obsolete("This method is only here for compatibility reasons! Please use VRCActionMenuPage.AddButton()",
false)]
public static void AddButtonPedalToMenu(ActionMenuPageType pageType, string text, Action triggerEvent,
Texture2D icon = null, Insertion insertion = Insertion.Post)
{
VRCActionMenuPage.AddPedalToList((ActionMenuPage)pageType, new PedalButton(text, icon, triggerEvent), insertion);
VRCActionMenuPage.AddPedalToList((ActionMenuPage) pageType, new PedalButton(text, icon, triggerEvent),
insertion);
}

[Obsolete("This method is only here for compatibility reasons! Please use CustomSubMenu.AddButton()", false)]
public static PedalOption AddButtonPedalToSubMenu(string text, Action triggerEvent, Texture2D icon = null)
{
return CustomSubMenu.AddButton(text, triggerEvent, icon, false);
return CustomSubMenu.AddButton(text, triggerEvent, icon);
}

[Obsolete("This method is only here for compatibility reasons! Please use VRCActionMenuPage.AddRadialPuppet()", false)]
public static void AddRadialPedalToMenu(ActionMenuPageType pageType, string text, Action<float> onUpdate, float startingValue = 0, Texture2D icon = null, Insertion insertion = Insertion.Post)

[Obsolete("This method is only here for compatibility reasons! Please use VRCActionMenuPage.AddRadialPuppet()",
false)]
public static void AddRadialPedalToMenu(ActionMenuPageType pageType, string text, Action<float> onUpdate,
float startingValue = 0, Texture2D icon = null, Insertion insertion = Insertion.Post)
{
VRCActionMenuPage.AddPedalToList((ActionMenuPage)pageType, new PedalRadial(text, startingValue, icon, onUpdate), insertion);
VRCActionMenuPage.AddPedalToList((ActionMenuPage) pageType,
new PedalRadial(text, startingValue, icon, onUpdate), insertion);
}

[Obsolete("This method is only here for compatibility reasons! Please use CustomSubMenu.AddRadialPuppet()", false)]
public static PedalOption AddRadialPedalToSubMenu(string text, Action<float> onUpdate, float startingValue = 0, Texture2D icon = null)
[Obsolete("This method is only here for compatibility reasons! Please use CustomSubMenu.AddRadialPuppet()",
false)]
public static PedalOption AddRadialPedalToSubMenu(string text, Action<float> onUpdate, float startingValue = 0,
Texture2D icon = null)
{
return CustomSubMenu.AddRadialPuppet(text, onUpdate, startingValue, icon, false);
return CustomSubMenu.AddRadialPuppet(text, onUpdate, startingValue, icon);
}

[Obsolete("This method is only here for compatibility reasons! Please use VRCActionMenuPage.AddFourAxisPuppet()", false)]
public static void AddFourAxisPedalToMenu(ActionMenuPageType pageType, string text, Action<Vector2> onUpdate,Texture2D icon = null, Insertion insertion = Insertion.Post, string topButtonText = "Up",

[Obsolete(
"This method is only here for compatibility reasons! Please use VRCActionMenuPage.AddFourAxisPuppet()",
false)]
public static void AddFourAxisPedalToMenu(ActionMenuPageType pageType, string text, Action<Vector2> onUpdate,
Texture2D icon = null, Insertion insertion = Insertion.Post, string topButtonText = "Up",
string rightButtonText = "Right", string downButtonText = "Down", string leftButtonText = "Left")
{
VRCActionMenuPage.AddPedalToList((ActionMenuPage)pageType, new PedalFourAxis(text, icon, onUpdate, topButtonText, rightButtonText, downButtonText, leftButtonText), insertion);
VRCActionMenuPage.AddPedalToList((ActionMenuPage) pageType,
new PedalFourAxis(text, icon, onUpdate, topButtonText, rightButtonText, downButtonText, leftButtonText),
insertion);
}

[Obsolete("This method is only here for compatibility reasons! Please use CustomSubMenu.AddFourAxisPuppet()", false)]
public static PedalOption AddFourAxisPedalToSubMenu(string text, Action<Vector2> onUpdate,Texture2D icon = null, string topButtonText = "Up",

[Obsolete("This method is only here for compatibility reasons! Please use CustomSubMenu.AddFourAxisPuppet()",
false)]
public static PedalOption AddFourAxisPedalToSubMenu(string text, Action<Vector2> onUpdate,
Texture2D icon = null, string topButtonText = "Up",
string rightButtonText = "Right", string downButtonText = "Down", string leftButtonText = "Left")
{
return CustomSubMenu.AddFourAxisPuppet(text, onUpdate, icon, false, topButtonText, rightButtonText, downButtonText, leftButtonText);
return CustomSubMenu.AddFourAxisPuppet(text, onUpdate, icon, false, topButtonText, rightButtonText,
downButtonText, leftButtonText);
}

[Obsolete("This method is only here for compatibility reasons! Please use VRCActionMenuPage.AddSubMenu()", false)]
public static void AddSubMenuToMenu(ActionMenuPageType pageType, string text, Action openFunc, Texture2D icon = null, Action closeFunc = null, Insertion insertion = Insertion.Post)

[Obsolete("This method is only here for compatibility reasons! Please use VRCActionMenuPage.AddSubMenu()",
false)]
public static void AddSubMenuToMenu(ActionMenuPageType pageType, string text, Action openFunc,
Texture2D icon = null, Action closeFunc = null, Insertion insertion = Insertion.Post)
{
VRCActionMenuPage.AddPedalToList((ActionMenuPage)pageType, new PedalSubMenu(openFunc, text, icon, closeFunc), insertion);
VRCActionMenuPage.AddPedalToList((ActionMenuPage) pageType,
new PedalSubMenu(openFunc, text, icon, closeFunc), insertion);
}

[Obsolete("This method is only here for compatibility reasons! Please use CustomSubMenu.AddSubMenu()", false)]
public static PedalOption AddSubMenuToSubMenu(string text, Action openFunc, Texture2D icon = null, Action closeFunc = null)
public static PedalOption AddSubMenuToSubMenu(string text, Action openFunc, Texture2D icon = null,
Action closeFunc = null)
{
return CustomSubMenu.AddSubMenu(text, openFunc, icon, false, closeFunc);
return CustomSubMenu.AddSubMenu(text, openFunc, icon, false, closeFunc);
}

[Obsolete("This method is only here for compatibility reasons! Please use VRCActionMenuPage.AddToggle()", false)]
public static void AddTogglePedalToMenu(ActionMenuPageType pageType, string text, bool startingState, Action<bool> onToggle, Texture2D icon = null, Insertion insertion = Insertion.Post)

[Obsolete("This method is only here for compatibility reasons! Please use VRCActionMenuPage.AddToggle()",
false)]
public static void AddTogglePedalToMenu(ActionMenuPageType pageType, string text, bool startingState,
Action<bool> onToggle, Texture2D icon = null, Insertion insertion = Insertion.Post)
{
VRCActionMenuPage.AddPedalToList((ActionMenuPage)pageType, new PedalToggle(text, onToggle, startingState, icon), insertion);
VRCActionMenuPage.AddPedalToList((ActionMenuPage) pageType,
new PedalToggle(text, onToggle, startingState, icon), insertion);
}

[Obsolete("This method is only here for compatibility reasons! Please use CustomSubMenu.AddToggle()", false)]
public static PedalOption AddTogglePedalToSubMenu(string text, bool startingState, Action<bool> onToggle, Texture2D icon = null)
public static PedalOption AddTogglePedalToSubMenu(string text, bool startingState, Action<bool> onToggle,
Texture2D icon = null)
{
return CustomSubMenu.AddToggle(text, startingState, onToggle, icon, false);
return CustomSubMenu.AddToggle(text, startingState, onToggle, icon);
}

[Obsolete("This method is only here for compatibility reasons! Please use AMUtils.AddToModsFolder()", false)]
public static void AddModFolder(string text, Action openFunc, Texture2D icon = null)
{
21 changes: 11 additions & 10 deletions ActionMenuApi/ActionMenuApi.cs
Original file line number Diff line number Diff line change
@@ -2,47 +2,48 @@
using System.Collections;
using ActionMenuApi.Managers;
using MelonLoader;

#pragma warning disable 1591
[assembly: MelonInfo(typeof(ActionMenuApi.ActionMenuApi), "ActionMenuApi", "0.2.2", "gompo", "https://github.com/gompocp/ActionMenuApi/releases")]

[assembly: MelonInfo(typeof(ActionMenuApi.ActionMenuApi), "ActionMenuApi", "0.3.3", "gompo", "https://github.com/gompocp/ActionMenuApi/releases")]
[assembly: MelonGame("VRChat", "VRChat")]
[assembly: VerifyLoaderVersion(0, 4, 3, true)]

namespace ActionMenuApi
{
public class ActionMenuApi : MelonMod
public partial class ActionMenuApi : MelonMod
{

public override void OnApplicationStart()
{
ResourcesManager.LoadTextures();
MelonCoroutines.Start(WaitForActionMenuInit());
try
{
Patches.PatchAll(Harmony);
Patches.PatchAll(HarmonyInstance);
}
catch (Exception e)
{
MelonLogger.Error($"Patching failed with exception: {e.Message}");
}
}

IEnumerator WaitForActionMenuInit()
private IEnumerator WaitForActionMenuInit()
{
while (ActionMenuDriver.prop_ActionMenuDriver_0 == null)
while (ActionMenuDriver.prop_ActionMenuDriver_0 == null) //VRCUIManager Init is too early
yield return null;
if (string.IsNullOrEmpty(ID)) yield break;
ResourcesManager.InitLockGameObject();
RadialPuppetManager.Setup();
FourAxisPuppetManager.Setup();
}


public override void OnUpdate()
{
RadialPuppetManager.OnUpdate();
FourAxisPuppetManager.OnUpdate();
}

public ActionMenuApi()
{
LoaderCheck.CheckForRainbows();
}
private static string ID = "gompo";
}
}
7 changes: 4 additions & 3 deletions ActionMenuApi/ActionMenuApi.csproj
Original file line number Diff line number Diff line change
@@ -2,13 +2,14 @@
<PropertyGroup>
<TargetFramework>net472</TargetFramework>
<VrcReferences>true</VrcReferences>
<Version>0.2.2.0</Version>
<Version>0.3.3.0</Version>
<LangVersion>9</LangVersion>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="actionmenuapi.icons" />
<EmbeddedResource Include="Stuff\_dummy_.dll" />
<EmbeddedResource Include="Stuff\_dummy2_.dll" />
</ItemGroup>
</Project>
30 changes: 18 additions & 12 deletions ActionMenuApi/Api/AMUtils.cs
Original file line number Diff line number Diff line change
@@ -1,49 +1,55 @@
using System;
using ActionMenuApi.Helpers;
using ActionMenuApi.Managers;
using MelonLoader;
using UnityEngine;

namespace ActionMenuApi.Api
{
/// <summary>
/// General Action Menu Things
/// </summary>
public static class AMUtils
{
/// <summary>
/// Trigger a refresh for the action menus
/// Trigger a refresh for the action menus
/// </summary>
public static void RefreshActionMenu()
{
try
{
Utilities.RefreshAM();
}
catch(Exception e)
catch (Exception e)
{
MelonLogger.Warning($"Refresh failed (oops). This may or may not be an oof if another exception immediately follows after this exception: {e}");
MelonLogger.Warning(
$"Refresh failed (oops). This may or may not be an oof if another exception immediately follows after this exception: {e}");
//This is semi-abusable if this fails so its probably a good idea to have a fail-safe to protect sensitive functions that are meant to be locked
Utilities.ResetMenu();
}
}

/// <summary>
/// Trigger a complete reset for the action menus
/// Trigger a complete reset for the action menus
/// </summary>
public static void ResetMenu()
{
Utilities.ResetMenu();
}

/// <summary>
/// Add a mod to a dedicated section of the action menu with other mods
/// Add a mod to a dedicated section of the action menu with other mods
/// </summary>
/// <param name="text">Button text</param>
/// <param name="openFunc">Function called when your mod page is opened. Add your methods calls to other AMAPI methods such AddRadialPedalToSubMenu to add buttons to the submenu it creates when clicked</param>
/// <param name="openFunc">
/// Function called when your mod page is opened. Add your methods calls to other AMAPI methods such
/// AddRadialPedalToSubMenu to add buttons to the submenu it creates when clicked
/// </param>
/// <param name="icon">(optional) The Button Icon</param>
/// <param name="locked">(optional) Starting state of pedal</param>
public static void AddToModsFolder(string text, Action openFunc, Texture2D icon = null, bool locked = false)
{
ModsFolderManager.AddMod(() =>
{
CustomSubMenu.AddSubMenu(text, openFunc, icon, locked);
});
ModsFolderManager.AddMod(() => { CustomSubMenu.AddSubMenu(text, openFunc, icon, locked); });
}
}
}
Loading