Decompiled source of RepoAdminMenu v1.0.10

RepoAdminMenu.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using ExitGames.Client.Photon;
using HarmonyLib;
using MenuLib;
using MenuLib.MonoBehaviors;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using Photon.Pun;
using Photon.Realtime;
using REPOLib.Extensions;
using REPOLib.Modules;
using RepoAdminMenu.Patches;
using RepoAdminMenu.Utils;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("RepoAdminMenu")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("proferabg")]
[assembly: AssemblyProduct("RepoAdminMenu")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("3ae48784-5268-4c13-9676-09db1348e95e")]
[assembly: AssemblyFileVersion("1.0.10.0")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.10.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
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 RepoAdminMenu
{
	internal class Configuration
	{
		public static ConfigEntry<bool> EnableCommands { get; private set; }

		public static ConfigEntry<bool> EnableHotkey { get; private set; }

		public static ConfigEntry<KeyCode> MenuHotkey { get; private set; }

		public static ConfigEntry<int> MaxUpgradeLevel { get; private set; }

		public static ConfigEntry<bool> ResetSettingsOnLobbyCreation { get; private set; }

		public static ConfigEntry<bool> CloseMenuOnSpawning { get; private set; }

		public static void Init(ConfigFile config)
		{
			EnableCommands = config.Bind<bool>("General", "EnableCommands", true, "Enables RepoAdminMenu commands");
			EnableHotkey = config.Bind<bool>("General", "EnableHotkey", true, "Enables RepoAdminMenu menu");
			MenuHotkey = config.Bind<KeyCode>("General", "MenuHotkey", (KeyCode)289, "Key to open or close the menu");
			MaxUpgradeLevel = config.Bind<int>("General", "MaxUpgrade", 25, "Changes the slider max value for player upgrades");
			ResetSettingsOnLobbyCreation = config.Bind<bool>("General", "ResetSettingsOnLobbyCreation", true, "Should menu settings and player toggles reset on new lobby creation");
			CloseMenuOnSpawning = config.Bind<bool>("General", "CloseMenuOnSpawning", true, "Should the menu close when spawning an enemy");
		}
	}
	internal class Menu
	{
		private static string selectedPlayerId;

		private static REPOPopupPage currentMenu;

		private static string currentMenuStr = "";

		private static Dictionary<string, Action> menus = new Dictionary<string, Action>();

		private static MethodInfo removeAllPagesMethod = AccessTools.Method(typeof(MenuManager), "PageCloseAll", (Type[])null, (Type[])null);

		private static Dictionary<string, Action<string, REPOPopupPage>> menuPreCallbacks = new Dictionary<string, Action<string, REPOPopupPage>>();

		private static Dictionary<string, Action<string, REPOPopupPage>> menuPostCallbacks = new Dictionary<string, Action<string, REPOPopupPage>>();

		public static void Init()
		{
			registerMenu("playerList", openPlayerListMenu);
			registerMenu("player", openPlayerMenu);
			registerMenu("playerUpgrade", openPlayerUpgrades);
			registerMenu("spawn", openSpawnMenu);
			registerMenu("spawnItem", openSpawnItemsMenu);
			registerMenu("spawnEnemy", openSpawnEnemyMenu);
			registerMenu("spawnValuable", openSpawnValuablesMenu);
			registerMenu("spawnValuableTiny", openSpawnValuablesTinyMenu);
			registerMenu("spawnValuableSmall", openSpawnValuablesSmallMenu);
			registerMenu("spawnValuableMedium", openSpawnValuablesMediumMenu);
			registerMenu("spawnValuableBig", openSpawnValuablesBigMenu);
			registerMenu("spawnValuableWide", openSpawnValuablesWideMenu);
			registerMenu("spawnValuableTall", openSpawnValuablesTallMenu);
			registerMenu("spawnValuableVeryTall", openSpawnValuablesVeryTallMenu);
			registerMenu("map", openMapMenu);
			registerMenu("levelSelector", openLevelSelectorMenu);
			registerMenu("settings", openSettingsMenu);
			registerMenu("credits", openCreditsMenu);
			registerMenu("mainmenu", openMainMenu);
		}

		public static void registerMenu(string name, Action openAction)
		{
			menus.Add(name, openAction);
		}

		public static void addMenuPreCallback(string mod_name, Action<string, REPOPopupPage> action)
		{
			menuPreCallbacks.Add(mod_name, action);
		}

		public static void removeMenuPreCallback(string mod_name)
		{
			menuPreCallbacks.Remove(mod_name);
		}

		public static void addMenuPostCallback(string mod_name, Action<string, REPOPopupPage> action)
		{
			menuPostCallbacks.Add(mod_name, action);
		}

		public static void removeMenuPostCallback(string mod_name)
		{
			menuPostCallbacks.Remove(mod_name);
		}

		public static void toggleMenu()
		{
			if (menus.Count < 1)
			{
				Init();
			}
			if (SemiFunc.MenuLevel())
			{
				RepoAdminMenu.mls.LogInfo((object)"Repo Admin Menu can only be opened while in-game!");
				return;
			}
			if (!SemiFunc.IsMasterClientOrSingleplayer())
			{
				RepoAdminMenu.mls.LogInfo((object)"Repo Admin Menu can only be opened in single player or as host in multiplayer!");
				return;
			}
			if ((Object)(object)currentMenu != (Object)null && ((Behaviour)currentMenu).isActiveAndEnabled)
			{
				closePage(currentMenu);
				return;
			}
			RepoAdminMenu.mls.LogInfo((object)"Opening menu");
			menus.GetValueOrDefault(currentMenuStr, openMainMenu)();
		}

		public static void closePage(REPOPopupPage page)
		{
			RepoAdminMenu.mls.LogInfo((object)("Closing: " + ((Object)page.menuPage).name));
			removeAllPagesMethod.Invoke(MenuManager.instance, new object[0]);
			page.ClosePage(true);
			MenuManager.instance.PageRemove(page.menuPage);
			if ((Object)(object)currentMenu == (Object)(object)page)
			{
				currentMenu = null;
			}
		}

		public static void navigate(REPOPopupPage page, string menu)
		{
			closePage(page);
			menus.GetValueOrDefault(menu, delegate
			{
				RepoAdminMenu.mls.LogError((object)("Menu not found: " + menu));
			})();
		}

		public static void openPage(REPOPopupPage page, string name)
		{
			((MonoBehaviour)MenuManager.instance).StartCoroutine(openPageInternal(page, name));
		}

		private static IEnumerator openPageInternal(REPOPopupPage page, string name)
		{
			yield return (object)new WaitForSeconds(0.05f);
			foreach (KeyValuePair<string, Action<string, REPOPopupPage>> menuPostCallback in menuPostCallbacks)
			{
				RepoAdminMenu.mls.LogInfo((object)("Running post-callback for '" + menuPostCallback.Key + "' on menu '" + name + "'"));
				menuPostCallback.Value(name, page);
			}
			RepoAdminMenu.mls.LogInfo((object)("Opening: " + ((Object)page.menuPage).name));
			removeAllPagesMethod.Invoke(MenuManager.instance, new object[0]);
			page.OpenPage(false);
			currentMenu = page;
			currentMenuStr = name;
		}

		public static REPOPopupPage createMenu(string title, string currentMenu, string parentMenu)
		{
			REPOPopupPage val = MenuAPI.CreateREPOPopupPage(title, (PresetSide)0, false, true, 0f);
			foreach (KeyValuePair<string, Action<string, REPOPopupPage>> menuPreCallback in menuPreCallbacks)
			{
				RepoAdminMenu.mls.LogInfo((object)("Running pre-callback for '" + menuPreCallback.Key + "' on menu '" + currentMenu + "'"));
				menuPreCallback.Value(currentMenu, val);
			}
			addBackButton(val, parentMenu);
			return val;
		}

		public static REPOPopupPage createMainMenu(string title)
		{
			REPOPopupPage val = MenuAPI.CreateREPOPopupPage(title, (PresetSide)0, false, true, 0f);
			foreach (KeyValuePair<string, Action<string, REPOPopupPage>> menuPreCallback in menuPreCallbacks)
			{
				RepoAdminMenu.mls.LogInfo((object)("Running pre-callback for '" + menuPreCallback.Key + "' on menu 'mainmenu'"));
				menuPreCallback.Value("mainmenu", val);
			}
			addCloseButton(val);
			return val;
		}

		public static void addButton(REPOPopupPage parent, string text, Action action)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Expected O, but got Unknown
			parent.AddElementToScrollView((ScrollViewBuilderDelegate)((Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOButton(text, action, scrollView, default(Vector2))).rectTransform), 0f, 0f);
		}

		public static void addBackButton(REPOPopupPage parent, string parentMenu)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Expected O, but got Unknown
			parent.AddElement((BuilderDelegate)delegate(Transform transform)
			{
				//IL_002f: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("← Back", (Action)delegate
				{
					closePage(parent);
					menus.GetValueOrDefault(parentMenu, delegate
					{
						RepoAdminMenu.mls.LogError((object)("Menu not found: " + parentMenu));
					})();
				}, transform, new Vector2(250f, 20f));
			});
		}

		public static void addCloseButton(REPOPopupPage parent)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			parent.AddElement((BuilderDelegate)delegate(Transform transform)
			{
				//IL_002f: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("Close", (Action)delegate
				{
					closePage(parent);
				}, transform, new Vector2(270f, 20f));
			});
		}

		public static void addToggle(REPOPopupPage parent, string text, Action<bool> action, bool defaultValue, string[] buttonText = null)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected O, but got Unknown
			parent.AddElementToScrollView((ScrollViewBuilderDelegate)((Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOToggle(text, action, scrollView, Vector2.zero, (buttonText == null || buttonText.Length < 2) ? "Off" : buttonText[0], (buttonText == null || buttonText.Length < 2) ? "On" : buttonText[1], !defaultValue)).rectTransform), 0f, 0f);
		}

		public static void addLabel(REPOPopupPage parent, string text)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			parent.AddElementToScrollView((ScrollViewBuilderDelegate)((Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOLabel(text, scrollView, default(Vector2))).rectTransform), 0f, 0f);
		}

		public static void addIntSlider(REPOPopupPage parent, string text, string description, Action<int> action, int min, int max, int defaultValue)
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Expected O, but got Unknown
			parent.AddElementToScrollView((ScrollViewBuilderDelegate)((Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOSlider(text, description, action, scrollView, Vector2.zero, min, max, defaultValue, "", "", (BarBehavior)0)).rectTransform), 0f, 0f);
		}

		public static void addFloatSlider(REPOPopupPage parent, string text, string description, Action<float> action, float min, float max, int precision, float defaultValue)
		{
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Expected O, but got Unknown
			parent.AddElementToScrollView((ScrollViewBuilderDelegate)((Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOSlider(text, description, action, scrollView, Vector2.zero, min, max, precision, defaultValue, "", "", (BarBehavior)0)).rectTransform), 0f, 0f);
		}

		public static void addStringSlider(REPOPopupPage parent, string text, string description, Action<string> action, string[] options, string defaultValue)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Expected O, but got Unknown
			parent.AddElementToScrollView((ScrollViewBuilderDelegate)((Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOSlider(text, description, action, scrollView, options, defaultValue, Vector2.zero, "", "", (BarBehavior)0)).rectTransform), 0f, 0f);
		}

		public static void openMainMenu()
		{
			REPOPopupPage mainMenu = createMainMenu("R.E.P.O. Admin Menu");
			addButton(mainMenu, "Players", delegate
			{
				navigate(mainMenu, "playerList");
			});
			addButton(mainMenu, "Spawn", delegate
			{
				navigate(mainMenu, "spawn");
			});
			addButton(mainMenu, "Map", delegate
			{
				navigate(mainMenu, "map");
			});
			addButton(mainMenu, "Settings", delegate
			{
				navigate(mainMenu, "settings");
			});
			addButton(mainMenu, "Credits", delegate
			{
				navigate(mainMenu, "credits");
			});
			addButton(mainMenu, "Report a Bug", delegate
			{
				Application.OpenURL("https://github.com/proferabg/RepoAdminMenu/issues");
			});
			openPage(mainMenu, "mainmenu");
		}

		private static void openPlayerListMenu()
		{
			REPOPopupPage playersMenu = createMenu("R.A.M. - Players", "playerList", "mainmenu");
			foreach (PlayerAvatar player in SemiFunc.PlayerGetAll())
			{
				addButton(playersMenu, SemiFunc.PlayerGetName(player), delegate
				{
					selectedPlayerId = SemiFunc.PlayerGetSteamID(player);
					navigate(playersMenu, "player");
				});
			}
			openPage(playersMenu, "playerList");
		}

		private static void openPlayerMenu()
		{
			if (selectedPlayerId == null || (Object)(object)SemiFunc.PlayerGetFromSteamID(selectedPlayerId) == (Object)null)
			{
				RepoAdminMenu.mls.LogInfo((object)"No player selected");
				openPlayerListMenu();
				return;
			}
			PlayerAvatar avatar = SemiFunc.PlayerGetFromSteamID(selectedPlayerId);
			REPOPopupPage playerMenu = createMenu("R.A.M. - " + SemiFunc.PlayerGetName(avatar), "player", "playerList");
			addToggle(playerMenu, "God Mode", delegate(bool b)
			{
				Settings.toggle(Settings.instance.godModePlayers, avatar.steamID, b);
			}, Settings.isGod(avatar));
			addToggle(playerMenu, "No Death", delegate(bool b)
			{
				Settings.toggle(Settings.instance.noDeathPlayers, avatar.steamID, b);
			}, Settings.isNoDeath(avatar));
			addToggle(playerMenu, "No Target", delegate(bool b)
			{
				Settings.toggle(Settings.instance.noTargetPlayers, avatar.steamID, b);
			}, Settings.isNoTarget(avatar));
			addToggle(playerMenu, "No Tumble", delegate(bool b)
			{
				Settings.toggle(Settings.instance.noTumblePlayers, avatar.steamID, b);
			}, Settings.isNoTumble(avatar));
			addToggle(playerMenu, "Infinite Stamina", delegate(bool b)
			{
				Settings.toggle(Settings.instance.infiniteStaminaPlayers, avatar.steamID, b);
			}, Settings.isInfiniteStamina(avatar));
			addToggle(playerMenu, "Force Tumble", delegate(bool b)
			{
				Settings.toggleDictLong(Settings.instance.forcedTumble, avatar.steamID, b);
			}, Settings.isForceTumble(avatar));
			addButton(playerMenu, "Upgrades", delegate
			{
				navigate(playerMenu, "playerUpgrade");
			});
			addButton(playerMenu, "Heal", delegate
			{
				PlayerUtil.healPlayer(avatar);
			});
			addButton(playerMenu, "Kill", delegate
			{
				PlayerUtil.killPlayer(avatar);
			});
			addButton(playerMenu, "Revive", delegate
			{
				PlayerUtil.revivePlayer(avatar);
			});
			addButton(playerMenu, "Teleport To", delegate
			{
				PlayerUtil.teleportTo(avatar);
			});
			addButton(playerMenu, "Summon", delegate
			{
				PlayerUtil.summon(avatar);
			});
			addButton(playerMenu, "Give Crown", delegate
			{
				PlayerUtil.giveCrown(avatar);
			});
			addButton(playerMenu, "Kick Player", delegate
			{
				closePage(playerMenu);
				openConfirmMenu("player", "Kick: " + SemiFunc.PlayerGetName(avatar), new Dictionary<string, Action>
				{
					{
						"Yes",
						delegate
						{
							PlayerUtil.KickPlayer(avatar);
						}
					},
					{ "No", null }
				});
			});
			openPage(playerMenu, "player");
		}

		private static void openPlayerUpgrades()
		{
			if (selectedPlayerId == null || (Object)(object)SemiFunc.PlayerGetFromSteamID(selectedPlayerId) == (Object)null)
			{
				RepoAdminMenu.mls.LogInfo((object)"No player selected");
				openPlayerListMenu();
				return;
			}
			PlayerAvatar avatar = SemiFunc.PlayerGetFromSteamID(selectedPlayerId);
			REPOPopupPage obj = createMenu("R.A.M. - " + SemiFunc.PlayerGetName(avatar) + " - Upgrades", "playerUpgrade", "player");
			addIntSlider(obj, "Health", "", delegate(int v)
			{
				PlayerUtil.upgradeHealth(avatar, v);
			}, 0, Configuration.MaxUpgradeLevel.Value, PlayerUtil.getUpgradeLevel("health", avatar));
			addIntSlider(obj, "Jump", "", delegate(int v)
			{
				PlayerUtil.upgradeJump(avatar, v);
			}, 0, Configuration.MaxUpgradeLevel.Value, PlayerUtil.getUpgradeLevel("jump", avatar));
			addIntSlider(obj, "Launch", "", delegate(int v)
			{
				PlayerUtil.upgradeLaunch(avatar, v);
			}, 0, Configuration.MaxUpgradeLevel.Value, PlayerUtil.getUpgradeLevel("launch", avatar));
			addIntSlider(obj, "Map Player Count", "", delegate(int v)
			{
				PlayerUtil.upgradeMapPlayerCount(avatar, v);
			}, 0, Configuration.MaxUpgradeLevel.Value, PlayerUtil.getUpgradeLevel("playercount", avatar));
			addIntSlider(obj, "Range", "", delegate(int v)
			{
				PlayerUtil.upgradeRange(avatar, v);
			}, 0, Configuration.MaxUpgradeLevel.Value, PlayerUtil.getUpgradeLevel("range", avatar));
			addIntSlider(obj, "Speed", "", delegate(int v)
			{
				PlayerUtil.upgradeSpeed(avatar, v);
			}, 0, Configuration.MaxUpgradeLevel.Value, PlayerUtil.getUpgradeLevel("speed", avatar));
			addIntSlider(obj, "Stamina", "", delegate(int v)
			{
				PlayerUtil.upgradeStamina(avatar, v);
			}, 0, Configuration.MaxUpgradeLevel.Value, PlayerUtil.getUpgradeLevel("stamina", avatar));
			addIntSlider(obj, "Strength", "", delegate(int v)
			{
				PlayerUtil.upgradeStrength(avatar, v);
			}, 0, Configuration.MaxUpgradeLevel.Value, PlayerUtil.getUpgradeLevel("strength", avatar));
			addIntSlider(obj, "Throw", "", delegate(int v)
			{
				PlayerUtil.upgradeThrow(avatar, v);
			}, 0, Configuration.MaxUpgradeLevel.Value, PlayerUtil.getUpgradeLevel("throw", avatar));
			openPage(obj, "playerUpgrade");
		}

		private static void openSpawnMenu()
		{
			REPOPopupPage spawnerMenu = createMenu("R.A.M. - Spawn", "spawn", "mainmenu");
			addButton(spawnerMenu, "Items", delegate
			{
				navigate(spawnerMenu, "spawnItem");
			});
			addButton(spawnerMenu, "Valuables", delegate
			{
				navigate(spawnerMenu, "spawnValuable");
			});
			addButton(spawnerMenu, "Enemies", delegate
			{
				navigate(spawnerMenu, "spawnEnemy");
			});
			openPage(spawnerMenu, "spawn");
		}

		private static void openSpawnItemsMenu()
		{
			REPOPopupPage val = createMenu("R.A.M. - Spawn - Items", "spawnItem", "spawn");
			foreach (KeyValuePair<string, Item> entry in ItemUtil.getItems())
			{
				addButton(val, entry.Key, delegate
				{
					ItemUtil.spawnItem(entry.Value);
				});
			}
			openPage(val, "spawnItem");
		}

		private static void openSpawnValuablesMenu()
		{
			REPOPopupPage valuablesMenu = createMenu("R.A.M. - Spawn - Valuables", "spawnValuable", "spawn");
			addButton(valuablesMenu, "Tiny", delegate
			{
				navigate(valuablesMenu, "spawnValuableTiny");
			});
			addButton(valuablesMenu, "Small", delegate
			{
				navigate(valuablesMenu, "spawnValuableSmall");
			});
			addButton(valuablesMenu, "Medium", delegate
			{
				navigate(valuablesMenu, "spawnValuableMedium");
			});
			addButton(valuablesMenu, "Big", delegate
			{
				navigate(valuablesMenu, "spawnValuableBig");
			});
			addButton(valuablesMenu, "Wide", delegate
			{
				navigate(valuablesMenu, "spawnValuableWide");
			});
			addButton(valuablesMenu, "Tall", delegate
			{
				navigate(valuablesMenu, "spawnValuableTall");
			});
			addButton(valuablesMenu, "Very Tall", delegate
			{
				navigate(valuablesMenu, "spawnValuableVeryTall");
			});
			openPage(valuablesMenu, "spawnValuable");
		}

		private static void openSpawnValuablesTinyMenu()
		{
			REPOPopupPage val = createMenu("R.A.M. - Tiny Valuables", "spawnValuableTiny", "spawnValuable");
			foreach (KeyValuePair<string, GameObject> entry in ValuableUtil.getTinyValuables())
			{
				addButton(val, entry.Key, delegate
				{
					ValuableUtil.spawnValuable(entry.Value);
				});
			}
			openPage(val, "spawnValuableTiny");
		}

		private static void openSpawnValuablesSmallMenu()
		{
			REPOPopupPage val = createMenu("R.A.M. - Small Valuables", "spawnValuableSmall", "spawnValuable");
			foreach (KeyValuePair<string, GameObject> entry in ValuableUtil.getSmallValuables())
			{
				addButton(val, entry.Key, delegate
				{
					ValuableUtil.spawnValuable(entry.Value);
				});
			}
			openPage(val, "spawnValuableSmall");
		}

		private static void openSpawnValuablesMediumMenu()
		{
			REPOPopupPage val = createMenu("R.A.M. - Medium Valuables", "spawnValuableMedium", "spawnValuable");
			foreach (KeyValuePair<string, GameObject> entry in ValuableUtil.getMediumValuables())
			{
				addButton(val, entry.Key, delegate
				{
					ValuableUtil.spawnValuable(entry.Value);
				});
			}
			openPage(val, "spawnValuableMedium");
		}

		private static void openSpawnValuablesBigMenu()
		{
			REPOPopupPage val = createMenu("R.A.M. - Big Valuables", "spawnValuableBig", "spawnValuable");
			foreach (KeyValuePair<string, GameObject> entry in ValuableUtil.getBigValuables())
			{
				addButton(val, entry.Key, delegate
				{
					ValuableUtil.spawnValuable(entry.Value);
				});
			}
			openPage(val, "spawnValuableBig");
		}

		private static void openSpawnValuablesWideMenu()
		{
			REPOPopupPage val = createMenu("R.A.M. - Wide Valuables", "spawnValuableWide", "spawnValuable");
			foreach (KeyValuePair<string, GameObject> entry in ValuableUtil.getWideValuables())
			{
				addButton(val, entry.Key, delegate
				{
					ValuableUtil.spawnValuable(entry.Value);
				});
			}
			openPage(val, "spawnValuableWide");
		}

		private static void openSpawnValuablesTallMenu()
		{
			REPOPopupPage val = createMenu("R.A.M. - Tall Valuables", "spawnValuableTall", "spawnValuable");
			foreach (KeyValuePair<string, GameObject> entry in ValuableUtil.getTallValuables())
			{
				addButton(val, entry.Key, delegate
				{
					ValuableUtil.spawnValuable(entry.Value);
				});
			}
			openPage(val, "spawnValuableTall");
		}

		private static void openSpawnValuablesVeryTallMenu()
		{
			REPOPopupPage val = createMenu("R.A.M. - Very Tall Valuables", "spawnValuableVeryTall", "spawnValuable");
			foreach (KeyValuePair<string, GameObject> entry in ValuableUtil.getVeryTallValuables())
			{
				addButton(val, entry.Key, delegate
				{
					ValuableUtil.spawnValuable(entry.Value);
				});
			}
			openPage(val, "spawnValuableVeryTall");
		}

		private static void openSpawnEnemyMenu()
		{
			REPOPopupPage val = createMenu("R.A.M. - Spawn - Enemies", "spawnEnemy", "spawn");
			foreach (string enemy in EnemyUtil.getEnemies().Keys)
			{
				addButton(val, enemy, delegate
				{
					EnemyUtil.spawnEnemy(enemy);
				});
			}
			foreach (string enemy2 in EnemyUtil.getModEnemies().Keys)
			{
				addButton(val, "(Mod) " + enemy2, delegate
				{
					EnemyUtil.spawnEnemy(enemy2);
				});
			}
			openPage(val, "spawnEnemy");
		}

		private static void openMapMenu()
		{
			REPOPopupPage mapMenu = createMenu("R.A.M. - Map Settings", "map", "mainmenu");
			foreach (KeyValuePair<string, Level> entry in MapUtil.getMaps())
			{
				addToggle(mapMenu, entry.Key, delegate(bool b)
				{
					MapUtil.setMapEnabled(entry.Value, b);
				}, MapUtil.isMapEnabled(entry.Value));
			}
			addIntSlider(mapMenu, "Current Level", "", delegate(int v)
			{
				RunManager.instance.levelsCompleted = v;
			}, 1, 500, RunManager.instance.levelsCompleted);
			addIntSlider(mapMenu, "Money", "", delegate(int v)
			{
				PunManager.instance.SetRunStatSet("currency", v);
			}, 0, 9999, StatsManager.instance.runStats["currency"]);
			addButton(mapMenu, "Map Selector", delegate
			{
				navigate(mapMenu, "levelSelector");
			});
			addButton(mapMenu, "Discover Extraction Point", ExtractionPointUtil.discoverNext);
			addButton(mapMenu, "Complete Extraction Point", ExtractionPointUtil.complete);
			openPage(mapMenu, "map");
		}

		private static void openLevelSelectorMenu()
		{
			REPOPopupPage val = createMenu("R.A.M. - Map Selector", "levelSelector", "map");
			foreach (KeyValuePair<string, Level> entry in MapUtil.getMaps())
			{
				addButton(val, entry.Key, delegate
				{
					MapUtil.changeLevel(entry.Value);
				});
			}
			addButton(val, "Arena", delegate
			{
				MapUtil.changeLevel(RunManager.instance.levelArena);
			});
			addButton(val, "Lobby", delegate
			{
				MapUtil.changeLevel(RunManager.instance.levelLobby);
			});
			addButton(val, "Shop", delegate
			{
				MapUtil.changeLevel(RunManager.instance.levelShop);
			});
			openPage(val, "levelSelector");
		}

		private static void openSettingsMenu()
		{
			REPOPopupPage obj = createMenu("R.A.M. - Settings", "settings", "mainmenu");
			addToggle(obj, "Infinite Money", delegate(bool b)
			{
				Settings.UpdateOption(ref Settings.instance.infiniteMoney, !b);
				Settings.UpdateClients();
			}, Settings.instance.infiniteMoney);
			addToggle(obj, "No Break", delegate(bool b)
			{
				Settings.UpdateOption(ref Settings.instance.noBreak, !b);
			}, Settings.instance.noBreak);
			addToggle(obj, "No Battery/Ammo Drain", delegate(bool b)
			{
				Settings.UpdateOption(ref Settings.instance.noBatteryDrain, !b);
			}, Settings.instance.noBatteryDrain);
			addToggle(obj, "No Traps", delegate(bool b)
			{
				Settings.UpdateOption(ref Settings.instance.noTraps, !b);
			}, Settings.instance.noTraps);
			addToggle(obj, "Weak Enemies", delegate(bool b)
			{
				Settings.UpdateOption(ref Settings.instance.weakEnemies, !b);
			}, Settings.instance.weakEnemies);
			addToggle(obj, "Deaf Enemies", delegate(bool b)
			{
				Settings.UpdateOption(ref Settings.instance.deafEnemies, !b);
			}, Settings.instance.deafEnemies);
			addToggle(obj, "Blind Enemies", delegate(bool b)
			{
				Settings.UpdateOption(ref Settings.instance.blindEnemies, !b);
			}, Settings.instance.blindEnemies);
			addToggle(obj, "Boom Hammer", delegate(bool b)
			{
				Settings.UpdateOption(ref Settings.instance.boomhammer, !b);
			}, Settings.instance.boomhammer);
			addToggle(obj, "Friendly Duck", delegate(bool b)
			{
				Settings.UpdateOption(ref Settings.instance.friendlyDuck, !b);
			}, Settings.instance.friendlyDuck);
			addToggle(obj, "Upgrade In Shop", delegate(bool b)
			{
				Settings.UpdateOption(ref Settings.instance.useShopUpgrades, !b);
			}, Settings.instance.useShopUpgrades);
			openPage(obj, "settings");
		}

		private static void openCreditsMenu()
		{
			REPOPopupPage obj = createMenu("R.A.M. - Credits", "credits", "mainmenu");
			addLabel(obj, "Repo Admin Menu by");
			addLabel(obj, "  proferabg  ");
			addLabel(obj, "");
			addLabel(obj, "Special thanks to:");
			addLabel(obj, " - REPOrium_Team");
			addLabel(obj, " - nickklmao");
			addLabel(obj, " - Godji");
			addLabel(obj, " - Zehs");
			addLabel(obj, "");
			addLabel(obj, "Repo Admin Menu © 2025");
			openPage(obj, "credits");
		}

		private static void openConfirmMenu(string currentMenu, string message, Dictionary<string, Action> options)
		{
			REPOPopupPage confirmMenu = createMenu("R.A.M. - Confirm", "confirm", "player");
			confirmMenu.closeMenuOnEscape = false;
			addLabel(confirmMenu, message);
			addLabel(confirmMenu, "");
			foreach (KeyValuePair<string, Action> option in options)
			{
				addButton(confirmMenu, option.Key, delegate
				{
					if (option.Value != null)
					{
						option.Value();
					}
					navigate(confirmMenu, currentMenu);
				});
			}
			openPage(confirmMenu, "confirm");
		}

		public static string getSelectedPlayer()
		{
			return selectedPlayerId;
		}
	}
	[HarmonyPatch(typeof(ChatManager))]
	internal class ChatManagerPatch
	{
		[HarmonyPatch("MessageSend")]
		[HarmonyPrefix]
		private static bool MessageSend_Prefix(ChatManager __instance, ref string ___chatMessage)
		{
			if (!Configuration.EnableCommands.Value || !SemiFunc.IsMasterClientOrSingleplayer())
			{
				return true;
			}
			if (___chatMessage.Replace("<b>|</b>", string.Empty).ToLower().Split(' ')[0] == "!menu")
			{
				Menu.toggleMenu();
				return false;
			}
			return true;
		}
	}
	[BepInPlugin("proferabg.REPO.RepoAdminMenu", "Repo Admin Menu", "1.0.10")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class RepoAdminMenu : BaseUnityPlugin
	{
		private const string mod_guid = "proferabg.REPO.RepoAdminMenu";

		private const string mod_name = "Repo Admin Menu";

		private const string mod_version = "1.0.10";

		private static RepoAdminMenu _plugin;

		public static Harmony harmony = new Harmony("proferabg.REPO.RepoAdminMenu");

		public static ManualLogSource mls;

		public void Awake()
		{
			if ((Object)(object)_plugin == (Object)null)
			{
				_plugin = this;
			}
			mls = Logger.CreateLogSource("Repo Admin Menu");
			Configuration.Init(((BaseUnityPlugin)this).Config);
			Settings.Init();
			harmony.PatchAll();
			mls.LogInfo((object)"R.A.M. (1.0.10) has been allocated!");
		}
	}
	internal class Settings
	{
		internal static Settings instance;

		public bool infiniteMoney;

		public bool noBreak;

		public bool noBatteryDrain;

		public bool noTraps;

		public bool weakEnemies;

		public bool deafEnemies;

		public bool blindEnemies;

		public bool boomhammer;

		public bool friendlyDuck;

		public bool useShopUpgrades;

		public List<string> godModePlayers = new List<string>();

		public List<string> noDeathPlayers = new List<string>();

		public List<string> infiniteStaminaPlayers = new List<string>();

		public List<string> noTargetPlayers = new List<string>();

		public List<string> noTumblePlayers = new List<string>();

		public Dictionary<string, long> forcedTumble = new Dictionary<string, long>();

		public Settings()
		{
			instance = this;
		}

		public static void Init()
		{
			if (instance == null)
			{
				new Settings();
			}
		}

		public static void toggle(List<string> list, string steamId, bool value)
		{
			if (value)
			{
				list.Remove(steamId);
			}
			else
			{
				list.Add(steamId);
			}
			UpdateClients();
		}

		public static void toggleDictLong(Dictionary<string, long> list, string steamId, bool value)
		{
			if (value)
			{
				list.Remove(steamId);
			}
			else
			{
				list.Add(steamId, 0L);
			}
			UpdateClients();
		}

		public static bool isGod(PlayerAvatar avatar)
		{
			return instance.godModePlayers.Contains(SemiFunc.PlayerGetSteamID(avatar));
		}

		public static bool isNoDeath(PlayerAvatar avatar)
		{
			return instance.noDeathPlayers.Contains(SemiFunc.PlayerGetSteamID(avatar));
		}

		public static bool isInfiniteStamina(PlayerAvatar avatar)
		{
			return instance.infiniteStaminaPlayers.Contains(SemiFunc.PlayerGetSteamID(avatar));
		}

		public static bool isNoTarget(PlayerAvatar avatar)
		{
			return instance.noTargetPlayers.Contains(SemiFunc.PlayerGetSteamID(avatar));
		}

		public static bool isNoTumble(PlayerAvatar avatar)
		{
			return instance.noTumblePlayers.Contains(SemiFunc.PlayerGetSteamID(avatar));
		}

		public static bool isForceTumble(PlayerAvatar avatar)
		{
			return instance.forcedTumble.ContainsKey(SemiFunc.PlayerGetSteamID(avatar));
		}

		internal static long getLastForceTumble(PlayerAvatar avatar)
		{
			return instance.forcedTumble.GetValueOrDefault(SemiFunc.PlayerGetSteamID(avatar), 0L);
		}

		internal static long setLastForceTumble(PlayerAvatar avatar, long lastTumble)
		{
			return instance.forcedTumble[SemiFunc.PlayerGetSteamID(avatar)] = lastTumble;
		}

		public static void UpdateOption(ref bool option, bool value)
		{
			option = value;
			UpdateClients();
		}

		public static void UpdateClients()
		{
			if (SemiFunc.IsMasterClient())
			{
				RepoAdminMenu.mls.LogInfo((object)"Sending Settings Sync");
				NetworkUtil.SendCommandString("SettingsSync", instance.toJson(), (ReceiverGroup)0);
			}
		}

		public string toJson()
		{
			return JsonConvert.SerializeObject((object)this);
		}

		public static void loadFromJson(string json)
		{
			instance = JsonConvert.DeserializeObject<Settings>(json);
		}

		internal void log()
		{
			RepoAdminMenu.mls.LogInfo((object)("\n\n\n" + instance.toJson() + "\n\n\n"));
			RepoAdminMenu.mls.LogInfo((object)("Current Settings:\n  infiniteMoney - " + instance.infiniteMoney + "\n  noBreak - " + instance.noBreak + "\n  noBatteryDrain - " + instance.noBatteryDrain + "\n  noTraps - " + instance.noTraps + "\n  weakEnemies - " + instance.weakEnemies + "\n  deafEnemies - " + instance.deafEnemies + "\n  blindEnemies - " + instance.blindEnemies + "\n  boomhammer - " + instance.boomhammer + "\n  friendlyDuck - " + instance.friendlyDuck + "\n  useShopUpgrades - " + instance.useShopUpgrades + "\n  godMode: - " + string.Join(",", instance.godModePlayers.Select((string player) => SemiFunc.PlayerGetName(SemiFunc.PlayerGetFromSteamID(player)))) + "\n  noDeathPlayers: - " + string.Join(",", instance.noDeathPlayers.Select((string player) => SemiFunc.PlayerGetName(SemiFunc.PlayerGetFromSteamID(player)))) + "\n  infiniteStaminaPlayers: - " + string.Join(",", instance.infiniteStaminaPlayers.Select((string player) => SemiFunc.PlayerGetName(SemiFunc.PlayerGetFromSteamID(player)))) + "\n  noTargetPlayers: - " + string.Join(",", instance.noTargetPlayers.Select((string player) => SemiFunc.PlayerGetName(SemiFunc.PlayerGetFromSteamID(player)))) + "\n  noTumblePlayers: - " + string.Join(",", instance.noTumblePlayers.Select((string player) => SemiFunc.PlayerGetName(SemiFunc.PlayerGetFromSteamID(player)))) + "\n"));
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "RepoAdminMenu";

		public const string PLUGIN_NAME = "RepoAdminMenu";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace RepoAdminMenu.Utils
{
	internal class EnemyUtil
	{
		private static SortedDictionary<string, EnemySetup> enemySetups = new SortedDictionary<string, EnemySetup>();

		private static SortedDictionary<string, EnemySetup> modEnemySetups = new SortedDictionary<string, EnemySetup>();

		public static void Init()
		{
			enemySetups.Clear();
			modEnemySetups.Clear();
			List<EnemySetup> list = new List<EnemySetup>();
			list.AddRange(EnemyDirector.instance.enemiesDifficulty1);
			list.AddRange(EnemyDirector.instance.enemiesDifficulty2);
			list.AddRange(EnemyDirector.instance.enemiesDifficulty3);
			foreach (EnemySetup item in list)
			{
				if (!((Object)item).name.StartsWith("Enemy Group"))
				{
					string text = ((Object)item).name.Replace("Enemy - ", string.Empty);
					switch (text)
					{
					case "Ceiling Eye":
						addEnemySetupSafe("Peeper", item);
						break;
					case "Thin Man":
						addEnemySetupSafe("Shadow Child", item);
						break;
					case "Gnome":
						addEnemySetupSafe("Gnome", item);
						break;
					case "Duck":
						addEnemySetupSafe("Apex Predator", item);
						break;
					case "Slow Mouth":
						addEnemySetupSafe("Spewer", item);
						break;
					case "Valuable Thrower":
						addEnemySetupSafe("Rugrat", item);
						break;
					case "Animal":
						addEnemySetupSafe("Animal", item);
						break;
					case "Upscream":
						addEnemySetupSafe("Upscream", item);
						break;
					case "Hidden":
						addEnemySetupSafe("Hidden", item);
						break;
					case "Tumbler":
						addEnemySetupSafe("Chef", item);
						break;
					case "Bowtie":
						addEnemySetupSafe("Bowtie", item);
						break;
					case "Floater":
						addEnemySetupSafe("Mentalist", item);
						break;
					case "Bang":
						addEnemySetupSafe("Bang", item);
						break;
					case "Head":
						addEnemySetupSafe("Headman", item);
						break;
					case "Robe":
						addEnemySetupSafe("Robe", item);
						break;
					case "Hunter":
						addEnemySetupSafe("Huntsman", item);
						break;
					case "Runner":
						addEnemySetupSafe("Reaper", item);
						break;
					case "Beamer":
						addEnemySetupSafe("Clown", item);
						break;
					case "Slow Walker":
						addEnemySetupSafe("Trudge", item);
						break;
					default:
						addModEnemySetupSafe(text, item);
						break;
					}
				}
			}
		}

		internal static void addEnemySetupSafe(string name, EnemySetup setup)
		{
			if (!enemySetups.ContainsKey(name))
			{
				enemySetups.Add(name, setup);
			}
		}

		internal static void addModEnemySetupSafe(string name, EnemySetup setup)
		{
			if (!modEnemySetups.ContainsKey(name))
			{
				modEnemySetups.Add(name, setup);
			}
		}

		public static SortedDictionary<string, EnemySetup> getEnemies()
		{
			return enemySetups;
		}

		public static SortedDictionary<string, EnemySetup> getModEnemies()
		{
			return modEnemySetups;
		}

		private static EnemySetup getEnemySetup(string name)
		{
			EnemySetup valueOrDefault = enemySetups.GetValueOrDefault(name, null);
			if ((Object)(object)valueOrDefault == (Object)null)
			{
				valueOrDefault = modEnemySetups.GetValueOrDefault(name, null);
			}
			return valueOrDefault;
		}

		public static void spawnEnemy(string enemy)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			if (EnemyParentPatch.spawning)
			{
				MissionUI.instance.MissionText("Already spawning enemy '" + enemy + "'!", Color.red, Color.red, 3f);
				return;
			}
			EnemySetup enemySetup = getEnemySetup(enemy);
			if ((Object)(object)enemySetup != (Object)null)
			{
				Vector3 position = ((Component)PlayerAvatar.instance).transform.position;
				((MonoBehaviour)EnemyDirector.instance).StartCoroutine(SpawnEnemy(enemySetup, position));
				if (Configuration.CloseMenuOnSpawning.Value)
				{
					Menu.toggleMenu();
				}
				MissionUI.instance.MissionText("Spawning '" + enemy + "'. Run...!", Color.red, Color.red, 3f);
			}
			else
			{
				MissionUI.instance.MissionText("Could not find enemy named '" + enemy + "'", Color.red, Color.red, 3f);
			}
		}

		private static IEnumerator SpawnEnemy(EnemySetup enemySetup, Vector3 position)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			yield return (object)new WaitForSeconds(3f);
			if (SemiFunc.IsMultiplayer())
			{
				Enemies.SpawnEnemy(enemySetup, position, Quaternion.identity, false);
				yield break;
			}
			EnemyParentPatch.spawning = true;
			LevelGenerator.Instance.EnemiesSpawned = -1;
			GameObject val = Object.Instantiate<GameObject>(enemySetup.spawnObjects[0], position, Quaternion.identity);
			EnemyParent component = val.GetComponent<EnemyParent>();
			if (!((Object)(object)component != (Object)null))
			{
				yield break;
			}
			component.SetupDone = true;
			val.GetComponentInChildren<Enemy>().EnemyTeleported(position);
			EnemyDirector.instance.FirstSpawnPointAdd(component);
			EnemyDirector.instance.enemiesSpawned.Add(component);
			foreach (PlayerAvatar item in SemiFunc.PlayerGetAll())
			{
				component.Enemy.PlayerAdded(item.photonView.ViewID);
			}
		}
	}
	internal class ExtractionPointUtil
	{
		public static void discoverNext()
		{
			if (RoundDirector.instance.extractionPointActive)
			{
				return;
			}
			foreach (GameObject extractionPoint in RoundDirector.instance.extractionPointList)
			{
				ExtractionPoint component = extractionPoint.GetComponent<ExtractionPoint>();
				if ((Object)(object)component != (Object)null && component.StateIs((State)1))
				{
					component.OnClick();
				}
			}
		}

		public static void complete()
		{
			if (RoundDirector.instance.extractionPointActive)
			{
				RoundDirector.instance.extractionPointCurrent.isCompletedRightAway = true;
				RoundDirector.instance.extractionPointCurrent.StateSet((State)6);
			}
		}
	}
	internal class ItemUtil
	{
		private static SortedDictionary<string, Item> items = new SortedDictionary<string, Item>();

		public static void Init()
		{
			items.Clear();
			foreach (Item item in StatsManagerExtensions.GetItems(StatsManager.instance))
			{
				string key = ((Object)item).name.Replace("Item ", string.Empty);
				if (!items.ContainsKey(key))
				{
					items.Add(key, item);
				}
			}
		}

		public static SortedDictionary<string, Item> getItems()
		{
			return items;
		}

		public static void spawnItem(Item item)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: 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)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = ((Component)PlayerAvatar.instance).transform.position + new Vector3(0f, 1f, 0f) + ((Component)PlayerAvatar.instance).transform.forward * 1f;
			GameObject val2 = ((!SemiFunc.IsMultiplayer()) ? Object.Instantiate<GameObject>(item.prefab, val, Quaternion.identity) : Items.SpawnItem(item, val, Quaternion.identity));
			ItemBattery componentInParent = val2.GetComponentInParent<ItemBattery>();
			if (Object.op_Implicit((Object)(object)componentInParent) && componentInParent.batteryLifeInt < 6)
			{
				componentInParent.SetBatteryLife(100);
			}
		}
	}
	internal class MapUtil
	{
		private static SortedDictionary<string, Level> maps = new SortedDictionary<string, Level>();

		private static Dictionary<Level, bool> mapToggles = new Dictionary<Level, bool>();

		private static Level nextLevel = null;

		public static void Init()
		{
			if (maps.Count > 0)
			{
				return;
			}
			foreach (Level level in RunManager.instance.levels)
			{
				maps.Add(((Object)level).name.Replace("Level - ", string.Empty), level);
				mapToggles.Add(level, value: true);
			}
		}

		public static SortedDictionary<string, Level> getMaps()
		{
			return maps;
		}

		public static Dictionary<Level, bool> getMapToggles()
		{
			return mapToggles;
		}

		public static void setMapEnabled(Level level, bool enabled)
		{
			if (mapToggles.ContainsKey(level))
			{
				mapToggles[level] = enabled;
			}
		}

		public static bool isMapEnabled(Level level)
		{
			return mapToggles.GetValueOrDefault(level, defaultValue: false);
		}

		public static int getEnabledCount()
		{
			int num = 0;
			foreach (bool value in mapToggles.Values)
			{
				if (value)
				{
					num++;
				}
			}
			return num;
		}

		public static void changeLevel(Level level)
		{
			nextLevel = level;
			RunManager.instance.ChangeLevel(true, false, (ChangeLevelType)1);
		}

		public static Level getNextLevel()
		{
			return nextLevel;
		}

		public static void clearNextLevel()
		{
			nextLevel = null;
		}

		public static void resetLevels()
		{
			foreach (KeyValuePair<Level, bool> mapToggle in mapToggles)
			{
				if (!isMapEnabled(mapToggle.Key))
				{
					if (RunManager.instance.levels.Contains(mapToggle.Key))
					{
						RunManager.instance.levels.Remove(mapToggle.Key);
					}
				}
				else if (!RunManager.instance.levels.Contains(mapToggle.Key))
				{
					RunManager.instance.levels.Add(mapToggle.Key);
				}
			}
		}
	}
	internal class NetworkUtil : IOnEventCallback
	{
		internal bool registered;

		internal string clientRandomString = string.Empty;

		private static Random random = new Random();

		internal const byte RAMEventCode = 180;

		internal static NetworkUtil instance { get; private set; } = null;


		public NetworkUtil()
		{
			instance = this;
			if (!registered)
			{
				RepoAdminMenu.mls.LogInfo((object)"Registering network event callbacks");
				PhotonNetwork.AddCallbackTarget((object)this);
				registered = true;
			}
		}

		public static void Init()
		{
			if (instance == null)
			{
				new NetworkUtil();
			}
		}

		private static string randomString(int length)
		{
			return new string((from s in Enumerable.Repeat("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%", length)
				select s[random.Next(s.Length)]).ToArray());
		}

		internal static void SendCommandSteamIDString(string command, string steamId, string value, ReceiverGroup receiverGroup)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			PhotonNetwork.RaiseEvent((byte)180, (object)new object[3] { command, steamId, value }, new RaiseEventOptions
			{
				Receivers = receiverGroup
			}, SendOptions.SendReliable);
		}

		internal static void SendCommandString(string command, string value, ReceiverGroup receiverGroup)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: 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_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			PhotonNetwork.RaiseEvent((byte)180, (object)new object[2] { command, value }, new RaiseEventOptions
			{
				Receivers = receiverGroup
			}, SendOptions.SendReliable);
		}

		internal static void SendCommand(string command, ReceiverGroup receiverGroup)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected O, but got Unknown
			PhotonNetwork.RaiseEvent((byte)180, (object)new object[1] { command }, new RaiseEventOptions
			{
				Receivers = receiverGroup
			}, SendOptions.SendReliable);
		}

		public void OnEvent(EventData photonEvent)
		{
			if (photonEvent.Code != 180)
			{
				return;
			}
			RepoAdminMenu.mls.LogInfo((object)"Received RAM Network Event!");
			object[] array = (object[])photonEvent.CustomData;
			if (array.Length == 1)
			{
				string text = array[0].ToString();
				if (text == "NeedSettings")
				{
					Settings.UpdateClients();
				}
				else
				{
					RepoAdminMenu.mls.LogWarning((object)("Unknown command(" + array.Length + "): " + text));
				}
			}
			else if (array.Length == 2)
			{
				string text2 = array[0].ToString();
				string json = array[1].ToString();
				if (text2 == "SettingsSync")
				{
					if (!SemiFunc.IsMasterClient())
					{
						RepoAdminMenu.mls.LogInfo((object)"Syncing settings with Master Client");
						Settings.loadFromJson(json);
					}
				}
				else
				{
					RepoAdminMenu.mls.LogWarning((object)("Unknown command(" + array.Length + "): " + text2));
				}
			}
			else if (array.Length == 3)
			{
				string text3 = array[0].ToString();
				string text4 = array[1].ToString();
				PlayerAvatar val = SemiFunc.PlayerGetFromSteamID(text4);
				if ((Object)(object)val == (Object)null)
				{
					RepoAdminMenu.mls.LogWarning((object)("Invalid player: " + text4));
				}
				else if (!(text3 == "KickPlayer"))
				{
					if (text3 == "KickPlayerAck")
					{
						if (SemiFunc.IsMasterClient())
						{
							RepoAdminMenu.mls.LogInfo((object)("Sending kick acknowledge: " + SemiFunc.PlayerGetName(val)));
							SendCommandSteamIDString("KickPlayer", text4, array[2].ToString(), (ReceiverGroup)0);
						}
					}
					else
					{
						RepoAdminMenu.mls.LogWarning((object)("Unknown command(" + array.Length + "): " + text3));
					}
				}
				else if (!SemiFunc.IsMasterClient() && PlayerAvatar.instance.steamID.Equals(text4))
				{
					RepoAdminMenu.mls.LogInfo((object)"Received kick request");
					string text5 = array[2].ToString();
					if (text5.Length != 16)
					{
						RepoAdminMenu.mls.LogInfo((object)"Sending secret to master client to confirm kick");
						clientRandomString = randomString(16);
						SendCommandSteamIDString("KickPlayerAck", text4, clientRandomString, (ReceiverGroup)2);
					}
					else if (text5.Equals(clientRandomString))
					{
						RepoAdminMenu.mls.LogInfo((object)"I was kicked :(");
						NetworkManager.instance.LeavePhotonRoom();
						clientRandomString = "";
					}
				}
			}
			else
			{
				RepoAdminMenu.mls.LogWarning((object)("Received event with incorrect argument count: " + array.Length));
			}
		}
	}
	internal class PlayerUtil
	{
		private static FieldInfo maxHealthField = AccessTools.Field(typeof(PlayerHealth), "maxHealth");

		private static FieldInfo healthField = AccessTools.Field(typeof(PlayerHealth), "health");

		public static void killPlayer(PlayerAvatar avatar)
		{
			avatar.PlayerDeath(-1);
			RepoAdminMenu.mls.LogInfo((object)(SemiFunc.PlayerGetName(avatar) + " Killed!"));
		}

		public static void revivePlayer(PlayerAvatar avatar)
		{
			FieldInfo fieldInfo = AccessTools.Field(typeof(PlayerAvatar), "deadSet");
			if (fieldInfo != null && (bool)fieldInfo.GetValue(avatar) && (Object)(object)avatar.playerDeathHead != (Object)null)
			{
				PlayerDeathHead playerDeathHead = avatar.playerDeathHead;
				FieldInfo fieldInfo2 = AccessTools.Field(typeof(PlayerDeathHead), "inExtractionPoint");
				if (fieldInfo2 != null)
				{
					fieldInfo2.SetValue(playerDeathHead, true);
					avatar.Revive(false);
					fieldInfo2.SetValue(playerDeathHead, false);
					RepoAdminMenu.mls.LogInfo((object)(SemiFunc.PlayerGetName(avatar) + " Revived!"));
				}
				else
				{
					RepoAdminMenu.mls.LogError((object)"Failed to grab field 'PlayerDeathHead->inExtractionPoint'!");
				}
			}
			else
			{
				RepoAdminMenu.mls.LogInfo((object)(SemiFunc.PlayerGetName(avatar) + " is not dead. Cannot be revived!"));
			}
		}

		public static void healPlayer(PlayerAvatar avatar)
		{
			PlayerHealth playerHealth = avatar.playerHealth;
			if (maxHealthField != null && healthField != null)
			{
				avatar.playerHealth.HealOther((int)maxHealthField.GetValue(playerHealth), true);
				RepoAdminMenu.mls.LogInfo((object)(SemiFunc.PlayerGetName(avatar) + " Healed!"));
			}
			else
			{
				RepoAdminMenu.mls.LogError((object)"Failed to grab field 'PlayerHealth->maxHealth' or 'PlayerHealth->health'!");
			}
		}

		public static void upgradeHealth(PlayerAvatar avatar, int level)
		{
			string text = SemiFunc.PlayerGetSteamID(avatar);
			StatsManager.instance.playerUpgradeHealth[text] = level;
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				PunManager.instance.UpgradePlayerHealthRPC(text, level);
			}
			if (SemiFunc.IsMasterClient())
			{
				PunManager.instance.photonView.RPC("UpgradePlayerHealthRPC", (RpcTarget)0, new object[2]
				{
					text,
					StatsManager.instance.playerUpgradeHealth[text]
				});
			}
		}

		public static void upgradeJump(PlayerAvatar avatar, int level)
		{
			string text = SemiFunc.PlayerGetSteamID(avatar);
			StatsManager.instance.playerUpgradeExtraJump[text] = level;
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				PunManager.instance.UpgradePlayerExtraJumpRPC(text, level);
			}
			if (SemiFunc.IsMasterClient())
			{
				PunManager.instance.photonView.RPC("UpgradePlayerExtraJumpRPC", (RpcTarget)0, new object[2]
				{
					text,
					StatsManager.instance.playerUpgradeExtraJump[text]
				});
			}
		}

		public static void upgradeLaunch(PlayerAvatar avatar, int level)
		{
			string text = SemiFunc.PlayerGetSteamID(avatar);
			StatsManager.instance.playerUpgradeLaunch[text] = level;
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				PunManager.instance.UpgradePlayerTumbleLaunchRPC(text, level);
			}
			if (SemiFunc.IsMasterClient())
			{
				PunManager.instance.photonView.RPC("UpgradePlayerTumbleLaunchRPC", (RpcTarget)1, new object[2]
				{
					text,
					StatsManager.instance.playerUpgradeLaunch[text]
				});
			}
		}

		public static void upgradeMapPlayerCount(PlayerAvatar avatar, int level)
		{
			string text = SemiFunc.PlayerGetSteamID(avatar);
			StatsManager.instance.playerUpgradeMapPlayerCount[text] = level;
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				PunManager.instance.UpgradeMapPlayerCountRPC(text, level);
			}
			if (SemiFunc.IsMasterClient())
			{
				PunManager.instance.photonView.RPC("UpgradeMapPlayerCountRPC", (RpcTarget)1, new object[2]
				{
					text,
					StatsManager.instance.playerUpgradeMapPlayerCount[text]
				});
			}
		}

		public static void upgradeRange(PlayerAvatar avatar, int level)
		{
			string text = SemiFunc.PlayerGetSteamID(avatar);
			StatsManager.instance.playerUpgradeRange[text] = level;
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				PunManager.instance.UpgradePlayerGrabRangeRPC(text, level);
			}
			if (SemiFunc.IsMasterClient())
			{
				PunManager.instance.photonView.RPC("UpgradePlayerGrabRangeRPC", (RpcTarget)1, new object[2]
				{
					text,
					StatsManager.instance.playerUpgradeRange[text]
				});
			}
		}

		public static void upgradeSpeed(PlayerAvatar avatar, int level)
		{
			string text = SemiFunc.PlayerGetSteamID(avatar);
			StatsManager.instance.playerUpgradeSpeed[text] = level;
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				PunManager.instance.UpgradePlayerSprintSpeedRPC(text, level);
			}
			if (SemiFunc.IsMasterClient())
			{
				PunManager.instance.photonView.RPC("UpgradePlayerSprintSpeedRPC", (RpcTarget)1, new object[2]
				{
					text,
					StatsManager.instance.playerUpgradeSpeed[text]
				});
			}
		}

		public static void upgradeStamina(PlayerAvatar avatar, int level)
		{
			string text = SemiFunc.PlayerGetSteamID(avatar);
			StatsManager.instance.playerUpgradeStamina[text] = level;
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				PunManager.instance.UpgradePlayerEnergyRPC(text, level);
			}
			if (SemiFunc.IsMasterClient())
			{
				PunManager.instance.photonView.RPC("UpgradePlayerEnergyRPC", (RpcTarget)1, new object[2]
				{
					text,
					StatsManager.instance.playerUpgradeStamina[text]
				});
			}
		}

		public static void upgradeStrength(PlayerAvatar avatar, int level)
		{
			string text = SemiFunc.PlayerGetSteamID(avatar);
			StatsManager.instance.playerUpgradeStrength[text] = level;
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				PunManager.instance.UpgradePlayerGrabStrengthRPC(text, level);
			}
			if (SemiFunc.IsMasterClient())
			{
				PunManager.instance.photonView.RPC("UpgradePlayerGrabStrengthRPC", (RpcTarget)1, new object[2]
				{
					text,
					StatsManager.instance.playerUpgradeStrength[text]
				});
			}
		}

		public static void upgradeThrow(PlayerAvatar avatar, int level)
		{
			string text = SemiFunc.PlayerGetSteamID(avatar);
			StatsManager.instance.playerUpgradeThrow[text] = level;
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				PunManager.instance.UpgradePlayerThrowStrengthRPC(text, level);
			}
			if (SemiFunc.IsMasterClient())
			{
				PunManager.instance.photonView.RPC("UpgradePlayerThrowStrengthRPC", (RpcTarget)1, new object[2]
				{
					text,
					StatsManager.instance.playerUpgradeThrow[text]
				});
			}
		}

		public static int getUpgradeLevel(string type, PlayerAvatar avatar)
		{
			StatsManager instance = StatsManager.instance;
			string key = SemiFunc.PlayerGetSteamID(avatar);
			if (type.Equals("health") && instance.playerUpgradeHealth.ContainsKey(key))
			{
				return instance.playerUpgradeHealth[key];
			}
			if (type.Equals("jump") && instance.playerUpgradeExtraJump.ContainsKey(key))
			{
				return instance.playerUpgradeExtraJump[key];
			}
			if (type.Equals("launch") && instance.playerUpgradeLaunch.ContainsKey(key))
			{
				return instance.playerUpgradeLaunch[key];
			}
			if (type.Equals("playercount") && instance.playerUpgradeMapPlayerCount.ContainsKey(key))
			{
				return instance.playerUpgradeMapPlayerCount[key];
			}
			if (type.Equals("range") && instance.playerUpgradeRange.ContainsKey(key))
			{
				return instance.playerUpgradeRange[key];
			}
			if (type.Equals("speed") && instance.playerUpgradeSpeed.ContainsKey(key))
			{
				return instance.playerUpgradeSpeed[key];
			}
			if (type.Equals("stamina") && instance.playerUpgradeStamina.ContainsKey(key))
			{
				return instance.playerUpgradeStamina[key];
			}
			if (type.Equals("strength") && instance.playerUpgradeStrength.ContainsKey(key))
			{
				return instance.playerUpgradeStrength[key];
			}
			if (type.Equals("throw") && instance.playerUpgradeThrow.ContainsKey(key))
			{
				return instance.playerUpgradeThrow[key];
			}
			return 0;
		}

		public static void giveCrown(PlayerAvatar avatar)
		{
			SessionManager.instance.crownedPlayerSteamID = SemiFunc.PlayerGetSteamID(avatar);
			SessionManager.instance.CrownPlayer();
		}

		public static void teleportTo(PlayerAvatar avatar)
		{
			teleport(PlayerAvatar.instance, avatar);
		}

		public static void summon(PlayerAvatar avatar)
		{
			teleport(avatar, PlayerAvatar.instance);
		}

		private static void teleport(PlayerAvatar from, PlayerAvatar to)
		{
			//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_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: 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)
			//IL_0035: 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)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			Vector3 position = ((Component)to).transform.position;
			Quaternion rotation = ((Component)to).transform.rotation;
			if (to.deadSet)
			{
				position = ((Component)to.playerDeathHead.physGrabObject).transform.position;
				rotation = ((Component)to.playerDeathHead.physGrabObject).transform.rotation;
			}
			if (!SemiFunc.IsMultiplayer())
			{
				from.Spawn(position, rotation);
			}
			else if ((Object)(object)from.photonView != (Object)null)
			{
				if (from.deadSet)
				{
					from.playerDeathHead.physGrabObject.Teleport(position, rotation);
					return;
				}
				from.photonView.RPC("SpawnRPC", (RpcTarget)0, new object[2] { position, rotation });
			}
		}

		public static void KickPlayer(PlayerAvatar avatar)
		{
			if (!((Object)(object)avatar == (Object)(object)PlayerAvatar.instance))
			{
				RepoAdminMenu.mls.LogInfo((object)("Sending kick to: " + SemiFunc.PlayerGetName(avatar)));
				NetworkUtil.SendCommandSteamIDString("KickPlayer", avatar.steamID, "", (ReceiverGroup)0);
			}
		}
	}
	internal class ValuableUtil
	{
		private static SortedDictionary<string, GameObject> tinyValuables = new SortedDictionary<string, GameObject>();

		private static SortedDictionary<string, GameObject> smallValuables = new SortedDictionary<string, GameObject>();

		private static SortedDictionary<string, GameObject> mediumValuables = new SortedDictionary<string, GameObject>();

		private static SortedDictionary<string, GameObject> bigValuables = new SortedDictionary<string, GameObject>();

		private static SortedDictionary<string, GameObject> wideValuables = new SortedDictionary<string, GameObject>();

		private static SortedDictionary<string, GameObject> tallValuables = new SortedDictionary<string, GameObject>();

		private static SortedDictionary<string, GameObject> veryTallValuables = new SortedDictionary<string, GameObject>();

		public static void Init()
		{
			tinyValuables.Clear();
			smallValuables.Clear();
			mediumValuables.Clear();
			bigValuables.Clear();
			wideValuables.Clear();
			tallValuables.Clear();
			veryTallValuables.Clear();
			foreach (LevelValuables valuablePreset in RunManager.instance.levelCurrent.ValuablePresets)
			{
				foreach (GameObject item in valuablePreset.tiny)
				{
					string key = ((Object)item).name.Replace("Valuable ", string.Empty);
					if (!tinyValuables.ContainsKey(key))
					{
						tinyValuables.Add(key, item);
					}
				}
				foreach (GameObject item2 in valuablePreset.small)
				{
					string key2 = ((Object)item2).name.Replace("Valuable ", string.Empty);
					if (!smallValuables.ContainsKey(key2))
					{
						smallValuables.Add(key2, item2);
					}
				}
				foreach (GameObject item3 in valuablePreset.medium)
				{
					string key3 = ((Object)item3).name.Replace("Valuable ", string.Empty);
					if (!mediumValuables.ContainsKey(key3))
					{
						mediumValuables.Add(key3, item3);
					}
				}
				foreach (GameObject item4 in valuablePreset.big)
				{
					string key4 = ((Object)item4).name.Replace("Valuable ", string.Empty);
					if (!bigValuables.ContainsKey(key4))
					{
						bigValuables.Add(key4, item4);
					}
				}
				foreach (GameObject item5 in valuablePreset.wide)
				{
					string key5 = ((Object)item5).name.Replace("Valuable ", string.Empty);
					if (!wideValuables.ContainsKey(key5))
					{
						wideValuables.Add(key5, item5);
					}
				}
				foreach (GameObject item6 in valuablePreset.tall)
				{
					string key6 = ((Object)item6).name.Replace("Valuable ", string.Empty);
					if (!tallValuables.ContainsKey(key6))
					{
						tallValuables.Add(key6, item6);
					}
				}
				foreach (GameObject item7 in valuablePreset.veryTall)
				{
					string key7 = ((Object)item7).name.Replace("Valuable ", string.Empty);
					if (!veryTallValuables.ContainsKey(key7))
					{
						veryTallValuables.Add(key7, item7);
					}
				}
			}
		}

		public static SortedDictionary<string, GameObject> getTinyValuables()
		{
			return tinyValuables;
		}

		public static SortedDictionary<string, GameObject> getSmallValuables()
		{
			return smallValuables;
		}

		public static SortedDictionary<string, GameObject> getMediumValuables()
		{
			return mediumValuables;
		}

		public static SortedDictionary<string, GameObject> getBigValuables()
		{
			return bigValuables;
		}

		public static SortedDictionary<string, GameObject> getWideValuables()
		{
			return wideValuables;
		}

		public static SortedDictionary<string, GameObject> getTallValuables()
		{
			return tallValuables;
		}

		public static SortedDictionary<string, GameObject> getVeryTallValuables()
		{
			return veryTallValuables;
		}

		public static void spawnValuable(GameObject valuable)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: 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)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = ((Component)PlayerAvatar.instance).transform.position + new Vector3(0f, 1f, 0f) + ((Component)PlayerAvatar.instance).transform.forward * 1f;
			if (SemiFunc.IsMultiplayer())
			{
				ValuableObject val2 = default(ValuableObject);
				if (!valuable.TryGetComponent<ValuableObject>(ref val2))
				{
					ItemInfoExtraUI.instance.ItemInfoText("Could not spawn valuable '" + ((Object)valuable).name + "'", Color.red);
				}
				else
				{
					Valuables.SpawnValuable(val2, val, Quaternion.identity);
				}
			}
			else
			{
				Object.Instantiate<GameObject>(valuable.gameObject, val, Quaternion.identity);
			}
		}
	}
}
namespace RepoAdminMenu.Patches
{
	[HarmonyPatch(typeof(EnemyDirector))]
	internal class EnemyDirectorPatch
	{
		[HarmonyPatch("SetInvestigate")]
		[HarmonyPrefix]
		private static bool SetInvestigate_Prefix(EnemyDirector __instance)
		{
			return !Settings.instance.deafEnemies;
		}
	}
	[HarmonyPatch(typeof(EnemyHealth))]
	internal class EnemyHealthPatch
	{
		[HarmonyPatch("Hurt")]
		[HarmonyPrefix]
		private static void Hurt_Prefix(ref int _damage, int ___healthCurrent)
		{
			if (Settings.instance.weakEnemies)
			{
				_damage = ___healthCurrent;
				if (___healthCurrent < 1)
				{
					_damage = 100;
				}
			}
		}
	}
	[HarmonyPatch(typeof(EnemyParent))]
	internal class EnemyParentPatch
	{
		public static bool spawning;

		[HarmonyPatch("Despawn")]
		[HarmonyPrefix]
		private static bool Despawn_Prefix(float ___SpawnedTimeMin, float ___SpawnedTimeMax, ref float ___SpawnedTimer)
		{
			if (spawning)
			{
				spawning = false;
				___SpawnedTimer = Random.Range(___SpawnedTimeMin, ___SpawnedTimeMax);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(EnemyVision))]
	internal class EnemyVisionPatch
	{
		[HarmonyPatch("VisionTrigger")]
		[HarmonyPrefix]
		private static bool VisionTrigger_Prefix(int playerID, PlayerAvatar player, EnemyVision __instance)
		{
			if (Settings.instance.blindEnemies || Settings.isNoTarget(player))
			{
				__instance.VisionTriggered[playerID] = false;
				__instance.VisionsTriggered[playerID] = 0;
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(ExtractionPoint))]
	internal class ExtractionPointPatch
	{
		private static int previousMoney = -1;

		[HarmonyPatch("Update")]
		[HarmonyPrefix]
		private static void Update_Prefix(ExtractionPoint __instance, bool ___isShop)
		{
			if (!___isShop)
			{
				return;
			}
			if (Settings.instance.infiniteMoney)
			{
				if (previousMoney < 0)
				{
					previousMoney = StatsManager.instance.runStats["currency"];
				}
				StatsManager.instance.runStats["currency"] = 9999;
			}
			else
			{
				if (previousMoney >= 0)
				{
					StatsManager.instance.runStats["currency"] = previousMoney;
				}
				previousMoney = -1;
			}
		}
	}
	[HarmonyPatch(typeof(ItemBattery))]
	internal class ItemBatteryPatch
	{
		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void Update_Postfix(ItemBattery __instance, ref int ___batteryLifeInt)
		{
			if (Settings.instance.noBatteryDrain)
			{
				__instance.batteryLife = 100f;
				___batteryLifeInt = 6;
			}
		}
	}
	[HarmonyPatch(typeof(ItemMeleeInflatableHammer))]
	internal class ItemMeleeInflatableHammerPatch
	{
		[HarmonyPatch("OnHit")]
		[HarmonyPrefix]
		private static bool OnHit_Prefix(ItemMeleeInflatableHammer __instance, PhotonView ___photonView)
		{
			if (Settings.instance.boomhammer)
			{
				if (SemiFunc.IsMasterClientOrSingleplayer())
				{
					__instance.ExplosionRPC();
					return false;
				}
				if (SemiFunc.IsMasterClient())
				{
					___photonView.RPC("ExplosionRPC", (RpcTarget)1, new object[0]);
					return false;
				}
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(ItemUpgrade))]
	internal class ItemUpgradePatch
	{
		[HarmonyPatch("Update")]
		[HarmonyPrefix]
		private static void Update_Prefix(ItemToggle ___itemToggle)
		{
			if (Settings.instance.useShopUpgrades)
			{
				((Behaviour)___itemToggle).enabled = true;
			}
		}
	}
	[HarmonyPatch(typeof(NetworkConnect))]
	internal class NetworkConnectPatch
	{
		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		private static void Start_Postfix()
		{
			NetworkUtil.Init();
		}

		[HarmonyPatch("OnCreatedRoom")]
		[HarmonyPostfix]
		private static void OnCreatedRoom_Postfix()
		{
			if (Configuration.ResetSettingsOnLobbyCreation.Value)
			{
				RepoAdminMenu.mls.LogInfo((object)"Resetting settings");
				Settings.instance = new Settings();
			}
		}

		[HarmonyPatch("OnJoinedRoom")]
		[HarmonyPostfix]
		private static void OnJoinedRoom_Postfix()
		{
			NetworkUtil.instance.clientRandomString = string.Empty;
			NetworkUtil.SendCommand("NeedSettings", (ReceiverGroup)2);
		}
	}
	[HarmonyPatch]
	internal class NoTargetPatches
	{
		[HarmonyPatch(typeof(Enemy), "Update")]
		[HarmonyPrefix]
		private static void Enemy_Update_Prefix(ref PlayerAvatar ___TargetPlayerAvatar)
		{
			if ((Object)(object)___TargetPlayerAvatar != (Object)null && Settings.isNoTarget(___TargetPlayerAvatar))
			{
				___TargetPlayerAvatar = null;
			}
		}

		[HarmonyPatch(typeof(EnemyAnimal), "Update")]
		[HarmonyPrefix]
		private static void EnemyAnimal_Update_Prefix(ref PlayerAvatar ___playerTarget)
		{
			if ((Object)(object)___playerTarget != (Object)null && Settings.isNoTarget(___playerTarget))
			{
				___playerTarget = null;
			}
		}

		[HarmonyPatch(typeof(EnemyBangDirector), "Update")]
		[HarmonyPrefix]
		private static void EnemyBangDirector_Update_Prefix(ref PlayerAvatar ___playerTarget)
		{
			if ((Object)(object)___playerTarget != (Object)null && Settings.isNoTarget(___playerTarget))
			{
				___playerTarget = null;
			}
		}

		[HarmonyPatch(typeof(EnemyBeamer), "Update")]
		[HarmonyPrefix]
		private static void EnemyBeamer_Update_Prefix(ref PlayerAvatar ___playerTarget)
		{
			if ((Object)(object)___playerTarget != (Object)null && Settings.isNoTarget(___playerTarget))
			{
				___playerTarget = null;
			}
		}

		[HarmonyPatch(typeof(EnemyBowtie), "Update")]
		[HarmonyPrefix]
		private static void EnemyBowtie_Update_Prefix(ref PlayerAvatar ___playerTarget)
		{
			if ((Object)(object)___playerTarget != (Object)null && Settings.isNoTarget(___playerTarget))
			{
				___playerTarget = null;
			}
		}

		[HarmonyPatch(typeof(EnemyCeilingEye), "Update")]
		[HarmonyPrefix]
		private static void EnemyCeilingEye_Update_Prefix(ref PlayerAvatar ___targetPlayer)
		{
			if ((Object)(object)___targetPlayer != (Object)null && Settings.isNoTarget(___targetPlayer))
			{
				___targetPlayer = null;
			}
		}

		[HarmonyPatch(typeof(EnemyDuck), "Update")]
		[HarmonyPrefix]
		private static void EnemyDuck_Update_Prefix(ref PlayerAvatar ___playerTarget)
		{
			if ((Object)(object)___playerTarget != (Object)null && Settings.isNoTarget(___playerTarget))
			{
				___playerTarget = null;
			}
		}

		[HarmonyPatch(typeof(EnemyDuck), "OnGrabbed")]
		[HarmonyPrefix]
		private static bool EnemyDuck_OnGrabbed_Prefix(EnemyDuck __instance)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			if (Settings.instance.friendlyDuck)
			{
				__instance.currentState = (State)2;
				return false;
			}
			return true;
		}

		[HarmonyPatch(typeof(EnemyDuck), "UpdateState")]
		[HarmonyPrefix]
		private static void EnemyDuck_UpdateState_Prefix(ref State _state)
		{
			if (Settings.instance.friendlyDuck && (int)_state == 11)
			{
				_state = (State)2;
			}
		}

		[HarmonyPatch(typeof(EnemyFloater), "Update")]
		[HarmonyPrefix]
		private static void EnemyFloater_Update_Prefix(ref PlayerAvatar ___targetPlayer)
		{
			if ((Object)(object)___targetPlayer != (Object)null && Settings.isNoTarget(___targetPlayer))
			{
				___targetPlayer = null;
			}
		}

		[HarmonyPatch(typeof(EnemyGnomeDirector), "Update")]
		[HarmonyPrefix]
		private static void EnemyGnomeDirector_Update_Prefix(ref PlayerAvatar ___playerTarget)
		{
			if ((Object)(object)___playerTarget != (Object)null && Settings.isNoTarget(___playerTarget))
			{
				___playerTarget = null;
			}
		}

		[HarmonyPatch(typeof(EnemyHidden), "Update")]
		[HarmonyPrefix]
		private static void EnemyHidden_Update_Prefix(ref PlayerAvatar ___playerTarget)
		{
			if ((Object)(object)___playerTarget != (Object)null && Settings.isNoTarget(___playerTarget))
			{
				___playerTarget = null;
			}
		}

		[HarmonyPatch(typeof(EnemyRobe), "Update")]
		[HarmonyPrefix]
		private static void EnemyRobe_Update_Prefix(ref PlayerAvatar ___targetPlayer)
		{
			if ((Object)(object)___targetPlayer != (Object)null && Settings.isNoTarget(___targetPlayer))
			{
				___targetPlayer = null;
			}
		}

		[HarmonyPatch(typeof(EnemyRunner), "Update")]
		[HarmonyPrefix]
		private static void EnemyRunner_Update_Prefix(ref PlayerAvatar ___targetPlayer)
		{
			if ((Object)(object)___targetPlayer != (Object)null && Settings.isNoTarget(___targetPlayer))
			{
				___targetPlayer = null;
			}
		}

		[HarmonyPatch(typeof(EnemySlowMouth), "Update")]
		[HarmonyPrefix]
		private static void EnemySlowMouth_Update_Prefix(ref PlayerAvatar ___playerTarget)
		{
			if ((Object)(object)___playerTarget != (Object)null && Settings.isNoTarget(___playerTarget))
			{
				___playerTarget = null;
			}
		}

		[HarmonyPatch(typeof(EnemySlowWalker), "Update")]
		[HarmonyPrefix]
		private static void EnemySlowWalker_Update_Prefix(ref PlayerAvatar ___targetPlayer)
		{
			if ((Object)(object)___targetPlayer != (Object)null && Settings.isNoTarget(___targetPlayer))
			{
				___targetPlayer = null;
			}
		}

		[HarmonyPatch(typeof(EnemyThinMan), "Update")]
		[HarmonyPrefix]
		private static void EnemyThinMan_Update_Prefix(ref PlayerAvatar ___playerTarget)
		{
			if ((Object)(object)___playerTarget != (Object)null && Settings.isNoTarget(___playerTarget))
			{
				___playerTarget = null;
			}
		}

		[HarmonyPatch(typeof(EnemyTumbler), "Update")]
		[HarmonyPrefix]
		private static void EnemyTumbler_Update_Prefix(ref PlayerAvatar ___targetPlayer)
		{
			if ((Object)(object)___targetPlayer != (Object)null && Settings.isNoTarget(___targetPlayer))
			{
				___targetPlayer = null;
			}
		}

		[HarmonyPatch(typeof(EnemyUpscream), "Update")]
		[HarmonyPrefix]
		private static void EnemyUpscream_Update_Prefix(ref PlayerAvatar ___targetPlayer)
		{
			if ((Object)(object)___targetPlayer != (Object)null && Settings.isNoTarget(___targetPlayer))
			{
				___targetPlayer = null;
			}
		}

		[HarmonyPatch(typeof(EnemyValuableThrower), "Update")]
		[HarmonyPrefix]
		private static void EnemyValuableThrower_Update_Prefix(ref PlayerAvatar ___playerTarget)
		{
			if ((Object)(object)___playerTarget != (Object)null && Settings.isNoTarget(___playerTarget))
			{
				___playerTarget = null;
			}
		}
	}
	[HarmonyPatch(typeof(PhysGrabObjectImpactDetector))]
	internal class PhysGrabObjectImpactDetectorPatch
	{
		[HarmonyPatch("Break")]
		[HarmonyPrefix]
		private static bool Break_Prefix(bool ___isEnemy)
		{
			return !Settings.instance.noBreak || ___isEnemy;
		}
	}
	[HarmonyPatch(typeof(PlayerController))]
	internal class PlayerControllerPatch
	{
		[HarmonyPatch("Update")]
		[HarmonyPrefix]
		private static void Update_Prefix(PlayerController __instance, PlayerAvatar ___playerAvatarScript)
		{
			if ((Object)(object)___playerAvatarScript != (Object)null)
			{
				if (Settings.isInfiniteStamina(___playerAvatarScript))
				{
					__instance.EnergyCurrent = __instance.EnergyStart;
				}
				__instance.DebugNoTumble = Settings.isNoTumble(___playerAvatarScript);
			}
		}
	}
	[HarmonyPatch(typeof(PlayerHealth))]
	internal class PlayerHealthPatch
	{
		[HarmonyPatch("Hurt")]
		[HarmonyPrefix]
		private static bool Hurt_Prefix(ref int damage, PlayerAvatar ___playerAvatar, int ___health)
		{
			if (Settings.isGod(___playerAvatar))
			{
				return false;
			}
			if (Settings.isNoDeath(___playerAvatar))
			{
				damage = Math.Min(damage, ___health - 1);
				if (damage == 0)
				{
					return false;
				}
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(PlayerTumble))]
	internal class PlayerTumblePatch
	{
		[HarmonyPatch("Update")]
		[HarmonyPrefix]
		private static void Update_Prefix(PlayerTumble __instance, PlayerAvatar ___playerAvatar)
		{
			if ((Object)(object)__instance != (Object)null && (Object)(object)___playerAvatar != (Object)null && Settings.isForceTumble(___playerAvatar) && SemiFunc.IsMasterClient())
			{
				long num = DateTime.Now.Ticks / 10000;
				if (Settings.getLastForceTumble(___playerAvatar) < num - 500)
				{
					__instance.TumbleRequest(true, false);
					Settings.setLastForceTumble(___playerAvatar, num);
				}
			}
		}
	}
	[HarmonyPatch(typeof(PunManager))]
	internal class PunManagerPatch
	{
		[HarmonyPatch("UpdateHealthRightAway")]
		[HarmonyPrefix]
		private static bool Prefix_UpdateHealthRightAway(ref string playerName)
		{
			PlayerAvatar val = SemiFunc.PlayerAvatarGetFromSteamID(playerName);
			if ((Object)(object)val == (Object)(object)SemiFunc.PlayerAvatarLocal())
			{
				val.playerHealth.maxHealth = 100 + StatsManager.instance.playerUpgradeHealth[playerName] * 20;
				val.playerHealth.Heal(val.playerHealth.maxHealth - val.playerHealth.health, false);
			}
			return false;
		}

		[HarmonyPatch("UpdateEnergyRightAway")]
		[HarmonyPrefix]
		private static bool Prefix_UpdateEnergyRightAway(ref string _steamID)
		{
			if ((Object)(object)SemiFunc.PlayerAvatarGetFromSteamID(_steamID) == (Object)(object)SemiFunc.PlayerAvatarLocal())
			{
				PlayerController.instance.EnergyStart = 40f + (float)StatsManager.instance.playerUpgradeStamina[_steamID] * 10f;
				PlayerController.instance.EnergyCurrent = PlayerController.instance.EnergyStart;
			}
			return false;
		}

		[HarmonyPatch("UpdateExtraJumpRightAway")]
		[HarmonyPrefix]
		private static bool Prefix_UpdateExtraJumpRightAway(ref string _steamID)
		{
			if ((Object)(object)SemiFunc.PlayerAvatarGetFromSteamID(_steamID) == (Object)(object)SemiFunc.PlayerAvatarLocal())
			{
				PlayerController.instance.JumpExtra = StatsManager.instance.playerUpgradeExtraJump[_steamID];
			}
			return false;
		}

		[HarmonyPatch("UpdateMapPlayerCountRightAway")]
		[HarmonyPrefix]
		private static bool UpdateMapPlayerCountRightAway(ref string _steamID)
		{
			PlayerAvatar val = SemiFunc.PlayerAvatarGetFromSteamID(_steamID);
			if ((Object)(object)val == (Object)(object)SemiFunc.PlayerAvatarLocal())
			{
				val.upgradeMapPlayerCount = StatsManager.instance.playerUpgradeMapPlayerCount[_steamID];
			}
			return false;
		}

		[HarmonyPatch("UpdateTumbleLaunchRightAway")]
		[HarmonyPrefix]
		private static bool Prefix_UpdateTumbleLaunchRightAway(ref string _steamID)
		{
			SemiFunc.PlayerAvatarGetFromSteamID(_steamID).tumble.tumbleLaunch = StatsManager.instance.playerUpgradeLaunch[_steamID];
			return false;
		}

		[HarmonyPatch("UpdateSprintSpeedRightAway")]
		[HarmonyPrefix]
		private static bool Prefix_UpdateSprintSpeedRightAway(ref string _steamID)
		{
			if ((Object)(object)SemiFunc.PlayerAvatarGetFromSteamID(_steamID) == (Object)(object)SemiFunc.PlayerAvatarLocal())
			{
				PlayerController.instance.SprintSpeed = StatsManager.instance.playerUpgradeSpeed[_steamID];
				PlayerController.instance.SprintSpeedUpgrades = StatsManager.instance.playerUpgradeSpeed[_steamID];
			}
			return false;
		}

		[HarmonyPatch("UpdateGrabStrengthRightAway")]
		[HarmonyPrefix]
		private static bool Prefix_UpdateGrabStrengthRightAway(ref string _steamID)
		{
			PlayerAvatar val = SemiFunc.PlayerAvatarGetFromSteamID(_steamID);
			if (Object.op_Implicit((Object)(object)val))
			{
				val.physGrabber.grabStrength = 1f + (float)StatsManager.instance.playerUpgradeStrength[_steamID] * 0.2f;
			}
			return false;
		}

		[HarmonyPatch("UpdateThrowStrengthRightAway")]
		[HarmonyPrefix]
		private static bool Prefix_UpdateThrowStrengthRightAway(ref string _steamID)
		{
			PlayerAvatar val = SemiFunc.PlayerAvatarGetFromSteamID(_steamID);
			if (Object.op_Implicit((Object)(object)val))
			{
				val.physGrabber.throwStrength = (float)StatsManager.instance.playerUpgradeThrow[_steamID] * 0.3f;
			}
			return false;
		}

		[HarmonyPatch("UpdateGrabRangeRightAway")]
		[HarmonyPrefix]
		private static bool Prefix_UpdateGrabRangeRightAway(ref string _steamID)
		{
			PlayerAvatar val = SemiFunc.PlayerAvatarGetFromSteamID(_steamID);
			if (Object.op_Implicit((Object)(object)val))
			{
				val.physGrabber.grabRange = 4f + (float)StatsManager.instance.playerUpgradeRange[_steamID] * 1f;
			}
			return false;
		}
	}
	[HarmonyPatch(typeof(RunManager))]
	internal class RunManagerPatch
	{
		private static bool lastKeyState;

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void Update_Postfix(RunManager __instance)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			if (Configuration.EnableHotkey.Value)
			{
				bool key = Input.GetKey(Configuration.MenuHotkey.Value);
				if (!lastKeyState && key)
				{
					Menu.toggleMenu();
					lastKeyState = key;
				}
				else if (lastKeyState && !key)
				{
					lastKeyState = key;
				}
			}
		}

		[HarmonyPatch("ChangeLevel")]
		[HarmonyPostfix]
		private static void ChangeLevel_Postfix()
		{
			ItemUtil.Init();
			ValuableUtil.Init();
			EnemyUtil.Init();
			MapUtil.Init();
		}

		[HarmonyPatch("SetRunLevel")]
		[HarmonyPrefix]
		private static bool SetRunLevel_Prefix(RunManager __instance, ref Level ___previousRunLevel, ref Level ___levelCurrent)
		{
			MapUtil.resetLevels();
			if (__instance.levels.Count == 0)
			{
				MapUtil.setMapEnabled(MapUtil.getMaps().First().Value, enabled: true);
				MapUtil.resetLevels();
			}
			if (MapUtil.getEnabledCount() == 1 || (Object)(object)MapUtil.getNextLevel() != (Object)null)
			{
				___previousRunLevel = null;
			}
			if ((Object)(object)MapUtil.getNextLevel() != (Object)null)
			{
				___levelCurrent = MapUtil.getNextLevel();
				MapUtil.clearNextLevel();
				return false;
			}
			return true;
		}
	}
	internal class TestingCode
	{
	}
	[HarmonyPatch(typeof(Trap))]
	internal class TrapPatch
	{
		[HarmonyPatch("Update")]
		[HarmonyPrefix]
		private static void Update_Prefix(ref bool ___trapStart, ref bool ___trapActive)
		{
			if (Settings.instance.noTraps)
			{
				___trapActive = false;
				___trapStart = false;
			}
		}
	}
}