Decompiled source of DeepMenusPlugin v1.0.0

DeepMenusPlugin.dll

Decompiled 3 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using Bounce.Singletons;
using HarmonyLib;
using ModdingTales;
using RadialUI;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("DeepMenusPlugin")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Nth Dimension")]
[assembly: AssemblyProduct("DeepMenusPlugin")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("DeepMenusPlugin")]
[assembly: ComVisible(false)]
[assembly: Guid("c303405d-e66c-4316-9cdb-4e3ca15c6360")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace LordAshes;

[BepInPlugin("org.lordashes.plugins.deepmenus", "Deep Menus Plugin", "1.0.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class DeepMenusPlugin : BaseUnityPlugin
{
	public static class Utility
	{
		public static bool isBoardLoaded()
		{
			return SimpleSingletonBehaviour<CameraController>.HasInstance && SingletonStateMBehaviour<BoardSessionManager, State<BoardSessionManager>>.HasInstance && !BoardSessionManager.IsLoading;
		}

		public static float ParseFloat(string value)
		{
			return float.Parse(value, CultureInfo.InvariantCulture);
		}

		public static GameObject FindInHierarchy(GameObject start, string seekName)
		{
			List<GameObject> results = new List<GameObject>();
			bool done = false;
			Traverse(start.transform, seekName, null, single: true, ref results, ref done);
			return (results.Count > 0) ? results.ElementAt(0) : null;
		}

		public static GameObject FindInHierarchyViaPartialName(GameObject start, string seekName)
		{
			List<GameObject> results = new List<GameObject>();
			bool done = false;
			Traverse(start.transform, seekName, null, single: true, ref results, ref done, partial: true);
			return (results.Count > 0) ? results.ElementAt(0) : null;
		}

		public static GameObject[] FindAllInHierarchy(GameObject start, string seekName)
		{
			List<GameObject> results = new List<GameObject>();
			bool done = false;
			Traverse(start.transform, seekName, null, single: false, ref results, ref done);
			return results.ToArray();
		}

		public static GameObject[] FindAllInHierarchyViaPartialName(GameObject start, string seekName)
		{
			List<GameObject> results = new List<GameObject>();
			bool done = false;
			Traverse(start.transform, seekName, null, single: false, ref results, ref done, partial: true);
			return results.ToArray();
		}

		public static GameObject FindWithComponentInHierarchy(GameObject start, string seekType)
		{
			List<GameObject> results = new List<GameObject>();
			bool done = false;
			Traverse(start.transform, null, seekType, single: true, ref results, ref done);
			return (results.Count > 0) ? results.ElementAt(0) : null;
		}

		public static GameObject[] FindAllWithComponentInHierarchy<T>(GameObject start, string seekType)
		{
			List<GameObject> results = new List<GameObject>();
			bool done = false;
			Traverse(start.transform, null, seekType, single: false, ref results, ref done);
			return results.ToArray();
		}

		public static void Traverse(Transform root, string seekName, string seekType, bool single, ref List<GameObject> results, ref bool done, bool partial = false)
		{
			try
			{
				if ((seekName == null || seekName == ((Object)((Component)root).gameObject).name || (partial && ((Object)((Component)root).gameObject).name.Contains(seekName))) && (seekType == null || (Object)(object)((Component)root).GetComponent(seekType) != (Object)null))
				{
					LoggingPlugin.LogTrace("Matched '" + ((Object)((Component)root).gameObject).name + "'");
					results.Add(((Component)root).gameObject);
					if (single)
					{
						done = true;
						return;
					}
				}
				foreach (Transform item in ExtensionMethods.Children(root))
				{
					if (!done)
					{
						Traverse(item, seekName, seekType, single, ref results, ref done, partial);
					}
				}
			}
			catch
			{
			}
		}

		public static object LookUp(in Dictionary<string, object> dictionary, string key)
		{
			foreach (KeyValuePair<string, object> item in dictionary)
			{
				if (item.Key.ToUpper() == key.ToUpper())
				{
					return item.Value;
				}
			}
			return null;
		}

		public static void PostOnMainPage(BaseUnityPlugin plugin)
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			string text = "Lord Ashes" + ("Lord Ashes".ToUpper().EndsWith("S") ? "'" : "'s");
			ModdingUtils.Initialize(plugin, new ManualLogSource("Deep Menus Plugin"), text, false);
		}
	}

	[HarmonyPatch(typeof(CreatureMenuBoardTool), "Begin")]
	private class PatchOnOp
	{
		private static bool Prefix()
		{
			LoggingPlugin.LogTrace("Resetting Current Menu");
			currentMenu = "";
			return true;
		}
	}

	public const string Name = "Deep Menus Plugin";

	public const string Guid = "org.lordashes.plugins.deepmenus";

	public const string Version = "1.0.0.0";

	public const string Author = "Lord Ashes";

	public static DeepMenusPlugin _self = null;

	public static string currentMenu = "";

	public static List<ItemArgs> menuItems = new List<ItemArgs>();

	private void Awake()
	{
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0049: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Expected O, but got Unknown
		_self = this;
		LoggingPlugin.SetLogLevel(((BaseUnityPlugin)this).Config.Bind<DiagnosticLevel>("Settings", "Diagnostic Level", (DiagnosticLevel)3, (ConfigDescription)null).Value);
		Sprite val = Image.LoadSprite("option.png", (CacheType)999);
		string? assemblyQualifiedName = ((object)this).GetType().AssemblyQualifiedName;
		DiagnosticLevel logLevel = LoggingPlugin.GetLogLevel();
		Debug.Log((object)(assemblyQualifiedName + ": Active. (Diagnostic Mode = " + ((object)(DiagnosticLevel)(ref logLevel)).ToString() + ")"));
		Harmony val2 = new Harmony("org.lordashes.plugins.deepmenus");
		val2.PatchAll();
	}

	public void CreateSubMenu(string menuLocation, ItemArgs item, Func<bool> checker = null)
	{
		item.Obj = "org.lordashes.plugins.deepmenus" + menuLocation;
		item.Action = delegate
		{
			NavigateTo(item.Title);
		};
		EnsureMenuExists(menuLocation);
		RadialSubmenu.CreateSubMenuItem("org.lordashes.plugins.deepmenus" + menuLocation, item, (Action<HideVolumeItem, string, MapMenuItem>)null, checker);
	}

	public void CreateSubMenuItem(string menuLocation, ItemArgs item, Func<bool> checker = null)
	{
		item.Obj = "org.lordashes.plugins.deepmenus" + menuLocation;
		EnsureMenuExists(menuLocation);
		RadialSubmenu.CreateSubMenuItem("org.lordashes.plugins.deepmenus" + menuLocation, item, (Action<HideVolumeItem, string, MapMenuItem>)null, checker);
	}

	public ItemArgs MakeItemEntry(string item, Action<string, string> callback, Sprite icon, bool fadeName = false, bool closeMenu = true)
	{
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Expected O, but got Unknown
		return new ItemArgs
		{
			Title = item,
			Action = delegate
			{
				callback(item, currentMenu);
			},
			Icon = icon,
			FadeName = fadeName,
			CloseMenuOnActivate = closeMenu
		};
	}

	public ItemArgs MakeSubMenuEntry(string item, Sprite icon, bool fadeName = false, bool closeMenu = true)
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Expected O, but got Unknown
		return new ItemArgs
		{
			Title = item,
			Action = delegate
			{
				NavigateTo(item);
			},
			Icon = icon,
			FadeName = fadeName,
			CloseMenuOnActivate = closeMenu
		};
	}

	public static void NavigateTo(string selection)
	{
		currentMenu = currentMenu + "/" + selection.ToString();
		LoggingPlugin.LogDebug("Navigating To " + currentMenu);
		((MonoBehaviour)_self).StartCoroutine(OpenSubMenu(currentMenu));
	}

	private void EnsureMenuExists(string menuLocation)
	{
		FieldInfo fieldInfo = (from f in typeof(RadialSubmenu).GetRuntimeFields()
			where f.Name == "subMenuEntries"
			select f).ElementAt(0);
		Dictionary<string, List<ItemArgs>> dictionary = (Dictionary<string, List<ItemArgs>>)fieldInfo.GetValue(null);
		if (!dictionary.ContainsKey("org.lordashes.plugins.deepmenus" + menuLocation))
		{
			dictionary.Add("org.lordashes.plugins.deepmenus" + menuLocation, new List<ItemArgs>());
			fieldInfo.SetValue(null, dictionary);
		}
	}

	private static IEnumerator OpenSubMenu(string menuLocation)
	{
		yield return (object)new WaitForSeconds(0.1f);
		LoggingPlugin.LogDebug("Reopening Sub-Menu " + currentMenu);
		CreatureBoardAsset asset = default(CreatureBoardAsset);
		CreaturePresenter.TryGetAsset(new CreatureGuid(RadialUIPlugin.GetLastRadialTargetCreature()), ref asset);
		if (!((Object)(object)asset != (Object)null))
		{
			yield break;
		}
		FieldInfo fi = (from f in typeof(RadialSubmenu).GetRuntimeFields()
			where f.Name == "subMenuEntries"
			select f).ElementAt(0);
		Dictionary<string, List<ItemArgs>> subMenuEntries = (Dictionary<string, List<ItemArgs>>)fi.GetValue(null);
		MapMenu mapMenu = MapMenuManager.OpenMenu(((Component)asset).transform.position + Vector3.up * 0.5f, true);
		foreach (ItemArgs item in subMenuEntries["org.lordashes.plugins.deepmenus" + menuLocation])
		{
			mapMenu.AddItem(item);
		}
	}
}