Decompiled source of LateGameUpgrades Gui v0.1.2

LGUGui.dll

Decompiled 5 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LGUGui.NetcodePatcher;
using LethalCompanyInputUtils.Api;
using LethalConfig;
using LethalConfig.ConfigItems;
using LethalConfig.ConfigItems.Options;
using Microsoft.CodeAnalysis;
using MoreShipUpgrades.API;
using MoreShipUpgrades.Managers;
using MoreShipUpgrades.UI.TerminalNodes;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.InputSystem;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: IgnoresAccessChecksTo("MoreShipUpgrades")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("LGUGui")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Example Dice Addon")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+8c26ccb3fcac04ac5ec671a536631dfe51490ba1")]
[assembly: AssemblyProduct("LGUGui")]
[assembly: AssemblyTitle("LGUGui")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
internal class <Module>
{
	static <Module>()
	{
	}
}
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace LGUGui
{
	public class ConfigManager
	{
		[MethodImpl(MethodImplOptions.NoInlining)]
		public static void setupLethalConfig()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Expected O, but got Unknown
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Expected O, but got Unknown
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Expected O, but got Unknown
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Expected O, but got Unknown
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Expected O, but got Unknown
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Expected O, but got Unknown
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Expected O, but got Unknown
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Expected O, but got Unknown
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Expected O, but got Unknown
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Expected O, but got Unknown
			ConfigEntry<float> transparency = Plugin.transparency;
			FloatSliderOptions val = new FloatSliderOptions();
			((BaseRangeOptions<float>)val).Min = 0f;
			((BaseRangeOptions<float>)val).Max = 1f;
			((BaseOptions)val).RequiresRestart = false;
			FloatSliderConfigItem val2 = new FloatSliderConfigItem(transparency, val);
			ConfigEntry<float> openSpeed = Plugin.openSpeed;
			FloatSliderOptions val3 = new FloatSliderOptions();
			((BaseRangeOptions<float>)val3).Min = 0f;
			((BaseRangeOptions<float>)val3).Max = 1f;
			((BaseOptions)val3).RequiresRestart = false;
			FloatSliderConfigItem val4 = new FloatSliderConfigItem(openSpeed, val3);
			TextDropDownConfigItem val5 = new TextDropDownConfigItem(Plugin.selectedFontName, false);
			ConfigEntry<int> sortOrder = Plugin.sortOrder;
			IntSliderOptions val6 = new IntSliderOptions();
			((BaseRangeOptions<int>)val6).Min = 0;
			((BaseRangeOptions<int>)val6).Max = 2;
			((BaseOptions)val6).RequiresRestart = false;
			IntSliderConfigItem val7 = new IntSliderConfigItem(sortOrder, val6);
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val5);
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val2);
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val4);
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val7);
		}
	}
	public class IngameKeybinds : LcInputActions
	{
		[InputAction("<Keyboard>/p", Name = "PurchaseMenu")]
		public InputAction PurchaseMenu { get; set; } = null;

	}
	public class MoreShipUpgradesPatch
	{
		[HarmonyPatch(typeof(LguStore), "HandleUpgradeClientRpc")]
		private class Patch_LGU_HandleUpgrade
		{
			private static void Postfix(string name, bool increment)
			{
				new PurchaseMenu().refresh();
			}
		}

		[HarmonyPatch(typeof(CurrencyManager), "TradePlayerCreditsClientRpc")]
		private class Patch_LGU_HandleTrade
		{
			private static void Postfix(ulong traderClientId, int playerCreditAmount, ClientRpcParams clientRpcParams)
			{
				new PurchaseMenu().refresh(trade: true);
			}
		}

		[HarmonyPatch(typeof(CurrencyManager), "TradePlayerCreditsClientRpc")]
		public class Patch_TradeFix_HostFilter
		{
			private static bool Prefix(ulong traderClientId, int playerCreditAmount, ClientRpcParams clientRpcParams)
			{
				//IL_003f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0040: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)StartOfRound.Instance?.localPlayerController == (Object)null)
				{
					return false;
				}
				ulong actualClientId = StartOfRound.Instance.localPlayerController.actualClientId;
				if (NetworkManager.Singleton.IsHost)
				{
					IReadOnlyList<ulong> targetClientIds = clientRpcParams.Send.TargetClientIds;
					if (targetClientIds != null && !targetClientIds.Contains(actualClientId))
					{
						return false;
					}
				}
				return true;
			}
		}
	}
	[BepInPlugin("Slayer6409.LGU_GUI", "LGU_GUI", "0.1.2")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		private const string modGUID = "Slayer6409.LGU_GUI";

		private const string modName = "LGU_GUI";

		private const string modVersion = "0.1.2";

		public static AssetBundle LoadedAssets;

		public static ManualLogSource CustomLogger;

		public static GameObject NetworkerPrefab;

		public static GameObject PurchaseMenuPrefab;

		public static GameObject UpgradeButton;

		public static GameObject TradePrefab;

		internal static IngameKeybinds Keybinds = null;

		public static ConfigFile ClientSideConfigs = null;

		private static readonly string directoryPath = Path.Combine(Application.persistentDataPath, "LGU_GUI");

		private readonly Harmony harmony = new Harmony("Slayer6409.LGU_GUI");

		public static ConfigEntry<bool> onlyInOrbit;

		public static ConfigEntry<bool> onlyOnShip;

		public static ConfigEntry<bool> extendedLog;

		public static ConfigEntry<bool> adminStuff;

		public static ConfigEntry<float> transparency;

		public static ConfigEntry<float> openSpeed;

		public static ConfigEntry<string> selectedFontName;

		public static ConfigEntry<int> sortOrder;

		public static Dictionary<string, TMP_FontAsset> fonts = new Dictionary<string, TMP_FontAsset>();

		private void Awake()
		{
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Expected O, but got Unknown
			CustomLogger = Logger.CreateLogSource("LateGameUpgrades GUI");
			if (!Directory.Exists(directoryPath))
			{
				Directory.CreateDirectory(directoryPath);
			}
			LoadedAssets = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "lgugui"));
			ClientSideConfigs = new ConfigFile(Path.Combine(directoryPath, "LGU_GUI_ClientSide.json"), true);
			PurchaseMenuPrefab = LoadedAssets.LoadAsset<GameObject>("PurchaseGUI");
			PurchaseMenuPrefab.AddComponent<MenuController>();
			PurchaseMenuPrefab.AddComponent<UIFadeEffect>();
			UpgradeButton = LoadedAssets.LoadAsset<GameObject>("UpgradePrefab");
			TradePrefab = LoadedAssets.LoadAsset<GameObject>("TradePrefab");
			fonts.Add("ARIAL", LoadedAssets.LoadAsset<TMP_FontAsset>("ARIAL SDF"));
			fonts.Add("LiberationSans", LoadedAssets.LoadAsset<TMP_FontAsset>("LiberationSans SDF"));
			fonts.Add("3270-Regular", LoadedAssets.LoadAsset<TMP_FontAsset>("3270-Regular SDF"));
			fonts.Add("Comic Sans", LoadedAssets.LoadAsset<TMP_FontAsset>("Comic Sans MS SDF"));
			fonts.Add("Party Vibes", LoadedAssets.LoadAsset<TMP_FontAsset>("Party Vibes SDF"));
			fonts.Add("Perfect DOS VGA 437", LoadedAssets.LoadAsset<TMP_FontAsset>("Perfect DOS VGA 437 SDF"));
			fonts.Add("shlop rg", LoadedAssets.LoadAsset<TMP_FontAsset>("shlop rg SDF"));
			fonts.Add("WEBDINGS", LoadedAssets.LoadAsset<TMP_FontAsset>("WEBDINGS SDF"));
			fonts.Add("Lizzie", LoadedAssets.LoadAsset<TMP_FontAsset>("Lizzie-vmnD SDF"));
			fonts.Add("Seven Segment", LoadedAssets.LoadAsset<TMP_FontAsset>("Seven Segment SDF"));
			fonts.Add("Conthrax-SemiBold", LoadedAssets.LoadAsset<TMP_FontAsset>("Conthrax-SemiBold SDF"));
			fonts.Add("Astronomus", LoadedAssets.LoadAsset<TMP_FontAsset>("Astronomus SDF"));
			fonts.Add("ciacode39_m", LoadedAssets.LoadAsset<TMP_FontAsset>("ciacode39_m SDF"));
			fonts.Add("DOTMATRI", LoadedAssets.LoadAsset<TMP_FontAsset>("DOTMATRI SDF"));
			fonts.Add("Minecrafter.Reg", LoadedAssets.LoadAsset<TMP_FontAsset>("Minecrafter.Reg SDF"));
			configSetup();
			harmony.PatchAll();
			Keybinds = new IngameKeybinds();
			Keybinds.PurchaseMenu.performed += delegate
			{
				tryShowMenu();
			};
			selectedFontName.SettingChanged += delegate
			{
				changeFont();
			};
			if (Chainloader.PluginInfos.ContainsKey("ainavt.lc.lethalconfig"))
			{
				ConfigManager.setupLethalConfig();
			}
			CustomLogger.LogInfo((object)"Plugin LGUGui is loaded!");
		}

		public static void ExtendedLogging(string msg, LogLevel level = 16)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			if (extendedLog.Value)
			{
				CustomLogger.Log(level, (object)msg);
			}
		}

		public void configSetup()
		{
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Expected O, but got Unknown
			onlyInOrbit = ((BaseUnityPlugin)this).Config.Bind<bool>("Main", "Only In Orbit", false, "Makes it to where you are only able to upgrade in orbit.");
			onlyOnShip = ((BaseUnityPlugin)this).Config.Bind<bool>("Main", "Only On Ship", true, "Makes it to where you are only able to upgrade pn the ship.");
			extendedLog = ((BaseUnityPlugin)this).Config.Bind<bool>("Main", "Extended Logging", false, "Log more debug stuff");
			adminStuff = ((BaseUnityPlugin)this).Config.Bind<bool>("Main", "Admin Mode", false, "Enable the Admin Button");
			string[] array = fonts.Keys.ToArray();
			selectedFontName = ClientSideConfigs.Bind<string>("Client Side", "Selected Font", array.Contains("LiberationSans") ? "LiberationSans" : array.First(), new ConfigDescription("Select which font to use in the LGU GUI.", (AcceptableValueBase)(object)new AcceptableValueList<string>(array), Array.Empty<object>()));
			transparency = ClientSideConfigs.Bind<float>("Client Side", "Transparency", 0.93f, "Sets the transparency of the GUI.");
			openSpeed = ClientSideConfigs.Bind<float>("Client Side", "Open Speed", 0.15f, "Sets the open animation speed of the GUI.");
			sortOrder = ClientSideConfigs.Bind<int>("Client Side", "Sort Order", 0, "Sets the sort order of the upgrades");
		}

		public static void changeFont()
		{
			if ((Object)(object)PurchaseMenu.menu != (Object)null)
			{
				ApplyFontTo(PurchaseMenu.menu);
			}
		}

		public static void ApplyFontTo(GameObject root)
		{
			if ((Object)(object)root == (Object)null)
			{
				return;
			}
			if (!fonts.TryGetValue(selectedFontName.Value, out var value) || (Object)(object)value == (Object)null)
			{
				CustomLogger.LogWarning((object)("Font '" + selectedFontName.Value + "' not found or null when applying to purchase menu."));
				return;
			}
			int num = 0;
			int num2 = 0;
			int num3 = 0;
			bool flag = false;
			TextMeshProUGUI[] componentsInChildren = root.GetComponentsInChildren<TextMeshProUGUI>(true);
			foreach (TextMeshProUGUI val in componentsInChildren)
			{
				if ((Object)(object)val == (Object)null)
				{
					num3++;
					continue;
				}
				if (((TMP_Text)val).font == value)
				{
					num2++;
					continue;
				}
				try
				{
					((TMP_Text)val).font = value;
					num++;
				}
				catch (Exception ex)
				{
					ExtendedLogging("ApplyFontTo: failed on " + ((Object)val).name + ": " + ex.GetType().Name + ": " + ex.Message + ". Attempting to default to Ariel", (LogLevel)4);
					num3++;
					try
					{
						flag = true;
						if (fonts.TryGetValue("ARIAL", out var value2))
						{
							((TMP_Text)val).font = value2;
						}
					}
					catch (Exception)
					{
						CustomLogger.LogWarning((object)"Failed to default to arial, please change your font in the config");
					}
				}
			}
			string text = (flag ? "ARIAL" : selectedFontName.Value);
			ExtendedLogging("Applied font '" + text + "' to purchase menu. " + $"changed={num}, skipped={num2}, failed={num3}", (LogLevel)16);
		}

		public void tryShowMenu()
		{
			PlayerControllerB val = StartOfRound.Instance?.localPlayerController;
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			bool flag = val.quickMenuManager?.isMenuOpen ?? false;
			bool flag2 = (Object)(object)PurchaseMenu.menu != (Object)null && PurchaseMenu.menu.activeInHierarchy;
			if ((!flag || flag2) && (!onlyInOrbit.Value || StartOfRound.Instance.inShipPhase) && (!onlyOnShip.Value || val.isInHangarShipRoom) && !val.inTerminalMenu && !val.isTypingChat)
			{
				if (flag2)
				{
					PurchaseMenu.menuController.CloseMenu();
				}
				else
				{
					PurchaseMenu.initMenu();
				}
			}
		}
	}
	public class PurchaseMenu
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static UnityAction <0>__showTradeGui;

			public static UnityAction <1>__showAdminGui;
		}

		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static UnityAction<float> <>9__18_1;

			public static UnityAction<float> <>9__18_2;

			public static UnityAction <>9__18_3;

			public static UnityAction <>9__18_4;

			public static UnityAction <>9__18_5;

			public static UnityAction <>9__18_6;

			public static UnityAction <>9__18_7;

			public static UnityAction <>9__18_8;

			public static UnityAction <>9__18_9;

			public static UnityAction <>9__18_10;

			public static UnityAction <>9__18_11;

			public static Func<CustomTerminalNode, string> <>9__24_1;

			public static Func<CustomTerminalNode, int> <>9__24_3;

			public static Func<CustomTerminalNode, bool> <>9__24_5;

			public static Func<CustomTerminalNode, string> <>9__24_6;

			public static Func<CustomTerminalNode, string> <>9__24_8;

			public static Func<PlayerControllerB, string> <>9__30_0;

			public static Func<PlayerControllerB, string> <>9__31_0;

			internal void <initMenu>b__18_1(float value)
			{
				//IL_0036: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0045: Unknown result type (might be due to invalid IL or missing references)
				Plugin.transparency.Value = value;
				foreach (Graphic graphic in fader.graphics)
				{
					if ((Object)(object)graphic != (Object)null)
					{
						Color color = graphic.color;
						color.a = value;
						graphic.color = color;
					}
				}
			}

			internal void <initMenu>b__18_2(float value)
			{
				Plugin.openSpeed.Value = value;
			}

			internal void <initMenu>b__18_3()
			{
				showUpgrades(shared: true);
			}

			internal void <initMenu>b__18_4()
			{
				showUpgrades(shared: false);
			}

			internal void <initMenu>b__18_5()
			{
				showSettingsMenu(settings: true);
			}

			internal void <initMenu>b__18_6()
			{
				showSettingsMenu(settings: false);
			}

			internal void <initMenu>b__18_7()
			{
				sortMode = 0;
				refreshStuff();
			}

			internal void <initMenu>b__18_8()
			{
				sortMode = 1;
				refreshStuff();
			}

			internal void <initMenu>b__18_9()
			{
				sortMode = 2;
				refreshStuff();
			}

			internal void <initMenu>b__18_10()
			{
				menuController.CloseMenu();
			}

			internal void <initMenu>b__18_11()
			{
				menuController.CloseMenu();
			}

			internal string <showUpgrades>b__24_1(CustomTerminalNode x)
			{
				return x.Name;
			}

			internal int <showUpgrades>b__24_3(CustomTerminalNode x)
			{
				return x.GetCurrentPrice();
			}

			internal bool <showUpgrades>b__24_5(CustomTerminalNode x)
			{
				return x.SalePercentage < 1f;
			}

			internal string <showUpgrades>b__24_6(CustomTerminalNode x)
			{
				return x.Name;
			}

			internal string <showUpgrades>b__24_8(CustomTerminalNode x)
			{
				return x.Name;
			}

			internal string <showAdminGui>b__30_0(PlayerControllerB p)
			{
				return p.playerUsername;
			}

			internal string <showTradeGui>b__31_0(PlayerControllerB p)
			{
				return p.playerUsername;
			}
		}

		[CompilerGenerated]
		private sealed class <WaitFade>d__19 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <WaitFade>d__19(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					fader.FadeIn();
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		public static GameObject menu;

		public static MenuController menuController;

		public static GameObject mainScreen;

		public static GameObject settingsScreen;

		public static TMP_Text currencyText;

		public static UIFadeEffect fader;

		public static bool isTrackedYet = false;

		public static Transform mainScrollContent;

		public static Transform ListUpgrades;

		public static Transform PurchaseUpgrade;

		public static Color NormalTextColor = new Color(0.02942256f, 0.8113208f, 0f, 1f);

		public static Color RedTextColor = new Color(0.7169812f, 0.03853131f, 0f, 1f);

		public static Color SaleColor = new Color(0f, 0.7f, 1f, 1f);

		public static bool _toggledQuickMenuFlag;

		public static int sortMode = 0;

		public static CustomTerminalNode currentSelection;

		public static string location;

		private static bool isOpening = false;

		public static void initMenu()
		{
			//IL_02a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ab: Expected O, but got Unknown
			//IL_06a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_06a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ac: Expected O, but got Unknown
			//IL_02ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f6: Expected O, but got Unknown
			//IL_0448: Unknown result type (might be due to invalid IL or missing references)
			//IL_044d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0453: Expected O, but got Unknown
			//IL_0474: Unknown result type (might be due to invalid IL or missing references)
			//IL_0479: Unknown result type (might be due to invalid IL or missing references)
			//IL_047f: Expected O, but got Unknown
			//IL_04a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ab: Expected O, but got Unknown
			//IL_04cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_04d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_04d7: Expected O, but got Unknown
			//IL_04f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_04f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ff: Expected O, but got Unknown
			//IL_0520: Unknown result type (might be due to invalid IL or missing references)
			//IL_0525: Unknown result type (might be due to invalid IL or missing references)
			//IL_052b: Expected O, but got Unknown
			//IL_054c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0551: Unknown result type (might be due to invalid IL or missing references)
			//IL_0557: Expected O, but got Unknown
			//IL_0578: Unknown result type (might be due to invalid IL or missing references)
			//IL_057d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0583: Expected O, but got Unknown
			//IL_05bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_05c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ca: Expected O, but got Unknown
			//IL_0606: Unknown result type (might be due to invalid IL or missing references)
			//IL_060b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0611: Expected O, but got Unknown
			if (isOpening || ((Object)(object)menu != (Object)null && menu.activeInHierarchy))
			{
				return;
			}
			isOpening = true;
			try
			{
				Plugin.ExtendedLogging("Initializing LGU Menu", (LogLevel)16);
				if ((Object)(object)StartOfRound.Instance?.localPlayerController?.quickMenuManager == (Object)null || (Object)(object)CurrencyManager.Instance == (Object)null)
				{
					Plugin.ExtendedLogging("Aborting menu init: StartOfRound or CurrencyManager is null", (LogLevel)16);
					return;
				}
				if ((Object)(object)menu == (Object)null)
				{
					menu = Object.Instantiate<GameObject>(Plugin.PurchaseMenuPrefab);
					if ((Object)(object)menuController == (Object)null)
					{
						menu.AddComponent<MenuController>();
					}
					menuController = menu.GetComponent<MenuController>();
					mainScreen = ((Component)menu.transform.Find("Background")).gameObject;
					settingsScreen = ((Component)menu.transform.Find("SettingsMenu")).gameObject;
					currencyText = ((Component)mainScreen.transform.Find("TotalPoints")).GetComponent<TMP_Text>();
					fader = menu.GetComponent<UIFadeEffect>();
					if ((Object)(object)fader == (Object)null)
					{
						fader = menu.AddComponent<UIFadeEffect>();
					}
					Button component = ((Component)mainScreen.transform.Find("SharedUpgrades")).GetComponent<Button>();
					Button component2 = ((Component)mainScreen.transform.Find("IndividualUpgrades")).GetComponent<Button>();
					Button component3 = ((Component)mainScreen.transform.Find("TradePoints")).GetComponent<Button>();
					Button component4 = ((Component)mainScreen.transform.Find("Settings")).GetComponent<Button>();
					Button component5 = ((Component)settingsScreen.transform.Find("Back")).GetComponent<Button>();
					Button component6 = ((Component)menu.transform.Find("Background/ListUpgrades/Sort/Name")).GetComponent<Button>();
					Button component7 = ((Component)menu.transform.Find("Background/ListUpgrades/Sort/Cost")).GetComponent<Button>();
					Button component8 = ((Component)menu.transform.Find("Background/ListUpgrades/Sort/Sale")).GetComponent<Button>();
					mainScrollContent = mainScreen.transform.Find("ListUpgrades/Scroll View/Viewport/Content");
					ListUpgrades = mainScreen.transform.Find("ListUpgrades");
					PurchaseUpgrade = mainScreen.transform.Find("PurchaseUpgrade");
					List<OptionData> list = new List<OptionData>();
					list.Add(new OptionData(Plugin.selectedFontName.Value));
					foreach (KeyValuePair<string, TMP_FontAsset> font in Plugin.fonts)
					{
						if (!(font.Key == Plugin.selectedFontName.Value))
						{
							list.Add(new OptionData(font.Key));
						}
					}
					Slider component9 = ((Component)settingsScreen.transform.Find("TransparencySlider")).GetComponent<Slider>();
					Slider component10 = ((Component)settingsScreen.transform.Find("TimeSlider")).GetComponent<Slider>();
					TMP_Dropdown fontDropdown = ((Component)settingsScreen.transform.Find("Dropdown")).GetComponent<TMP_Dropdown>();
					fontDropdown.ClearOptions();
					fontDropdown.options = list;
					fontDropdown.value = 0;
					((UnityEvent<int>)(object)fontDropdown.onValueChanged).AddListener((UnityAction<int>)delegate(int index)
					{
						Plugin.selectedFontName.Value = fontDropdown.options[index].text;
					});
					component9.value = Plugin.transparency.Value;
					((UnityEvent<float>)(object)component9.onValueChanged).AddListener((UnityAction<float>)delegate(float value)
					{
						//IL_0036: Unknown result type (might be due to invalid IL or missing references)
						//IL_003b: Unknown result type (might be due to invalid IL or missing references)
						//IL_0045: Unknown result type (might be due to invalid IL or missing references)
						Plugin.transparency.Value = value;
						foreach (Graphic graphic in fader.graphics)
						{
							if ((Object)(object)graphic != (Object)null)
							{
								Color color = graphic.color;
								color.a = value;
								graphic.color = color;
							}
						}
					});
					component10.value = Plugin.openSpeed.Value;
					((UnityEvent<float>)(object)component10.onValueChanged).AddListener((UnityAction<float>)delegate(float value)
					{
						Plugin.openSpeed.Value = value;
					});
					ButtonClickedEvent onClick = component.onClick;
					object obj = <>c.<>9__18_3;
					if (obj == null)
					{
						UnityAction val = delegate
						{
							showUpgrades(shared: true);
						};
						<>c.<>9__18_3 = val;
						obj = (object)val;
					}
					((UnityEvent)onClick).AddListener((UnityAction)obj);
					ButtonClickedEvent onClick2 = component2.onClick;
					object obj2 = <>c.<>9__18_4;
					if (obj2 == null)
					{
						UnityAction val2 = delegate
						{
							showUpgrades(shared: false);
						};
						<>c.<>9__18_4 = val2;
						obj2 = (object)val2;
					}
					((UnityEvent)onClick2).AddListener((UnityAction)obj2);
					ButtonClickedEvent onClick3 = component4.onClick;
					object obj3 = <>c.<>9__18_5;
					if (obj3 == null)
					{
						UnityAction val3 = delegate
						{
							showSettingsMenu(settings: true);
						};
						<>c.<>9__18_5 = val3;
						obj3 = (object)val3;
					}
					((UnityEvent)onClick3).AddListener((UnityAction)obj3);
					ButtonClickedEvent onClick4 = component5.onClick;
					object obj4 = <>c.<>9__18_6;
					if (obj4 == null)
					{
						UnityAction val4 = delegate
						{
							showSettingsMenu(settings: false);
						};
						<>c.<>9__18_6 = val4;
						obj4 = (object)val4;
					}
					((UnityEvent)onClick4).AddListener((UnityAction)obj4);
					ButtonClickedEvent onClick5 = component3.onClick;
					object obj5 = <>O.<0>__showTradeGui;
					if (obj5 == null)
					{
						UnityAction val5 = showTradeGui;
						<>O.<0>__showTradeGui = val5;
						obj5 = (object)val5;
					}
					((UnityEvent)onClick5).AddListener((UnityAction)obj5);
					ButtonClickedEvent onClick6 = component6.onClick;
					object obj6 = <>c.<>9__18_7;
					if (obj6 == null)
					{
						UnityAction val6 = delegate
						{
							sortMode = 0;
							refreshStuff();
						};
						<>c.<>9__18_7 = val6;
						obj6 = (object)val6;
					}
					((UnityEvent)onClick6).AddListener((UnityAction)obj6);
					ButtonClickedEvent onClick7 = component7.onClick;
					object obj7 = <>c.<>9__18_8;
					if (obj7 == null)
					{
						UnityAction val7 = delegate
						{
							sortMode = 1;
							refreshStuff();
						};
						<>c.<>9__18_8 = val7;
						obj7 = (object)val7;
					}
					((UnityEvent)onClick7).AddListener((UnityAction)obj7);
					ButtonClickedEvent onClick8 = component8.onClick;
					object obj8 = <>c.<>9__18_9;
					if (obj8 == null)
					{
						UnityAction val8 = delegate
						{
							sortMode = 2;
							refreshStuff();
						};
						<>c.<>9__18_9 = val8;
						obj8 = (object)val8;
					}
					((UnityEvent)onClick8).AddListener((UnityAction)obj8);
					Button component11 = ((Component)mainScreen.transform.Find("xButton")).GetComponent<Button>();
					ButtonClickedEvent onClick9 = component11.onClick;
					object obj9 = <>c.<>9__18_10;
					if (obj9 == null)
					{
						UnityAction val9 = delegate
						{
							menuController.CloseMenu();
						};
						<>c.<>9__18_10 = val9;
						obj9 = (object)val9;
					}
					((UnityEvent)onClick9).AddListener((UnityAction)obj9);
					Button component12 = ((Component)settingsScreen.transform.Find("xButton")).GetComponent<Button>();
					ButtonClickedEvent onClick10 = component12.onClick;
					object obj10 = <>c.<>9__18_11;
					if (obj10 == null)
					{
						UnityAction val10 = delegate
						{
							menuController.CloseMenu();
						};
						<>c.<>9__18_11 = val10;
						obj10 = (object)val10;
					}
					((UnityEvent)onClick10).AddListener((UnityAction)obj10);
				}
				Button component13 = ((Component)mainScreen.transform.Find("Admin")).GetComponent<Button>();
				if (Plugin.adminStuff.Value && (((NetworkBehaviour)StartOfRound.Instance).IsHost || StartOfRound.Instance.localPlayerController.playerSteamId == 76561198077184650L))
				{
					Plugin.ExtendedLogging("Admin Stuff", (LogLevel)16);
					((Component)component13).gameObject.SetActive(true);
					ButtonClickedEvent onClick11 = component13.onClick;
					object obj11 = <>O.<1>__showAdminGui;
					if (obj11 == null)
					{
						UnityAction val11 = showAdminGui;
						<>O.<1>__showAdminGui = val11;
						obj11 = (object)val11;
					}
					((UnityEvent)onClick11).AddListener((UnityAction)obj11);
				}
				Plugin.ApplyFontTo(menu);
				currencyText.text = CurrencyManager.Instance.CurrencyAmount.ToString();
				resetView();
				menu.SetActive(true);
				QuickMenuManager val12 = StartOfRound.Instance?.localPlayerController?.quickMenuManager;
				if ((Object)(object)val12 != (Object)null && !val12.isMenuOpen)
				{
					val12.isMenuOpen = true;
					_toggledQuickMenuFlag = true;
				}
				else
				{
					_toggledQuickMenuFlag = false;
				}
				((MonoBehaviour)menuController).StartCoroutine(WaitFade());
				Cursor.visible = true;
				Cursor.lockState = (CursorLockMode)0;
				menuController.Reopen();
				StartOfRound.Instance.localPlayerController.quickMenuManager.isMenuOpen = true;
			}
			finally
			{
				isOpening = false;
			}
		}

		[IteratorStateMachine(typeof(<WaitFade>d__19))]
		private static IEnumerator WaitFade()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <WaitFade>d__19(0);
		}

		public static void resetView()
		{
			mainScreen.gameObject.SetActive(true);
			((Component)PurchaseUpgrade).gameObject.SetActive(false);
			((Component)ListUpgrades).gameObject.SetActive(false);
			settingsScreen.gameObject.SetActive(false);
		}

		public static void LogTransformTree(Transform t, string prefix = "")
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Expected O, but got Unknown
			Plugin.ExtendedLogging(prefix + ((Object)t).name, (LogLevel)16);
			foreach (Transform item in t)
			{
				Transform t2 = item;
				LogTransformTree(t2, prefix + ((Object)t).name + "/");
			}
		}

		public static void clearMainViewport()
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			foreach (Transform item in mainScrollContent)
			{
				Transform val = item;
				Object.Destroy((Object)(object)((Component)val).gameObject);
			}
		}

		public static void swapTwo(bool purchase)
		{
			((Component)PurchaseUpgrade).gameObject.SetActive(purchase);
			((Component)ListUpgrades).gameObject.SetActive(!purchase);
		}

		public static void showUpgrades(bool shared)
		{
			//IL_02bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_031c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0315: Unknown result type (might be due to invalid IL or missing references)
			//IL_034d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0403: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_044e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0458: Expected O, but got Unknown
			//IL_0434: Unknown result type (might be due to invalid IL or missing references)
			currentSelection = null;
			location = "showUpgrades," + shared;
			swapTwo(purchase: false);
			int currencyAmount = CurrencyManager.Instance.CurrencyAmount;
			currencyText.text = currencyAmount.ToString();
			clearMainViewport();
			List<CustomTerminalNode> upgradeNodes = UpgradeApi.GetUpgradeNodes();
			foreach (CustomTerminalNode upgrade in sortMode switch
			{
				0 => from x in upgradeNodes
					where x.SharedUpgrade == shared
					orderby x.Name
					select x, 
				1 => from x in upgradeNodes
					where x.SharedUpgrade == shared
					orderby x.GetCurrentPrice()
					select x, 
				2 => from x in upgradeNodes
					where x.SharedUpgrade == shared
					orderby x.SalePercentage < 1f descending, x.Name
					select x, 
				_ => from x in upgradeNodes
					where x.SharedUpgrade == shared
					orderby x.Name
					select x, 
			})
			{
				int currentPrice = upgrade.GetCurrentPrice();
				int num = (upgrade.AlternateCurrency ? CurrencyManager.Instance.GetCurrencyAmountFromCredits(currentPrice) : currentPrice);
				int currentLevel = upgrade.GetCurrentLevel();
				int num2 = currentLevel + upgrade.GetRemainingLevels();
				bool flag = upgrade.GetRemainingLevels() == 0;
				bool flag2 = num <= currencyAmount;
				Plugin.ExtendedLogging("Init Upgrade: " + upgrade.Name, (LogLevel)16);
				GameObject val = Object.Instantiate<GameObject>(Plugin.UpgradeButton, mainScrollContent);
				Plugin.ApplyFontTo(val);
				Button component = ((Component)val.transform.Find("Button")).GetComponent<Button>();
				TMP_Text component2 = ((Component)((Component)component).transform.Find("Text (TMP)")).GetComponent<TMP_Text>();
				component2.text = $"{upgrade.Name} : {currentLevel}/{num2}";
				((Graphic)component2).color = (flag2 ? NormalTextColor : RedTextColor);
				if (flag2 && !flag && upgrade.SalePercentage < 1f)
				{
					((Graphic)component2).color = SaleColor;
				}
				TMP_Text component3 = ((Component)val.transform.Find("DisplayText")).GetComponent<TMP_Text>();
				((Graphic)component3).color = (flag2 ? NormalTextColor : RedTextColor);
				if (flag2 && !flag && upgrade.SalePercentage < 1f)
				{
					((Graphic)component3).color = SaleColor;
				}
				TMP_Text component4 = ((Component)val.transform.Find("DisplayText/PointsRequired")).GetComponent<TMP_Text>();
				if (flag)
				{
					component4.text = "Maxed";
				}
				else if (upgrade.SalePercentage < 1f)
				{
					float num3 = (1f - upgrade.SalePercentage) * 100f;
					component4.text = $"{num} ({Mathf.RoundToInt(num3)}% off)";
				}
				else
				{
					component4.text = num.ToString();
				}
				((Graphic)component4).color = (flag2 ? NormalTextColor : RedTextColor);
				if (flag2 && !flag && upgrade.SalePercentage < 1f)
				{
					((Graphic)component4).color = SaleColor;
				}
				((UnityEvent)component.onClick).AddListener((UnityAction)delegate
				{
					swapTwo(purchase: true);
					showUpgradeGui(upgrade);
				});
			}
		}

		public static void showSettingsMenu(bool settings)
		{
			mainScreen.gameObject.SetActive(!settings);
			settingsScreen.gameObject.SetActive(settings);
		}

		public static void refreshStuff(bool trade = false)
		{
			if ((Object)(object)menu == (Object)null || !menu.activeInHierarchy)
			{
				return;
			}
			if (trade)
			{
				if (location == "showUpgrades," + false)
				{
					showUpgrades(shared: false);
				}
				if (location == "showTradeGui")
				{
					showTradeGui();
				}
			}
			if (location == "showUpgrades," + true)
			{
				showUpgrades(shared: true);
			}
			if (location == "showUpgrades," + false)
			{
				showUpgrades(shared: false);
			}
			if (location == "showUpgradeGui" && currentSelection != null)
			{
				showUpgradeGui(currentSelection);
			}
		}

		public void refresh(bool trade = false)
		{
			if ((Object)(object)menu == (Object)null || !menu.activeInHierarchy)
			{
				return;
			}
			if (trade)
			{
				if (location == "showUpgrades," + false)
				{
					showUpgrades(shared: false);
				}
				if (location == "showTradeGui")
				{
					showTradeGui();
				}
			}
			if (location == "showUpgrades," + true)
			{
				showUpgrades(shared: true);
			}
			if (location == "showUpgrades," + false)
			{
				showUpgrades(shared: false);
			}
			if (location == "showUpgradeGui" && currentSelection != null)
			{
				showUpgradeGui(currentSelection);
			}
		}

		public static void showUpgradeGui(CustomTerminalNode currentUpgrade)
		{
			//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f0: Expected O, but got Unknown
			//IL_0332: Unknown result type (might be due to invalid IL or missing references)
			//IL_0359: Unknown result type (might be due to invalid IL or missing references)
			//IL_0363: Expected O, but got Unknown
			//IL_02ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0302: Expected O, but got Unknown
			currentSelection = currentUpgrade;
			location = "showUpgradeGui";
			TextMeshProUGUI component = ((Component)menu.transform.Find("Background/PurchaseUpgrade/Text (TMP)")).GetComponent<TextMeshProUGUI>();
			Button purchaseButton = ((Component)menu.transform.Find("Background/PurchaseUpgrade/PurchaseButton")).GetComponent<Button>();
			TMP_Text component2 = ((Component)((Component)purchaseButton).transform.Find("Text (TMP)")).GetComponent<TMP_Text>();
			Button refundButton = ((Component)menu.transform.Find("Background/PurchaseUpgrade/RefundButton")).GetComponent<Button>();
			TMP_Text component3 = ((Component)((Component)refundButton).transform.Find("Text (TMP)")).GetComponent<TMP_Text>();
			Button component4 = ((Component)menu.transform.Find("Background/PurchaseUpgrade/BackButton")).GetComponent<Button>();
			((TMP_Text)component).text = currentUpgrade.Description;
			bool usesLGU = currentUpgrade.AlternateCurrency;
			Terminal terminal = UpgradeBus.Instance.GetTerminal();
			int num = (usesLGU ? CurrencyManager.Instance.CurrencyAmount : terminal.groupCredits);
			int currentPrice = currentUpgrade.GetCurrentPrice();
			int num2 = (usesLGU ? CurrencyManager.Instance.GetCurrencyAmountFromCredits(currentPrice) : currentPrice);
			string arg = (usesLGU ? "pts" : "cr");
			bool flag = currentPrice != int.MaxValue && num >= num2;
			component2.text = ((currentPrice != int.MaxValue) ? $"Purchase: {num2} {arg}" : "Maxed");
			((Selectable)purchaseButton).interactable = flag;
			((Graphic)component2).color = (flag ? NormalTextColor : RedTextColor);
			((UnityEventBase)purchaseButton.onClick).RemoveAllListeners();
			((UnityEvent)purchaseButton.onClick).AddListener((UnityAction)delegate
			{
				((Selectable)purchaseButton).interactable = false;
				int currentPrice2 = currentUpgrade.GetCurrentPrice();
				int num9 = (usesLGU ? CurrencyManager.Instance.GetCurrencyAmountFromCredits(currentPrice2) : currentPrice2);
				if (currentPrice2 == int.MaxValue)
				{
					showUpgradeGui(currentUpgrade);
				}
				else if ((usesLGU && CurrencyManager.Instance.CurrencyAmount < num9) || (!usesLGU && terminal.groupCredits < num9))
				{
					showUpgradeGui(currentUpgrade);
				}
				else
				{
					Plugin.ExtendedLogging(string.Format("Purchasing Upgrade: {0} for {1} {2}", currentUpgrade.Name, num9, usesLGU ? "pts" : "cr"), (LogLevel)16);
					if (usesLGU)
					{
						CurrencyManager instance2 = CurrencyManager.Instance;
						instance2.CurrencyAmount -= num9;
					}
					else
					{
						LguStore.Instance.SyncCreditsServerRpc(Mathf.Max(0, terminal.groupCredits - num9));
						LguStore.Instance.AddUpgradeSpentCreditsServerRpc(num9);
					}
					UpgradeApi.TriggerUpgradeRankup(currentUpgrade);
					currencyText.text = (usesLGU ? CurrencyManager.Instance.CurrencyAmount : UpgradeBus.Instance.GetTerminal().groupCredits).ToString();
					showUpgradeGui(currentUpgrade);
				}
			});
			if (currentUpgrade.Refundable && ((currentUpgrade is TierTerminalNode) ? (currentUpgrade.GetCurrentLevel() > 0) : currentUpgrade.Unlocked))
			{
				int num3 = RefundBaseNow(currentUpgrade);
				int num4 = (usesLGU ? CurrencyManager.Instance.GetCurrencyAmountFromCredits(num3) : num3);
				int num5 = Mathf.FloorToInt((float)num4 * currentUpgrade.RefundPercentage);
				string arg2 = (usesLGU ? "pts" : "cr");
				component3.text = $"Refund : {num5} {arg2}";
				((Selectable)refundButton).interactable = num5 > 0;
				((Graphic)component3).color = (((Selectable)refundButton).interactable ? NormalTextColor : RedTextColor);
				((UnityEventBase)refundButton.onClick).RemoveAllListeners();
				((UnityEvent)refundButton.onClick).AddListener((UnityAction)delegate
				{
					((Selectable)refundButton).interactable = false;
					int num6 = RefundBaseNow(currentUpgrade);
					int num7 = (usesLGU ? CurrencyManager.Instance.GetCurrencyAmountFromCredits(num6) : num6);
					int num8 = Mathf.FloorToInt((float)num7 * currentUpgrade.RefundPercentage);
					if (num8 <= 0)
					{
						showUpgradeGui(currentUpgrade);
					}
					else
					{
						Plugin.ExtendedLogging(string.Format("Refunding Upgrade: {0} for {1} {2}", currentUpgrade.Name, num8, usesLGU ? "pts" : "cr"), (LogLevel)16);
						if (usesLGU)
						{
							CurrencyManager instance = CurrencyManager.Instance;
							instance.CurrencyAmount += num8;
						}
						else
						{
							LguStore.Instance.SyncCreditsServerRpc(terminal.groupCredits + num8);
						}
						UpgradeApi.TriggerUpgradeDowngrade(currentUpgrade);
						currencyText.text = (usesLGU ? CurrencyManager.Instance.CurrencyAmount : UpgradeBus.Instance.GetTerminal().groupCredits).ToString();
						showUpgradeGui(currentUpgrade);
					}
				});
			}
			else
			{
				component3.text = "";
				((UnityEventBase)refundButton.onClick).RemoveAllListeners();
				((Selectable)refundButton).interactable = false;
				((Graphic)component3).color = RedTextColor;
			}
			((UnityEventBase)component4.onClick).RemoveAllListeners();
			((UnityEvent)component4.onClick).AddListener((UnityAction)delegate
			{
				showUpgrades(currentUpgrade.SharedUpgrade);
			});
		}

		private static int RefundBaseNow(CustomTerminalNode node)
		{
			if (node is TierTerminalNode)
			{
				if (node.GetCurrentLevel() == 1)
				{
					return Mathf.RoundToInt((float)node.UnlockPrice * node.SalePercentage);
				}
				return node.GetPreviousPrice();
			}
			return Mathf.RoundToInt((float)node.UnlockPrice * node.SalePercentage);
		}

		public static void showAdminGui()
		{
			//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c0: Expected O, but got Unknown
			currentSelection = null;
			location = "showAdminGui";
			swapTwo(purchase: false);
			int currencyAmount = CurrencyManager.Instance.CurrencyAmount;
			currencyText.text = currencyAmount.ToString();
			clearMainViewport();
			ulong myID = StartOfRound.Instance.localPlayerController.actualClientId;
			foreach (PlayerControllerB item in StartOfRound.Instance.allPlayerScripts.OrderBy((PlayerControllerB p) => p.playerUsername))
			{
				if (!item.isPlayerControlled && !item.isPlayerDead)
				{
					continue;
				}
				GameObject val = Object.Instantiate<GameObject>(Plugin.TradePrefab, mainScrollContent);
				Plugin.ApplyFontTo(val);
				Button component = ((Component)val.transform.Find("Button")).GetComponent<Button>();
				((Component)((Component)component).transform.Find("Text (TMP)")).GetComponent<TMP_Text>().text = "Add Points";
				Button component2 = ((Component)val.transform.Find("Button")).GetComponent<Button>();
				TMP_InputField input = ((Component)val.transform.Find("InputField (TMP)")).GetComponent<TMP_InputField>();
				TMP_Text component3 = ((Component)val.transform.Find("InputField (TMP)/DisplayText")).GetComponent<TMP_Text>();
				component3.text = item.playerUsername;
				bool isUpdating = false;
				ulong targetPlayerID = item.actualClientId;
				((UnityEvent<string>)(object)input.onValueChanged).AddListener((UnityAction<string>)delegate(string text)
				{
					if (!isUpdating && !(text == "-") && !string.IsNullOrEmpty(text))
					{
						if (int.TryParse(text, out var result))
						{
							int num = Mathf.Clamp(result, -99, 9999);
							if (num.ToString() != text)
							{
								isUpdating = true;
								input.text = num.ToString();
								isUpdating = false;
							}
						}
						else
						{
							isUpdating = true;
							input.text = "0";
							isUpdating = false;
						}
					}
				});
				((UnityEvent)component.onClick).AddListener((UnityAction)delegate
				{
					//IL_001e: Unknown result type (might be due to invalid IL or missing references)
					//IL_0024: Unknown result type (might be due to invalid IL or missing references)
					CurrencyManager.Instance.TradePlayerCreditsServerRpc(targetPlayerID, int.Parse(input.text), default(ServerRpcParams));
					if (targetPlayerID == myID)
					{
						showAdminGui();
					}
				});
			}
		}

		public static void showTradeGui()
		{
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a3: Expected O, but got Unknown
			currentSelection = null;
			location = "showTradeGui";
			swapTwo(purchase: false);
			int currency = CurrencyManager.Instance.CurrencyAmount;
			currencyText.text = currency.ToString();
			clearMainViewport();
			foreach (PlayerControllerB item in StartOfRound.Instance.allPlayerScripts.OrderBy((PlayerControllerB p) => p.playerUsername))
			{
				if ((Object)(object)StartOfRound.Instance.localPlayerController == (Object)(object)item || (!item.isPlayerControlled && !item.isPlayerDead))
				{
					continue;
				}
				GameObject val = Object.Instantiate<GameObject>(Plugin.TradePrefab, mainScrollContent);
				Plugin.ApplyFontTo(val);
				Button tradeButton = ((Component)val.transform.Find("Button")).GetComponent<Button>();
				TMP_InputField tradeInput = ((Component)val.transform.Find("InputField (TMP)")).GetComponent<TMP_InputField>();
				TMP_Text component = ((Component)val.transform.Find("InputField (TMP)/DisplayText")).GetComponent<TMP_Text>();
				component.text = item.playerUsername;
				bool isUpdating = false;
				((Selectable)tradeButton).interactable = false;
				ulong targetPlayerID = item.actualClientId;
				((UnityEvent<string>)(object)tradeInput.onValueChanged).AddListener((UnityAction<string>)delegate(string text)
				{
					if (!isUpdating)
					{
						if (int.TryParse(text, out var result))
						{
							int num = Mathf.Clamp(result, 0, currency);
							if (num.ToString() != text)
							{
								isUpdating = true;
								tradeInput.text = num.ToString();
								isUpdating = false;
							}
							((Selectable)tradeButton).interactable = num != 0;
						}
						else
						{
							isUpdating = true;
							tradeInput.text = "0";
							isUpdating = false;
						}
					}
				});
				((UnityEvent)tradeButton.onClick).AddListener((UnityAction)delegate
				{
					//IL_0040: Unknown result type (might be due to invalid IL or missing references)
					//IL_0046: Unknown result type (might be due to invalid IL or missing references)
					CurrencyManager instance = CurrencyManager.Instance;
					instance.CurrencyAmount -= int.Parse(tradeInput.text);
					CurrencyManager.Instance.TradePlayerCreditsServerRpc(targetPlayerID, int.Parse(tradeInput.text), default(ServerRpcParams));
					showTradeGui();
				});
			}
		}
	}
	public class MenuController : MonoBehaviour
	{
		private InputAction escAction;

		private void Awake()
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			Plugin.ExtendedLogging("Setting up Escape Action", (LogLevel)16);
			escAction = new InputAction((string)null, (InputActionType)0, "<Keyboard>/escape", (string)null, (string)null, (string)null);
			escAction.performed += delegate
			{
				CloseMenu();
			};
			escAction.Enable();
		}

		public void Reopen()
		{
			InputAction obj = escAction;
			if (obj != null)
			{
				obj.Enable();
			}
		}

		private void OnDestroy()
		{
			Plugin.ExtendedLogging("OnDestroy", (LogLevel)16);
			InputAction obj = escAction;
			if (obj != null)
			{
				obj.Disable();
			}
			InputAction obj2 = escAction;
			if (obj2 != null)
			{
				obj2.Dispose();
			}
		}

		public void CloseMenu()
		{
			Plugin.ExtendedLogging("Closing Menu", (LogLevel)16);
			if ((Object)(object)PurchaseMenu.menu == (Object)null)
			{
				return;
			}
			try
			{
				InputAction obj = escAction;
				if (obj != null)
				{
					obj.Disable();
				}
			}
			catch
			{
			}
			QuickMenuManager val = StartOfRound.Instance?.localPlayerController?.quickMenuManager;
			if ((Object)(object)val != (Object)null && PurchaseMenu._toggledQuickMenuFlag)
			{
				val.isMenuOpen = false;
				PurchaseMenu._toggledQuickMenuFlag = false;
			}
			Cursor.visible = false;
			Cursor.lockState = (CursorLockMode)1;
			if ((Object)(object)PurchaseMenu.fader != (Object)null)
			{
				Plugin.ExtendedLogging("Fader", (LogLevel)16);
				PurchaseMenu.fader.FadeOut();
			}
			else
			{
				Plugin.ExtendedLogging("No Fader found??", (LogLevel)16);
				PurchaseMenu.menu.SetActive(false);
			}
		}
	}
	public class UIFadeEffect : MonoBehaviour
	{
		[CompilerGenerated]
		private sealed class <Fade>d__7 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public float startAlpha;

			public float endAlpha;

			public bool disableAfter;

			public UIFadeEffect <>4__this;

			private float <fadeDuration>5__1;

			private float <time>5__2;

			private float <t>5__3;

			private float <alpha>5__4;

			private List<Graphic>.Enumerator <>s__5;

			private Graphic <g>5__6;

			private Color <c>5__7;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <Fade>d__7(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>s__5 = default(List<Graphic>.Enumerator);
				<g>5__6 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_012c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0131: Unknown result type (might be due to invalid IL or missing references)
				//IL_014e: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>4__this.graphics = new List<Graphic>(((Component)<>4__this).GetComponentsInChildren<Graphic>(true));
					<fadeDuration>5__1 = Plugin.openSpeed.Value;
					<time>5__2 = 0f;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (<time>5__2 < <fadeDuration>5__1)
				{
					<t>5__3 = <time>5__2 / <fadeDuration>5__1;
					<alpha>5__4 = Mathf.Lerp(startAlpha, endAlpha, <t>5__3);
					<>4__this.SetAlpha(<>4__this.graphics, <alpha>5__4);
					<time>5__2 += Time.unscaledDeltaTime;
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				<>s__5 = <>4__this.graphics.GetEnumerator();
				try
				{
					while (<>s__5.MoveNext())
					{
						<g>5__6 = <>s__5.Current;
						if ((Object)(object)<g>5__6 != (Object)null)
						{
							<c>5__7 = <g>5__6.color;
							<c>5__7.a = endAlpha;
							<g>5__6.color = <c>5__7;
						}
						<g>5__6 = null;
					}
				}
				finally
				{
					((IDisposable)<>s__5).Dispose();
				}
				<>s__5 = default(List<Graphic>.Enumerator);
				if (disableAfter && endAlpha == 0f)
				{
					((Component)<>4__this).gameObject.SetActive(false);
					StartOfRound.Instance.localPlayerController.quickMenuManager.isMenuOpen = false;
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <FadeObject>d__3 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public GameObject fadeObj;

			public bool fadeOut;

			public UIFadeEffect <>4__this;

			private List<Graphic> <graphicsToUse>5__1;

			private float <startAlpha>5__2;

			private float <endAlpha>5__3;

			private float <fadeDuration>5__4;

			private float <time>5__5;

			private float <t>5__6;

			private float <alpha>5__7;

			private List<Graphic>.Enumerator <>s__8;

			private Graphic <g>5__9;

			private Color <c>5__10;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <FadeObject>d__3(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<graphicsToUse>5__1 = null;
				<>s__8 = default(List<Graphic>.Enumerator);
				<g>5__9 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_015f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0164: Unknown result type (might be due to invalid IL or missing references)
				//IL_0181: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<graphicsToUse>5__1 = new List<Graphic>(fadeObj.GetComponentsInChildren<Graphic>(true));
					<startAlpha>5__2 = 0f;
					<endAlpha>5__3 = Plugin.transparency.Value;
					if (fadeOut)
					{
						<startAlpha>5__2 = Plugin.transparency.Value;
						<endAlpha>5__3 = 0f;
					}
					<fadeDuration>5__4 = Plugin.openSpeed.Value;
					<time>5__5 = 0f;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (<time>5__5 < <fadeDuration>5__4)
				{
					<t>5__6 = <time>5__5 / <fadeDuration>5__4;
					<alpha>5__7 = Mathf.Lerp(<startAlpha>5__2, <endAlpha>5__3, <t>5__6);
					<>4__this.SetAlpha(<graphicsToUse>5__1, <alpha>5__7);
					<time>5__5 += Time.unscaledDeltaTime;
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				<>s__8 = <graphicsToUse>5__1.GetEnumerator();
				try
				{
					while (<>s__8.MoveNext())
					{
						<g>5__9 = <>s__8.Current;
						if ((Object)(object)<g>5__9 != (Object)null)
						{
							<c>5__10 = <g>5__9.color;
							<c>5__10.a = <endAlpha>5__3;
							<g>5__9.color = <c>5__10;
						}
						<g>5__9 = null;
					}
				}
				finally
				{
					((IDisposable)<>s__8).Dispose();
				}
				<>s__8 = default(List<Graphic>.Enumerator);
				if (fadeOut && <endAlpha>5__3 == 0f)
				{
					fadeObj.SetActive(false);
					StartOfRound.Instance.localPlayerController.quickMenuManager.isMenuOpen = false;
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		public List<Graphic> graphics;

		private void Awake()
		{
			graphics = new List<Graphic>(((Component)this).GetComponentsInChildren<Graphic>(true));
		}

		public void doFade(GameObject target, bool fadeOut)
		{
			((MonoBehaviour)this).StartCoroutine(FadeObject(target, fadeOut));
		}

		[IteratorStateMachine(typeof(<FadeObject>d__3))]
		private IEnumerator FadeObject(GameObject fadeObj, bool fadeOut)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <FadeObject>d__3(0)
			{
				<>4__this = this,
				fadeObj = fadeObj,
				fadeOut = fadeOut
			};
		}

		public void FadeIn()
		{
			((MonoBehaviour)this).StartCoroutine(Fade(0f, Plugin.transparency.Value));
		}

		public void FadeOut(bool disableAfter = true)
		{
			((MonoBehaviour)this).StartCoroutine(Fade(1f, 0f, disableAfter));
		}

		private void SetAlpha(List<Graphic> graphicsToUse, float alpha)
		{
			//IL_0021: 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_0030: Unknown result type (might be due to invalid IL or missing references)
			foreach (Graphic item in graphicsToUse)
			{
				if ((Object)(object)item != (Object)null)
				{
					Color color = item.color;
					color.a = alpha;
					item.color = color;
				}
			}
		}

		[IteratorStateMachine(typeof(<Fade>d__7))]
		private IEnumerator Fade(float startAlpha, float endAlpha, bool disableAfter = false)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <Fade>d__7(0)
			{
				<>4__this = this,
				startAlpha = startAlpha,
				endAlpha = endAlpha,
				disableAfter = disableAfter
			};
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "LGUGui";

		public const string PLUGIN_NAME = "LGUGui";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}
namespace LGUGui.NetcodePatcher
{
	[AttributeUsage(AttributeTargets.Module)]
	internal class NetcodePatchedAssemblyAttribute : Attribute
	{
	}
}