Decompiled source of LateGameUpgrades v2.0.0

BepInEx/plugins/MoreShipUpgrades/MoreShipUpgrades.dll

Decompiled 2 years 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 BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LethalLib.Modules;
using MoreShipUpgrades.Managers;
using MoreShipUpgrades.Misc;
using MoreShipUpgrades.UpgradeComponents;
using Newtonsoft.Json;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyVersion("0.0.0.0")]
internal class <Module>
{
	static <Module>()
	{
	}
}
namespace MoreShipUpgrades
{
	[BepInPlugin("com.malco.lethalcompany.moreshipupgrades", "More Ship Upgrades", "1.3.1")]
	public class Plugin : BaseUnityPlugin
	{
		private readonly Harmony harmony = new Harmony("com.malco.lethalcompany.moreshipupgrades");

		public static Plugin instance;

		public static ManualLogSource mls;

		public static PluginConfig cfg { get; private set; }

		private void Awake()
		{
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Expected O, but got Unknown
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d5: Expected O, but got Unknown
			//IL_028b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0292: Expected O, but got Unknown
			cfg = new PluginConfig(((BaseUnityPlugin)this).Config);
			cfg.InitBindings();
			mls = Logger.CreateLogSource("More Ship Upgrades");
			instance = this;
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			Type[] array = types;
			foreach (Type type in array)
			{
				MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				MethodInfo[] array2 = methods;
				foreach (MethodInfo methodInfo in array2)
				{
					object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
					if (customAttributes.Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "shipupgrades");
			AssetBundle val = AssetBundle.LoadFromFile(text);
			GameObject val2 = new GameObject("UpgradeBus");
			val2.AddComponent<UpgradeBus>();
			GameObject val3 = val.LoadAsset<GameObject>("Assets/ShipUpgrades/LGUStore.prefab");
			val3.AddComponent<LGUStore>();
			NetworkPrefabs.RegisterNetworkPrefab(val3);
			UpgradeBus.instance.modStorePrefab = val3;
			AudioClip itemBreak = val.LoadAsset<AudioClip>("Assets/ShipUpgrades/break.mp3");
			AudioClip error = val.LoadAsset<AudioClip>("Assets/ShipUpgrades/error.mp3");
			AudioClip buttonPress = val.LoadAsset<AudioClip>("Assets/ShipUpgrades/ButtonPress2.ogg");
			Item val4 = val.LoadAsset<Item>("Assets/ShipUpgrades/TpButton.asset");
			val4.itemName = "Portable Tele";
			TPButtonScript tPButtonScript = val4.spawnPrefab.AddComponent<TPButtonScript>();
			((GrabbableObject)tPButtonScript).itemProperties = val4;
			((GrabbableObject)tPButtonScript).grabbable = true;
			((GrabbableObject)tPButtonScript).grabbableToEnemies = true;
			tPButtonScript.ItemBreak = itemBreak;
			((GrabbableObject)tPButtonScript).useCooldown = 2f;
			tPButtonScript.error = error;
			tPButtonScript.buttonPress = buttonPress;
			val4.creditsWorth = cfg.WEAK_TELE_PRICE;
			NetworkPrefabs.RegisterNetworkPrefab(val4.spawnPrefab);
			if (cfg.WEAK_TELE_ENABLED)
			{
				TerminalNode val5 = new TerminalNode();
				val5.displayText = "A button that when pressed teleports you and your loot back to the ship. Must have Ship Teleporter unlocked!!!\n\nHas a 90% chance to self destruct on use.";
				Items.RegisterShopItem(val4, (TerminalNode)null, (TerminalNode)null, val5, val4.creditsWorth);
			}
			Item val6 = val.LoadAsset<Item>("Assets/ShipUpgrades/TpButtonAdv.asset");
			val6.creditsWorth = cfg.ADVANCED_TELE_PRICE;
			val6.itemName = "Advanced Portable Tele";
			AdvTPButtonScript advTPButtonScript = val6.spawnPrefab.AddComponent<AdvTPButtonScript>();
			((GrabbableObject)advTPButtonScript).itemProperties = val6;
			((GrabbableObject)advTPButtonScript).grabbable = true;
			((GrabbableObject)advTPButtonScript).useCooldown = 2f;
			((GrabbableObject)advTPButtonScript).grabbableToEnemies = true;
			advTPButtonScript.ItemBreak = itemBreak;
			advTPButtonScript.error = error;
			advTPButtonScript.buttonPress = buttonPress;
			NetworkPrefabs.RegisterNetworkPrefab(val6.spawnPrefab);
			if (cfg.ADVANCED_TELE_ENABLED)
			{
				TerminalNode val7 = new TerminalNode();
				val7.displayText = "A button that when pressed teleports you and your loot back to the ship. Must have Ship Teleporter unlocked!!!";
				Items.RegisterShopItem(val6, (TerminalNode)null, (TerminalNode)null, val7, val6.creditsWorth);
			}
			Item val8 = val.LoadAsset<Item>("Assets/ShipUpgrades/beekeeper.asset");
			val8.spawnPrefab.AddComponent<beekeeperScript>();
			NetworkPrefabs.RegisterNetworkPrefab(val8.spawnPrefab);
			if (cfg.BEEKEEPER_ENABLED)
			{
				CustomTerminalNode item = new CustomTerminalNode("Beekeeper", cfg.BEEKEEPER_PRICE, $"Circuit bees do %{Mathf.Round(100f * cfg.BEEKEEPER_DAMAGE_MULTIPLIER)} of their base damage.", val8.spawnPrefab, 3);
				UpgradeBus.instance.terminalNodes.Add(item);
			}
			Item val9 = val.LoadAsset<Item>("Assets/ShipUpgrades/BiggerLungs.asset");
			val9.spawnPrefab.AddComponent<biggerLungScript>();
			NetworkPrefabs.RegisterNetworkPrefab(val9.spawnPrefab);
			if (cfg.BIGGER_LUNGS_ENABLED)
			{
				CustomTerminalNode item2 = new CustomTerminalNode("Bigger Lungs", cfg.BIGGER_LUNGS_PRICE, $"Stamina Time is {UpgradeBus.instance.cfg.SPRINT_TIME_INCREASE - 11f} units longer", val9.spawnPrefab, 3);
				UpgradeBus.instance.terminalNodes.Add(item2);
			}
			Item val10 = val.LoadAsset<Item>("Assets/ShipUpgrades/runningShoes.asset");
			val10.spawnPrefab.AddComponent<runningShoeScript>();
			NetworkPrefabs.RegisterNetworkPrefab(val10.spawnPrefab);
			if (cfg.RUNNING_SHOES_ENABLED)
			{
				CustomTerminalNode item3 = new CustomTerminalNode("Running Shoes", cfg.RUNNING_SHOES_PRICE, $"You can run {UpgradeBus.instance.cfg.MOVEMENT_SPEED - 4.6f} units faster", val10.spawnPrefab, 3);
				UpgradeBus.instance.terminalNodes.Add(item3);
			}
			Item val11 = val.LoadAsset<Item>("Assets/ShipUpgrades/strongLegs.asset");
			val11.spawnPrefab.AddComponent<strongLegsScript>();
			NetworkPrefabs.RegisterNetworkPrefab(val11.spawnPrefab);
			if (cfg.STRONG_LEGS_ENABLED)
			{
				CustomTerminalNode item4 = new CustomTerminalNode("Strong Legs", cfg.STRONG_LEGS_PRICE, $"Jump {cfg.JUMP_FORCE - 13f} units higher.", val11.spawnPrefab, 3);
				UpgradeBus.instance.terminalNodes.Add(item4);
			}
			Item val12 = val.LoadAsset<Item>("Assets/ShipUpgrades/destructiveCodes.asset");
			val12.spawnPrefab.AddComponent<trapDestroyerScript>();
			string text2 = "";
			text2 = ((!cfg.DESTROY_TRAP) ? $"Broadcasted codes now disable map hazards for {cfg.DISARM_TIME} seconds." : ((!cfg.EXPLODE_TRAP) ? "Broadcasted codes now destroy map hazards." : "Broadcasted codes now explode map hazards."));
			NetworkPrefabs.RegisterNetworkPrefab(val12.spawnPrefab);
			if (cfg.MALWARE_BROADCASTER_ENABLED)
			{
				CustomTerminalNode item5 = new CustomTerminalNode("Malware Broadcaster", cfg.MALWARE_BROADCASTER_PRICE, text2, val12.spawnPrefab);
				UpgradeBus.instance.terminalNodes.Add(item5);
			}
			Item val13 = val.LoadAsset<Item>("Assets/ShipUpgrades/LightFooted.asset");
			val13.spawnPrefab.AddComponent<lightFootedScript>();
			NetworkPrefabs.RegisterNetworkPrefab(val13.spawnPrefab);
			if (cfg.LIGHT_FOOTED_ENABLED)
			{
				CustomTerminalNode item6 = new CustomTerminalNode("Light Footed", cfg.LIGHT_FOOTED_PRICE, $"Audible Noise Distance is reduced by {UpgradeBus.instance.cfg.NOISE_REDUCTION} units. \nApplies to both sprinting and walking.", val13.spawnPrefab, 3);
				UpgradeBus.instance.terminalNodes.Add(item6);
			}
			Item val14 = val.LoadAsset<Item>("Assets/ShipUpgrades/NightVision.asset");
			val14.spawnPrefab.AddComponent<nightVisionScript>();
			NetworkPrefabs.RegisterNetworkPrefab(val14.spawnPrefab);
			if (cfg.NIGHT_VISION_ENABLED)
			{
				CustomTerminalNode item7 = new CustomTerminalNode("Night Vision", cfg.NIGHT_VISION_PRICE, $"Allows you to see in the dark. Press Left-Alt to turn on.  \nDrain speed is {cfg.NIGHT_VIS_DRAIN_SPEED}  \nRegen speed is {cfg.NIGHT_VIS_REGEN_SPEED}", val14.spawnPrefab);
				UpgradeBus.instance.terminalNodes.Add(item7);
			}
			Item val15 = val.LoadAsset<Item>("Assets/ShipUpgrades/terminalFlash.asset");
			AudioClip flashNoise = val.LoadAsset<AudioClip>("Assets/ShipUpgrades/flashbangsfx.ogg");
			UpgradeBus.instance.flashNoise = flashNoise;
			val15.spawnPrefab.AddComponent<terminalFlashScript>();
			NetworkPrefabs.RegisterNetworkPrefab(val15.spawnPrefab);
			if (cfg.DISCOMBOBULATOR_ENABLED)
			{
				CustomTerminalNode item8 = new CustomTerminalNode("Discombobulator", cfg.DISCOMBOBULATOR_PRICE, $"Stun enemies around your ship in a {cfg.DISCOMBOBULATOR_RADIUS} unit radius.", val15.spawnPrefab, 3);
				UpgradeBus.instance.terminalNodes.Add(item8);
			}
			Item val16 = val.LoadAsset<Item>("Assets/ShipUpgrades/strongScanner.asset");
			val16.spawnPrefab.AddComponent<strongerScannerScript>();
			NetworkPrefabs.RegisterNetworkPrefab(val16.spawnPrefab);
			if (cfg.BETTER_SCANNER_ENABLED)
			{
				string text3 = (cfg.REQUIRE_LINE_OF_SIGHT ? "Does not remove" : "Removes");
				string text4 = $"Increase distance nodes can be scanned by {cfg.NODE_DISTANCE_INCREASE} units.  \nIncrease distance Ship and Entrance can be scanned by {cfg.SHIP_AND_ENTRANCE_DISTANCE_INCREASE} units.  \n";
				text4 = text4 + text3 + " LOS requirement";
				CustomTerminalNode item9 = new CustomTerminalNode("Better Scanner", cfg.BETTER_SCANNER_PRICE, text4, val16.spawnPrefab);
				UpgradeBus.instance.terminalNodes.Add(item9);
			}
			Item val17 = val.LoadAsset<Item>("Assets/ShipUpgrades/exoskeleton.asset");
			val17.spawnPrefab.AddComponent<exoskeletonScript>();
			NetworkPrefabs.RegisterNetworkPrefab(val17.spawnPrefab);
			if (cfg.BACK_MUSCLES_ENABLED)
			{
				CustomTerminalNode item10 = new CustomTerminalNode("Back Muscles", cfg.BACK_MUSCLES_PRICE, $"Carry weight becomes %{Mathf.Round(cfg.CARRY_WEIGHT_REDUCTION * 100f)} of original", val17.spawnPrefab, 3);
				UpgradeBus.instance.terminalNodes.Add(item10);
			}
			UpgradeBus.instance.CreateDeepNodeCopy();
			Debug.Log((object)UpgradeBus.instance.terminalNodes);
			harmony.PatchAll();
			mls.LogInfo((object)"More Ship Upgrades has been patched");
		}
	}
}
namespace MoreShipUpgrades.UpgradeComponents
{
	internal class AdvTPButtonScript : GrabbableObject
	{
		public AudioClip ItemBreak;

		public AudioClip error;

		public AudioClip buttonPress;

		private AudioSource audio;

		public override void Start()
		{
			((GrabbableObject)this).Start();
			audio = ((Component)this).GetComponent<AudioSource>();
			((Component)this).gameObject.GetComponent<NetworkObject>().Spawn(false);
		}

		public override void DiscardItem()
		{
			base.playerHeldBy.activatingItem = false;
			((GrabbableObject)this).DiscardItem();
		}

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			((GrabbableObject)this).ItemActivate(used, buttonDown);
			if (!Mouse.current.leftButton.isPressed)
			{
				return;
			}
			audio.PlayOneShot(buttonPress);
			if (!base.itemUsedUp)
			{
				ShipTeleporter[] array = Object.FindObjectsOfType<ShipTeleporter>();
				ShipTeleporter val = null;
				ShipTeleporter[] array2 = array;
				foreach (ShipTeleporter val2 in array2)
				{
					if (!val2.isInverseTeleporter)
					{
						val = val2;
						break;
					}
				}
				if ((Object)(object)val == (Object)null)
				{
					audio.PlayOneShot(error);
					return;
				}
				int num = -1;
				for (int j = 0; j < StartOfRound.Instance.mapScreen.radarTargets.Count(); j++)
				{
					if ((Object)(object)((Component)StartOfRound.Instance.mapScreen.radarTargets[j].transform).gameObject.GetComponent<PlayerControllerB>() == (Object)(object)base.playerHeldBy)
					{
						num = j;
					}
				}
				if (num == -1)
				{
					StartOfRound.Instance.mapScreen.targetedPlayer = base.playerHeldBy;
					UpgradeBus.instance.TPButtonPressed = true;
					val.PressTeleportButtonOnLocalClient();
				}
				else
				{
					StartOfRound.Instance.mapScreen.SwitchRadarTargetAndSync(num);
					((MonoBehaviour)this).StartCoroutine(WaitToTP(val));
				}
			}
			else
			{
				audio.PlayOneShot(error);
			}
		}

		private IEnumerator WaitToTP(ShipTeleporter tele)
		{
			yield return (object)new WaitForSeconds(0.15f);
			ReqUpdateTpDropStatusServerRpc();
			tele.PressTeleportButtonOnLocalClient();
			if (Random.Range(0f, 1f) < UpgradeBus.instance.cfg.ADV_CHANCE_TO_BREAK)
			{
				audio.PlayOneShot(ItemBreak);
				base.itemUsedUp = true;
				TextMeshProUGUI chatText = HUDManager.Instance.chatText;
				((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "\n<color=#FF0000>The teleporter button has suffered irreparable damage and destroyed itself!</color>";
				base.playerHeldBy.DespawnHeldObject();
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void ReqUpdateTpDropStatusServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3988692149u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3988692149u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					ChangeTPButtonPressedClientRpc();
				}
			}
		}

		[ClientRpc]
		private void ChangeTPButtonPressedClientRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2793166939u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2793166939u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					UpgradeBus.instance.TPButtonPressed = true;
				}
			}
		}

		protected override void __initializeVariables()
		{
			((GrabbableObject)this).__initializeVariables();
		}

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_AdvTPButtonScript()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(3988692149u, new RpcReceiveHandler(__rpc_handler_3988692149));
			NetworkManager.__rpc_func_table.Add(2793166939u, new RpcReceiveHandler(__rpc_handler_2793166939));
		}

		private static void __rpc_handler_3988692149(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((AdvTPButtonScript)(object)target).ReqUpdateTpDropStatusServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2793166939(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((AdvTPButtonScript)(object)target).ChangeTPButtonPressedClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "AdvTPButtonScript";
		}
	}
	internal class beekeeperScript : BaseUpgrade
	{
		private void Start()
		{
			((MonoBehaviour)this).StartCoroutine(lateApply());
		}

		private IEnumerator lateApply()
		{
			yield return (object)new WaitForSeconds(1f);
			UpgradeBus.instance.beekeeper = true;
			TextMeshProUGUI chatText = HUDManager.Instance.chatText;
			((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "\n<color=#FF0000>Beekeeper is active!</color>";
			foreach (CustomTerminalNode node in UpgradeBus.instance.terminalNodes)
			{
				if (node.Name.ToLower() == "beekeeper" && node.Price > 0)
				{
					node.Price /= 2;
				}
			}
			UpgradeBus.instance.UpgradeObjects.Add("Beekeeper", ((Component)this).gameObject);
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
			load();
		}

		public override void Increment()
		{
			UpgradeBus.instance.beeLevel++;
			foreach (CustomTerminalNode terminalNode in UpgradeBus.instance.terminalNodes)
			{
				if (terminalNode.Name.ToLower() == "beekeeper")
				{
					terminalNode.Description = $"Circuit bees do %{Mathf.Round(100f * (UpgradeBus.instance.cfg.BEEKEEPER_DAMAGE_MULTIPLIER - (float)UpgradeBus.instance.beeLevel * UpgradeBus.instance.cfg.BEEKEEPER_DAMAGE_MULTIPLIER_INCREMENT))} of their base damage.";
				}
			}
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "beekeeperScript";
		}
	}
	internal class biggerLungScript : BaseUpgrade
	{
		private PlayerControllerB[] players;

		private void Start()
		{
			((MonoBehaviour)this).StartCoroutine(LateApply());
		}

		private IEnumerator LateApply()
		{
			yield return (object)new WaitForSeconds(1f);
			players = Object.FindObjectsOfType<PlayerControllerB>();
			PlayerControllerB[] array = players;
			foreach (PlayerControllerB player in array)
			{
				player.sprintTime = UpgradeBus.instance.cfg.SPRINT_TIME_INCREASE;
			}
			foreach (CustomTerminalNode node in UpgradeBus.instance.terminalNodes)
			{
				if (node.Name.ToLower() == "Bigger Lungs" && node.Price > 0)
				{
					node.Price /= 2;
				}
			}
			UpgradeBus.instance.biggerLungs = true;
			TextMeshProUGUI chatText = HUDManager.Instance.chatText;
			((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "\n<color=#FF0000>Bigger Lungs is active!</color>";
			UpgradeBus.instance.UpgradeObjects.Add("Bigger Lungs", ((Component)this).gameObject);
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
			load();
		}

		public override void Increment()
		{
			UpgradeBus.instance.lungLevel++;
			players = Object.FindObjectsOfType<PlayerControllerB>();
			PlayerControllerB[] array = players;
			foreach (PlayerControllerB val in array)
			{
				val.sprintTime += UpgradeBus.instance.cfg.SPRINT_TIME_INCREMENT;
			}
			foreach (CustomTerminalNode terminalNode in UpgradeBus.instance.terminalNodes)
			{
				if (terminalNode.Name.ToLower() == "bigger lungs")
				{
					terminalNode.Description = $"Stamina Time is {UpgradeBus.instance.cfg.SPRINT_TIME_INCREASE - 11f + (float)UpgradeBus.instance.lungLevel * UpgradeBus.instance.cfg.SPRINT_TIME_INCREMENT} units longer";
				}
			}
		}

		public override void load()
		{
			float num = 0f;
			for (int i = 0; i < UpgradeBus.instance.lungLevel; i++)
			{
				num += UpgradeBus.instance.cfg.SPRINT_TIME_INCREMENT;
			}
			players = Object.FindObjectsOfType<PlayerControllerB>();
			PlayerControllerB[] array = players;
			foreach (PlayerControllerB val in array)
			{
				val.sprintTime += num;
			}
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "biggerLungScript";
		}
	}
	internal class exoskeletonScript : BaseUpgrade
	{
		private void Start()
		{
			((MonoBehaviour)this).StartCoroutine(lateApply());
		}

		private IEnumerator lateApply()
		{
			yield return (object)new WaitForSeconds(1f);
			UpgradeBus.instance.exoskeleton = true;
			TextMeshProUGUI chatText = HUDManager.Instance.chatText;
			((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "\n<color=#FF0000>Back Muscles is active!</color>";
			foreach (CustomTerminalNode node in UpgradeBus.instance.terminalNodes)
			{
				if (node.Name.ToLower() == "back muscles" && node.Price > 0)
				{
					node.Price /= 2;
				}
			}
			UpgradeBus.instance.UpgradeObjects.Add("Back Muscles", ((Component)this).gameObject);
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
			load();
		}

		public override void Increment()
		{
			UpgradeBus.instance.backLevel++;
			foreach (CustomTerminalNode terminalNode in UpgradeBus.instance.terminalNodes)
			{
				if (terminalNode.Name.ToLower() == "back muscles")
				{
					terminalNode.Description = $"Carry weight becomes %{Mathf.Round((UpgradeBus.instance.cfg.CARRY_WEIGHT_REDUCTION - UpgradeBus.instance.cfg.CARRY_WEIGHT_INCREMENT * (float)UpgradeBus.instance.backLevel) * 100f)} of original";
				}
			}
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "exoskeletonScript";
		}
	}
	internal class lightFootedScript : BaseUpgrade
	{
		private void Start()
		{
			((MonoBehaviour)this).StartCoroutine(lateApply());
		}

		private IEnumerator lateApply()
		{
			yield return (object)new WaitForSeconds(1f);
			UpgradeBus.instance.softSteps = true;
			TextMeshProUGUI chatText = HUDManager.Instance.chatText;
			((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "\n<color=#FF0000>Light Footed is active!</color>";
			foreach (CustomTerminalNode node in UpgradeBus.instance.terminalNodes)
			{
				if (node.Name.ToLower() == "light footed" && node.Price > 0)
				{
					node.Price /= 2;
				}
			}
			UpgradeBus.instance.UpgradeObjects.Add("Light Footed", ((Component)this).gameObject);
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
			load();
		}

		public override void Increment()
		{
			UpgradeBus.instance.lightLevel++;
			foreach (CustomTerminalNode terminalNode in UpgradeBus.instance.terminalNodes)
			{
				if (terminalNode.Name.ToLower() == "light footed")
				{
					terminalNode.Description = $"Audible Noise Distance is reduced by {UpgradeBus.instance.cfg.NOISE_REDUCTION + UpgradeBus.instance.cfg.NOISE_REDUCTION_INCREMENT * (float)UpgradeBus.instance.lightLevel} units. \nApplies to both sprinting and walking.";
				}
			}
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "lightFootedScript";
		}
	}
	internal class nightVisionScript : BaseUpgrade
	{
		private float nightBattery;

		private Transform batteryBar;

		private PlayerControllerB client;

		private bool batteryExhaustion;

		private void Start()
		{
			((MonoBehaviour)this).StartCoroutine(lateApply());
			batteryBar = ((Component)((Component)this).transform.GetChild(0).GetChild(0)).transform;
		}

		private IEnumerator lateApply()
		{
			yield return (object)new WaitForSeconds(1f);
			UpgradeBus.instance.nightVision = true;
			TextMeshProUGUI chatText = HUDManager.Instance.chatText;
			((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "\n<color=#FF0000>Press Left-Alt to toggle Night Vision!!!</color>";
			client = GameNetworkManager.Instance.localPlayerController;
			UpgradeBus.instance.UpgradeObjects.Add("Night Vision", ((Component)this).gameObject);
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
			load();
		}

		private void LateUpdate()
		{
			//IL_0145: 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_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_0220: Unknown result type (might be due to invalid IL or missing references)
			//IL_0377: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)client == (Object)null)
			{
				return;
			}
			if (((ButtonControl)Keyboard.current[(Key)53]).wasPressedThisFrame && !batteryExhaustion)
			{
				UpgradeBus.instance.nightVisionActive = !UpgradeBus.instance.nightVisionActive;
				if (UpgradeBus.instance.nightVisionActive)
				{
					UpgradeBus.instance.nightVisColor = client.nightVision.color;
					UpgradeBus.instance.nightVisRange = client.nightVision.range;
					UpgradeBus.instance.nightVisIntensity = client.nightVision.intensity;
					client.nightVision.color = UpgradeBus.instance.cfg.NIGHT_VIS_COLOR;
					client.nightVision.range = UpgradeBus.instance.cfg.NIGHT_VIS_RANGE;
					client.nightVision.intensity = UpgradeBus.instance.cfg.NIGHT_VIS_INTENSITY;
					nightBattery -= UpgradeBus.instance.cfg.NIGHT_VIS_STARTUP;
				}
				else
				{
					client.nightVision.color = UpgradeBus.instance.nightVisColor;
					client.nightVision.range = UpgradeBus.instance.nightVisRange;
					client.nightVision.intensity = UpgradeBus.instance.nightVisIntensity;
				}
			}
			if (UpgradeBus.instance.nightVisionActive)
			{
				nightBattery -= Time.deltaTime * UpgradeBus.instance.cfg.NIGHT_VIS_DRAIN_SPEED;
				nightBattery = Mathf.Clamp(nightBattery, 0f, 1f);
				((Component)batteryBar.parent).gameObject.SetActive(true);
				if (nightBattery <= 0f)
				{
					UpgradeBus.instance.nightVisionActive = false;
					client.nightVision.color = UpgradeBus.instance.nightVisColor;
					client.nightVision.range = UpgradeBus.instance.nightVisRange;
					client.nightVision.intensity = UpgradeBus.instance.nightVisIntensity;
					batteryExhaustion = true;
					((MonoBehaviour)this).StartCoroutine(BatteryRecovery());
				}
			}
			else if (!batteryExhaustion)
			{
				nightBattery += Time.deltaTime * UpgradeBus.instance.cfg.NIGHT_VIS_REGEN_SPEED;
				nightBattery = Mathf.Clamp(nightBattery, 0f, 1f);
				if (nightBattery >= 1f)
				{
					((Component)batteryBar.parent).gameObject.SetActive(false);
				}
				else
				{
					((Component)batteryBar.parent).gameObject.SetActive(true);
				}
			}
			if (client.isInsideFactory || UpgradeBus.instance.nightVisionActive)
			{
				((Behaviour)client.nightVision).enabled = true;
			}
			else
			{
				((Behaviour)client.nightVision).enabled = false;
			}
			batteryBar.localScale = new Vector3(nightBattery, 1f, 1f);
		}

		private IEnumerator BatteryRecovery()
		{
			yield return (object)new WaitForSeconds(UpgradeBus.instance.cfg.NIGHT_VIS_EXHAUST);
			batteryExhaustion = false;
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "nightVisionScript";
		}
	}
	internal class runningShoeScript : BaseUpgrade
	{
		private void Start()
		{
			((MonoBehaviour)this).StartCoroutine(LateApply());
		}

		private IEnumerator LateApply()
		{
			yield return (object)new WaitForSeconds(1f);
			UpgradeBus.instance.runningShoes = true;
			PlayerControllerB[] players = Object.FindObjectsOfType<PlayerControllerB>();
			PlayerControllerB[] array = players;
			foreach (PlayerControllerB player in array)
			{
				player.movementSpeed = UpgradeBus.instance.cfg.MOVEMENT_SPEED;
			}
			TextMeshProUGUI chatText = HUDManager.Instance.chatText;
			((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "\n<color=#FF0000>Running Shoes is active!</color>";
			foreach (CustomTerminalNode node in UpgradeBus.instance.terminalNodes)
			{
				if (node.Name.ToLower() == "running shoes" && node.Price > 0)
				{
					node.Price /= 2;
				}
			}
			UpgradeBus.instance.UpgradeObjects.Add("Running Shoes", ((Component)this).gameObject);
			load();
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
		}

		public override void Increment()
		{
			PlayerControllerB[] array = Object.FindObjectsOfType<PlayerControllerB>();
			PlayerControllerB[] array2 = array;
			foreach (PlayerControllerB val in array2)
			{
				val.movementSpeed += UpgradeBus.instance.cfg.MOVEMENT_INCREMENT;
			}
			UpgradeBus.instance.runningLevel++;
			foreach (CustomTerminalNode terminalNode in UpgradeBus.instance.terminalNodes)
			{
				if (terminalNode.Name.ToLower() == "running shoes")
				{
					terminalNode.Description = $"You can run {UpgradeBus.instance.cfg.MOVEMENT_SPEED - 4.6f + UpgradeBus.instance.cfg.MOVEMENT_INCREMENT * (float)UpgradeBus.instance.runningLevel} units faster";
				}
			}
		}

		public override void load()
		{
			float num = 0f;
			for (int i = 0; i < UpgradeBus.instance.runningLevel; i++)
			{
				num += UpgradeBus.instance.cfg.MOVEMENT_INCREMENT;
			}
			PlayerControllerB[] array = Object.FindObjectsOfType<PlayerControllerB>();
			PlayerControllerB[] array2 = array;
			foreach (PlayerControllerB val in array2)
			{
				val.movementSpeed += num;
			}
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "runningShoeScript";
		}
	}
	internal class strongerScannerScript : BaseUpgrade
	{
		private void Start()
		{
			((MonoBehaviour)this).StartCoroutine(lateApply());
		}

		private IEnumerator lateApply()
		{
			yield return (object)new WaitForSeconds(1f);
			UpgradeBus.instance.scannerUpgrade = true;
			TextMeshProUGUI chatText = HUDManager.Instance.chatText;
			((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "\n<color=#FF0000>Better Scanner is active!</color>";
			UpgradeBus.instance.UpgradeObjects.Add("Better Scanner", ((Component)this).gameObject);
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
			load();
		}

		public override void Increment()
		{
			foreach (CustomTerminalNode terminalNode in UpgradeBus.instance.terminalNodes)
			{
				if (terminalNode.Name.ToLower() == "better scanner")
				{
					terminalNode.Description = $"Can scan the ship from an additional {UpgradeBus.instance.cfg.SHIP_AND_ENTRANCE_DISTANCE_INCREASE} units away.  \nCan scan all other nodes from an additional {UpgradeBus.instance.cfg.NODE_DISTANCE_INCREASE} units away.";
					if (!UpgradeBus.instance.cfg.REQUIRE_LINE_OF_SIGHT)
					{
						terminalNode.Description += "  \nDoes not require Line of Sight!";
					}
				}
			}
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "strongerScannerScript";
		}
	}
	internal class strongLegsScript : BaseUpgrade
	{
		private void Start()
		{
			((MonoBehaviour)this).StartCoroutine(lateApply());
		}

		private IEnumerator lateApply()
		{
			yield return (object)new WaitForSeconds(1f);
			UpgradeBus.instance.strongLegs = true;
			PlayerControllerB[] players = Object.FindObjectsOfType<PlayerControllerB>();
			PlayerControllerB[] array = players;
			foreach (PlayerControllerB player in array)
			{
				player.jumpForce = UpgradeBus.instance.cfg.JUMP_FORCE;
			}
			TextMeshProUGUI chatText = HUDManager.Instance.chatText;
			((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "\n<color=#FF0000>Strong Legs is active!</color>";
			foreach (CustomTerminalNode node in UpgradeBus.instance.terminalNodes)
			{
				if (node.Name.ToLower() == "strong legs" && node.Price > 0)
				{
					node.Price /= 2;
				}
			}
			UpgradeBus.instance.UpgradeObjects.Add("Strong Legs", ((Component)this).gameObject);
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
			load();
		}

		public override void Increment()
		{
			UpgradeBus.instance.legLevel++;
			foreach (CustomTerminalNode terminalNode in UpgradeBus.instance.terminalNodes)
			{
				if (terminalNode.Name.ToLower() == "strong legs")
				{
					terminalNode.Description = $"Can jump an additional {UpgradeBus.instance.cfg.JUMP_FORCE - 13f + (float)UpgradeBus.instance.legLevel * UpgradeBus.instance.cfg.JUMP_FORCE_INCREMENT} units high.";
					PlayerControllerB[] array = Object.FindObjectsOfType<PlayerControllerB>();
					PlayerControllerB[] array2 = array;
					foreach (PlayerControllerB val in array2)
					{
						val.jumpForce += UpgradeBus.instance.cfg.JUMP_FORCE_INCREMENT;
					}
				}
			}
		}

		public override void load()
		{
			float num = 0f;
			for (int i = 0; i < UpgradeBus.instance.legLevel; i++)
			{
				num += UpgradeBus.instance.cfg.JUMP_FORCE_INCREMENT;
			}
			PlayerControllerB[] array = Object.FindObjectsOfType<PlayerControllerB>();
			PlayerControllerB[] array2 = array;
			foreach (PlayerControllerB val in array2)
			{
				val.jumpForce += num;
			}
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "strongLegsScript";
		}
	}
	public class terminalFlashScript : BaseUpgrade
	{
		private void Start()
		{
			((MonoBehaviour)this).StartCoroutine(lateApply());
		}

		private IEnumerator lateApply()
		{
			yield return (object)new WaitForSeconds(1f);
			UpgradeBus.instance.terminalFlash = true;
			UpgradeBus.instance.flashScript = this;
			TextMeshProUGUI chatText = HUDManager.Instance.chatText;
			((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "\n<color=#FF0000>Discombobulator is active!\nType 'cooldown' into the terminal for info!!!</color>";
			foreach (CustomTerminalNode node in UpgradeBus.instance.terminalNodes)
			{
				if (node.Name.ToLower() == "discombobulator" && node.Price > 0)
				{
					node.Price /= 2;
				}
			}
			UpgradeBus.instance.UpgradeObjects.Add("Discombobulator", ((Component)this).gameObject);
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
			load();
		}

		public override void Increment()
		{
			UpgradeBus.instance.discoLevel++;
			foreach (CustomTerminalNode terminalNode in UpgradeBus.instance.terminalNodes)
			{
				if (terminalNode.Name.ToLower() == "discombobulator")
				{
					terminalNode.Description = $"Enemies are stunned for {UpgradeBus.instance.cfg.DISCOMBOBULATOR_STUN_DURATION + (float)UpgradeBus.instance.discoLevel * UpgradeBus.instance.cfg.DISCOMBOBULATOR_INCREMENT} seconds.";
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void PlayAudioAndUpdateCooldownServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1135781697u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1135781697u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					PlayAudioAndUpdateCooldownClientRpc();
				}
			}
		}

		[ClientRpc]
		private void PlayAudioAndUpdateCooldownClientRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1412806528u, val, (RpcDelivery)0);
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1412806528u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost))
			{
				return;
			}
			Terminal component = GameObject.Find("TerminalScript").GetComponent<Terminal>();
			component.terminalAudio.maxDistance = 100f;
			component.terminalAudio.PlayOneShot(UpgradeBus.instance.flashNoise);
			((MonoBehaviour)this).StartCoroutine(ResetRange(component));
			UpgradeBus.instance.flashCooldown = UpgradeBus.instance.cfg.DISCOMBOBULATOR_COOLDOWN;
			Collider[] array = Physics.OverlapSphere(((Component)component).transform.position, UpgradeBus.instance.cfg.DISCOMBOBULATOR_RADIUS, 524288);
			if (array.Length == 0)
			{
				return;
			}
			for (int i = 0; i < array.Length; i++)
			{
				EnemyAICollisionDetect component2 = ((Component)array[i]).GetComponent<EnemyAICollisionDetect>();
				if ((Object)(object)component2 != (Object)null)
				{
					component2.mainScript.SetEnemyStunned(true, UpgradeBus.instance.cfg.DISCOMBOBULATOR_STUN_DURATION + UpgradeBus.instance.cfg.DISCOMBOBULATOR_INCREMENT * (float)UpgradeBus.instance.discoLevel, (PlayerControllerB)null);
				}
			}
		}

		private IEnumerator ResetRange(Terminal terminal)
		{
			yield return (object)new WaitForSeconds(2f);
			terminal.terminalAudio.maxDistance = 17f;
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_terminalFlashScript()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(1135781697u, new RpcReceiveHandler(__rpc_handler_1135781697));
			NetworkManager.__rpc_func_table.Add(1412806528u, new RpcReceiveHandler(__rpc_handler_1412806528));
		}

		private static void __rpc_handler_1135781697(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((terminalFlashScript)(object)target).PlayAudioAndUpdateCooldownServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1412806528(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((terminalFlashScript)(object)target).PlayAudioAndUpdateCooldownClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "terminalFlashScript";
		}
	}
	internal class TPButtonScript : GrabbableObject
	{
		public AudioClip ItemBreak;

		public AudioClip error;

		public AudioClip buttonPress;

		private AudioSource audio;

		public override void Start()
		{
			((GrabbableObject)this).Start();
			audio = ((Component)this).GetComponent<AudioSource>();
			((Component)this).gameObject.GetComponent<NetworkObject>().Spawn(false);
		}

		public override void DiscardItem()
		{
			base.playerHeldBy.activatingItem = false;
			((GrabbableObject)this).DiscardItem();
		}

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			((GrabbableObject)this).ItemActivate(used, buttonDown);
			if (!Mouse.current.leftButton.isPressed)
			{
				return;
			}
			audio.PlayOneShot(buttonPress);
			if (!base.itemUsedUp)
			{
				ShipTeleporter[] array = Object.FindObjectsOfType<ShipTeleporter>();
				ShipTeleporter val = null;
				ShipTeleporter[] array2 = array;
				foreach (ShipTeleporter val2 in array2)
				{
					if (!val2.isInverseTeleporter)
					{
						val = val2;
						break;
					}
				}
				if ((Object)(object)val == (Object)null)
				{
					audio.PlayOneShot(error);
					return;
				}
				int num = -1;
				for (int j = 0; j < StartOfRound.Instance.mapScreen.radarTargets.Count(); j++)
				{
					if ((Object)(object)((Component)StartOfRound.Instance.mapScreen.radarTargets[j].transform).gameObject.GetComponent<PlayerControllerB>() == (Object)(object)base.playerHeldBy)
					{
						num = j;
					}
				}
				if (num == -1)
				{
					StartOfRound.Instance.mapScreen.targetedPlayer = base.playerHeldBy;
					UpgradeBus.instance.TPButtonPressed = true;
					val.PressTeleportButtonOnLocalClient();
					if (Random.Range(0f, 1f) > UpgradeBus.instance.cfg.CHANCE_TO_BREAK)
					{
						audio.PlayOneShot(ItemBreak);
						base.itemUsedUp = true;
						base.playerHeldBy.DespawnHeldObject();
					}
				}
				else
				{
					StartOfRound.Instance.mapScreen.SwitchRadarTargetAndSync(num);
					((MonoBehaviour)this).StartCoroutine(WaitToTP(val));
				}
			}
			else
			{
				audio.PlayOneShot(error);
			}
		}

		private IEnumerator WaitToTP(ShipTeleporter tele)
		{
			yield return (object)new WaitForSeconds(0.15f);
			ReqUpdateTpDropStatusServerRpc();
			tele.PressTeleportButtonOnLocalClient();
			if (Random.Range(0f, 1f) < UpgradeBus.instance.cfg.CHANCE_TO_BREAK)
			{
				audio.PlayOneShot(ItemBreak);
				base.itemUsedUp = true;
				TextMeshProUGUI chatText = HUDManager.Instance.chatText;
				((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "\n<color=#FF0000>The teleporter button has suffered irreparable damage and destroyed itself!</color>";
				base.playerHeldBy.DespawnHeldObject();
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void ReqUpdateTpDropStatusServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3777354640u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3777354640u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					ChangeTPButtonPressedClientRpc();
				}
			}
		}

		[ClientRpc]
		private void ChangeTPButtonPressedClientRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3413730949u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3413730949u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					UpgradeBus.instance.TPButtonPressed = true;
				}
			}
		}

		protected override void __initializeVariables()
		{
			((GrabbableObject)this).__initializeVariables();
		}

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_TPButtonScript()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(3777354640u, new RpcReceiveHandler(__rpc_handler_3777354640));
			NetworkManager.__rpc_func_table.Add(3413730949u, new RpcReceiveHandler(__rpc_handler_3413730949));
		}

		private static void __rpc_handler_3777354640(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((TPButtonScript)(object)target).ReqUpdateTpDropStatusServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3413730949(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((TPButtonScript)(object)target).ChangeTPButtonPressedClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "TPButtonScript";
		}
	}
	public class trapDestroyerScript : BaseUpgrade
	{
		private void Start()
		{
			((MonoBehaviour)this).StartCoroutine(lateApply());
		}

		private IEnumerator lateApply()
		{
			yield return (object)new WaitForSeconds(1f);
			UpgradeBus.instance.DestroyTraps = true;
			UpgradeBus.instance.trapHandler = this;
			TextMeshProUGUI chatText = HUDManager.Instance.chatText;
			((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "\n<color=#FF0000>Malware Broadcaster is active!</color>";
			UpgradeBus.instance.UpgradeObjects.Add("Malware Broadcaster", ((Component)this).gameObject);
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
			load();
		}

		[ServerRpc(RequireOwnership = false)]
		public void ReqDestroyObjectServerRpc(NetworkObjectReference go)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: 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_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1254388238u, val, (RpcDelivery)0);
				((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref go, default(ForNetworkSerializable));
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1254388238u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 || (!networkManager.IsServer && !networkManager.IsHost))
			{
				return;
			}
			NetworkObject val3 = default(NetworkObject);
			((NetworkObjectReference)(ref go)).TryGet(ref val3, (NetworkManager)null);
			if ((Object)(object)val3 == (Object)null)
			{
				HUDManager.Instance.AddTextToChatOnServer("Can't retrieve obj", 0);
			}
			else if (((Object)((Component)val3).gameObject).name == "Landmine(Clone)" || ((Object)((Component)val3).gameObject).name == "TurretContainer(Clone)")
			{
				if (UpgradeBus.instance.cfg.EXPLODE_TRAP)
				{
					SpawnExplosionClientRpc(((Component)val3).gameObject.transform.position);
				}
				Object.Destroy((Object)(object)((Component)val3).gameObject);
			}
		}

		[ClientRpc]
		private void SpawnExplosionClientRpc(Vector3 position)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: 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_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3507995715u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe(ref position);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3507995715u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost) && UpgradeBus.instance.cfg.EXPLODE_TRAP)
				{
					Landmine.SpawnExplosion(position + Vector3.up, true, 5.7f, 6.4f);
				}
			}
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_trapDestroyerScript()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(1254388238u, new RpcReceiveHandler(__rpc_handler_1254388238));
			NetworkManager.__rpc_func_table.Add(3507995715u, new RpcReceiveHandler(__rpc_handler_3507995715));
		}

		private static void __rpc_handler_1254388238(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: 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_0044: 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_005e: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				NetworkObjectReference go = default(NetworkObjectReference);
				((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref go, default(ForNetworkSerializable));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((trapDestroyerScript)(object)target).ReqDestroyObjectServerRpc(go);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3507995715(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0036: 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_0050: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				Vector3 position = default(Vector3);
				((FastBufferReader)(ref reader)).ReadValueSafe(ref position);
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((trapDestroyerScript)(object)target).SpawnExplosionClientRpc(position);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "trapDestroyerScript";
		}
	}
}
namespace MoreShipUpgrades.Patches
{
	[HarmonyPatch(typeof(HUDManager))]
	internal class HUDManagerPatcher
	{
		[HarmonyPostfix]
		[HarmonyPatch("MeetsScanNodeRequirements")]
		private static void alterReqs(ref HUDManager __instance, ScanNodeProperties node, ref bool __result, PlayerControllerB playerScript)
		{
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			if (UpgradeBus.instance.scannerUpgrade)
			{
				float num = ((node.headerText == "Main entrance" || node.headerText == "Ship") ? UpgradeBus.instance.cfg.SHIP_AND_ENTRANCE_DISTANCE_INCREASE : UpgradeBus.instance.cfg.NODE_DISTANCE_INCREASE);
				if ((Object)(object)node == (Object)null)
				{
					__result = false;
					return;
				}
				if (UpgradeBus.instance.cfg.REQUIRE_LINE_OF_SIGHT && Physics.Linecast(((Component)playerScript.gameplayCamera).transform.position, ((Component)node).transform.position, 256, (QueryTriggerInteraction)1))
				{
					__result = false;
					return;
				}
				float num2 = Vector3.Distance(((Component)playerScript).transform.position, ((Component)node).transform.position);
				__result = num2 < (float)node.maxRange + num && num2 > (float)node.minRange;
			}
		}
	}
	[HarmonyPatch(typeof(GameNetworkManager))]
	internal class GameNetworkManagerPatcher
	{
		[HarmonyPostfix]
		[HarmonyPatch("Disconnect")]
		private static void ResetUpgradeBus()
		{
			UpgradeBus.instance.ResetAllValues();
		}

		[HarmonyPrefix]
		[HarmonyPatch("SaveGame")]
		private static void saveLGU(GameNetworkManager __instance)
		{
			if (__instance.isHostingGame)
			{
				LGUStore.instance.ServerSaveFileServerRpc();
			}
		}
	}
	[HarmonyPatch(typeof(DeleteFileButton))]
	internal class DeleteButtonPatcher
	{
		[HarmonyPostfix]
		[HarmonyPatch("DeleteFile")]
		private static void deleteLGUFile(DeleteFileButton __instance)
		{
			string path = Path.Combine(Application.persistentDataPath, $"LGU_{__instance.fileToDelete}.json");
			if (File.Exists(path))
			{
				File.Delete(path);
			}
		}
	}
	[HarmonyPatch(typeof(PlayerControllerB))]
	internal class PlayerControllerBPatcher
	{
		[HarmonyPrefix]
		[HarmonyPatch("DamagePlayer")]
		private static void beekeeperReduceDamage(ref int damageNumber, CauseOfDeath causeOfDeath)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Invalid comparison between Unknown and I4
			if (UpgradeBus.instance.beekeeper && (int)causeOfDeath == 11 && damageNumber == 10)
			{
				damageNumber = Mathf.Clamp((int)((float)damageNumber * (UpgradeBus.instance.cfg.BEEKEEPER_DAMAGE_MULTIPLIER - (float)UpgradeBus.instance.beeLevel * UpgradeBus.instance.cfg.BEEKEEPER_DAMAGE_MULTIPLIER_INCREMENT)), 0, 100);
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch("DamagePlayerServerRpc")]
		private static void beekeeperReduceDamageServer(ref int damageNumber)
		{
			if (UpgradeBus.instance.beekeeper && damageNumber == 10)
			{
				damageNumber = Mathf.Clamp((int)((float)damageNumber * (UpgradeBus.instance.cfg.BEEKEEPER_DAMAGE_MULTIPLIER - (float)UpgradeBus.instance.beeLevel * UpgradeBus.instance.cfg.BEEKEEPER_DAMAGE_MULTIPLIER_INCREMENT)), 0, 100);
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch("DamagePlayerClientRpc")]
		private static void beekeeperReduceDamageClient(ref int damageNumber)
		{
			if (UpgradeBus.instance.beekeeper && damageNumber == 10)
			{
				damageNumber = Mathf.Clamp((int)((float)damageNumber * (UpgradeBus.instance.cfg.BEEKEEPER_DAMAGE_MULTIPLIER - (float)UpgradeBus.instance.beeLevel * UpgradeBus.instance.cfg.BEEKEEPER_DAMAGE_MULTIPLIER_INCREMENT)), 0, 100);
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch("DamageOnOtherClients")]
		private static void beekeeperReduceDamageOther(ref int damageNumber)
		{
			if (UpgradeBus.instance.beekeeper && damageNumber == 10)
			{
				damageNumber = Mathf.Clamp((int)((float)damageNumber * (UpgradeBus.instance.cfg.BEEKEEPER_DAMAGE_MULTIPLIER - (float)UpgradeBus.instance.beeLevel * UpgradeBus.instance.cfg.BEEKEEPER_DAMAGE_MULTIPLIER_INCREMENT)), 0, 100);
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch("DropAllHeldItems")]
		private static bool DontDropItems(PlayerControllerB __instance)
		{
			if (UpgradeBus.instance.TPButtonPressed)
			{
				UpgradeBus.instance.TPButtonPressed = false;
				return false;
			}
			return true;
		}

		[HarmonyPrefix]
		[HarmonyPatch("Update")]
		private static void noCarryWeight(ref PlayerControllerB __instance)
		{
			if (!UpgradeBus.instance.exoskeleton || __instance.ItemSlots.Length == 0 || !((Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)(object)__instance))
			{
				return;
			}
			UpgradeBus.instance.alteredWeight = 1f;
			for (int i = 0; i < __instance.ItemSlots.Length; i++)
			{
				GrabbableObject val = __instance.ItemSlots[i];
				if ((Object)(object)val != (Object)null)
				{
					UpgradeBus.instance.alteredWeight += Mathf.Clamp(val.itemProperties.weight - 1f, 0f, 10f) * (UpgradeBus.instance.cfg.CARRY_WEIGHT_REDUCTION - (float)UpgradeBus.instance.backLevel * UpgradeBus.instance.cfg.CARRY_WEIGHT_INCREMENT);
				}
			}
			__instance.carryWeight = UpgradeBus.instance.alteredWeight;
			if (__instance.carryWeight < 1f)
			{
				__instance.carryWeight = 1f;
			}
		}
	}
	[HarmonyPatch(typeof(RoundManager))]
	internal class RoundManagerPatcher
	{
		[HarmonyPrefix]
		[HarmonyPatch("PlayAudibleNoise")]
		private static void MakeFootstepsQuiet(ref float noiseRange)
		{
			if (UpgradeBus.instance.softSteps)
			{
				noiseRange -= UpgradeBus.instance.cfg.NOISE_REDUCTION;
			}
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	internal class StartOfRoundPatcher
	{
		[HarmonyPrefix]
		[HarmonyPatch("Start")]
		private static void InitLGUStore(PlayerControllerB __instance)
		{
			if (((NetworkBehaviour)__instance).NetworkManager.IsHost || ((NetworkBehaviour)__instance).NetworkManager.IsServer)
			{
				GameObject val = Object.Instantiate<GameObject>(UpgradeBus.instance.modStorePrefab);
				val.GetComponent<NetworkObject>().Spawn(false);
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch("playersFiredGameOver")]
		private static void GameOverResetUpgradeManager(StartOfRound __instance)
		{
			UpgradeBus.instance.ResetAllValues();
			if (((NetworkBehaviour)__instance).NetworkManager.IsHost || ((NetworkBehaviour)__instance).NetworkManager.IsServer)
			{
				LGUStore.instance.PlayersFired();
			}
			PlayerControllerB[] array = Object.FindObjectsOfType<PlayerControllerB>();
			PlayerControllerB[] array2 = array;
			foreach (PlayerControllerB val in array2)
			{
				val.movementSpeed = 4.6f;
				val.sprintTime = 11f;
				val.jumpForce = 13f;
			}
		}
	}
	[HarmonyPatch(typeof(TerminalAccessibleObject))]
	internal class TerminalAccessibleObjectPatcher
	{
		[HarmonyPrefix]
		[HarmonyPatch("CallFunctionFromTerminal")]
		private static bool DestroyObject(ref TerminalAccessibleObject __instance, ref float ___currentCooldownTimer, ref bool ___inCooldown)
		{
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			if (!UpgradeBus.instance.DestroyTraps || ((Component)__instance).gameObject.layer != LayerMask.NameToLayer("MapHazards"))
			{
				return true;
			}
			if (UpgradeBus.instance.cfg.DESTROY_TRAP)
			{
				UpgradeBus.instance.trapHandler.ReqDestroyObjectServerRpc(new NetworkObjectReference(((Component)((Component)__instance).gameObject.transform.parent).gameObject.GetComponent<NetworkObject>()));
				return false;
			}
			if (!___inCooldown)
			{
				___currentCooldownTimer = UpgradeBus.instance.cfg.DISARM_TIME;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Terminal))]
	internal class TerminalPatcher
	{
		[HarmonyPostfix]
		[HarmonyPatch("Update")]
		private static void Counter()
		{
			if (UpgradeBus.instance.flashCooldown > 0f)
			{
				UpgradeBus.instance.flashCooldown -= Time.deltaTime;
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("ParsePlayerSentence")]
		private static void DestroyObject(ref Terminal __instance, ref TerminalNode __result)
		{
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Expected O, but got Unknown
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Expected O, but got Unknown
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Expected O, but got Unknown
			//IL_02e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f0: Expected O, but got Unknown
			//IL_0231: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Expected O, but got Unknown
			//IL_02a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Expected O, but got Unknown
			//IL_026d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0274: Expected O, but got Unknown
			//IL_03d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_03dd: Expected O, but got Unknown
			//IL_05ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_05f1: Expected O, but got Unknown
			string text = __instance.screenText.text.Substring(__instance.screenText.text.Length - __instance.textAdded);
			if (text.ToLower() == "initattack" || text.ToLower() == "atk")
			{
				if (!UpgradeBus.instance.terminalFlash)
				{
					TerminalNode val = new TerminalNode();
					val.displayText = "You don't have access to this command yet. Purchase the 'Discombobulator'.";
					val.clearPreviousText = true;
					__result = val;
					return;
				}
				if (UpgradeBus.instance.flashCooldown > 0f)
				{
					TerminalNode val2 = new TerminalNode();
					val2.displayText = $"You can discombobulate again in {Mathf.Round(UpgradeBus.instance.flashCooldown)} seconds.\nType 'cooldown' or 'cd' to check discombobulation cooldown.";
					val2.clearPreviousText = true;
					__result = val2;
					return;
				}
				RoundManager.Instance.PlayAudibleNoise(((Component)__instance).transform.position, 60f, 0.8f, 0, false, 14155);
				UpgradeBus.instance.flashScript.PlayAudioAndUpdateCooldownServerRpc();
				TerminalNode val3 = new TerminalNode();
				Collider[] array = Physics.OverlapSphere(((Component)__instance).transform.position, UpgradeBus.instance.cfg.DISCOMBOBULATOR_RADIUS, 524288);
				if (array.Length != 0)
				{
					val3.displayText = $"Stun grenade hit {array.Length} enemies.";
					val3.clearPreviousText = true;
					__result = val3;
					if (UpgradeBus.instance.cfg.DISCOMBOBULATOR_NOTIFY_CHAT)
					{
						((MonoBehaviour)__instance).StartCoroutine(CountDownChat(UpgradeBus.instance.cfg.DISCOMBOBULATOR_STUN_DURATION + UpgradeBus.instance.cfg.DISCOMBOBULATOR_INCREMENT * (float)UpgradeBus.instance.discoLevel));
					}
				}
				else
				{
					val3.displayText = "No stunned enemies detected.";
					val3.clearPreviousText = true;
					__result = val3;
				}
				return;
			}
			if (text.ToLower() == "cooldown" || text.ToLower() == "cd")
			{
				if (!UpgradeBus.instance.terminalFlash)
				{
					TerminalNode val4 = new TerminalNode();
					val4.displayText = "You don't have access to this command yet. Purchase 'Discombobulator'.";
					val4.clearPreviousText = true;
					__result = val4;
				}
				else if (UpgradeBus.instance.flashCooldown > 0f)
				{
					TerminalNode val5 = new TerminalNode();
					val5.displayText = $"You can discombobulate again in {Mathf.Round(UpgradeBus.instance.flashCooldown)} seconds.";
					val5.clearPreviousText = true;
					__result = val5;
				}
				else
				{
					TerminalNode val6 = new TerminalNode();
					val6.displayText = "Discombobulate is ready, Type 'initattack' or 'atk' to execute.";
					val6.clearPreviousText = true;
					__result = val6;
				}
				return;
			}
			if (text.ToLower() == "lategame")
			{
				TerminalNode val7 = new TerminalNode();
				val7.clearPreviousText = true;
				val7.displayText = "Late Game Upgrades\n\nType `lategame store` to view upgrades.\n\nMost of the mod is configurable via the config file in BepInEx/config/\n\nThis mod patches and changes quite a bit and may conflict with other mods at the moment.";
				val7.displayText += "\n\nUpgrades are applied immediately after purchasing. You will see a red chat message when they are applied.";
				val7.displayText += "\n\nUse the info command to get info about an item. EX: `info beekeeper`";
				val7.displayText += "\n\nYou must type the exact name of the upgrade (case insensitve). I removed the vanilla keyword integration as it's prone to stepping on the toes of other keywords.";
				val7.displayText += "\n\nHave fun and please report bugs to the Lethal Company modding discord";
				__result = val7;
				return;
			}
			if (text.ToLower() == "lategame store")
			{
				__result = UpgradeBus.instance.ConstructNode();
				return;
			}
			foreach (CustomTerminalNode terminalNode in UpgradeBus.instance.terminalNodes)
			{
				if (text.ToLower() == terminalNode.Name.ToLower())
				{
					TerminalNode val8 = new TerminalNode();
					val8.clearPreviousText = true;
					if (__instance.groupCredits >= terminalNode.Price && (!terminalNode.Unlocked || terminalNode.MaxUpgrade > terminalNode.CurrentUpgrade))
					{
						Terminal obj = __instance;
						obj.groupCredits -= terminalNode.Price;
						if (((NetworkBehaviour)__instance).NetworkManager.IsServer || ((NetworkBehaviour)__instance).NetworkManager.IsHost)
						{
							__instance.SyncTerminalValuesClientRpc(__instance.groupCredits, 0, (int[])null, (int[])null);
						}
						else
						{
							__instance.SyncTerminalValuesServerRpc();
						}
						if (!terminalNode.Unlocked)
						{
							LGUStore.instance.ReqSpawnServerRpc(terminalNode.Name);
							if (terminalNode.MaxUpgrade != 0)
							{
								val8.displayText = $"You Upgraded {terminalNode.Name} to level {terminalNode.CurrentUpgrade + 1}  \n";
							}
							else
							{
								val8.displayText = "You Purchased " + terminalNode.Name + "  \n";
							}
						}
						else if (terminalNode.Unlocked && terminalNode.MaxUpgrade > terminalNode.CurrentUpgrade)
						{
							LGUStore.instance.ReqSpawnServerRpc(terminalNode.Name, increment: true);
							val8.displayText = $"You Upgraded {terminalNode.Name} to level {terminalNode.CurrentUpgrade + 1} \n";
						}
					}
					else if (terminalNode.Unlocked && __instance.groupCredits >= terminalNode.Price)
					{
						if (terminalNode.MaxUpgrade == 0)
						{
							val8.displayText = "You already unlocked this upgrade.  \n";
						}
						else
						{
							val8.displayText = "This upgrade is already max level  \n";
						}
					}
					else
					{
						val8.displayText = "You can't afford this item.  \n";
					}
					__result = val8;
				}
				else if (text.ToLower() == "info " + terminalNode.Name.ToLower())
				{
					TerminalNode val9 = new TerminalNode();
					val9.displayText = terminalNode.Description + "\n\n";
					val9.clearPreviousText = true;
					__result = val9;
				}
			}
		}

		private static IEnumerator CountDownChat(float count)
		{
			((TMP_Text)HUDManager.Instance.chatText).text = "";
			TextMeshProUGUI chatText = HUDManager.Instance.chatText;
			((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "<color=#FFFFFF>Stun Duration: " + count.ToString("F1") + " seconds.</color>";
			while (count > 0f)
			{
				yield return (object)new WaitForSeconds(1f);
				count -= 1f;
				((TMP_Text)HUDManager.Instance.chatText).text = "";
				TextMeshProUGUI chatText2 = HUDManager.Instance.chatText;
				((TMP_Text)chatText2).text = ((TMP_Text)chatText2).text + "<color=#FFFFFF>Stun Duration: " + count.ToString("F1") + " seconds.</color>";
			}
			((TMP_Text)HUDManager.Instance.chatText).text = "";
			TextMeshProUGUI chatText3 = HUDManager.Instance.chatText;
			((TMP_Text)chatText3).text = ((TMP_Text)chatText3).text + "\n<color=#FF0000>Effected enemies are no longer stunned!</color>";
		}
	}
}
namespace MoreShipUpgrades.Misc
{
	public class BaseUpgrade : NetworkBehaviour
	{
		public virtual void Increment()
		{
		}

		public virtual void load()
		{
		}

		protected override void __initializeVariables()
		{
			((NetworkBehaviour)this).__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "BaseUpgrade";
		}
	}
	public class CustomTerminalNode
	{
		public string Name;

		public int Price;

		public string Description;

		public GameObject Prefab;

		public bool Unlocked = false;

		public int MaxUpgrade;

		public int CurrentUpgrade { get; set; }

		public CustomTerminalNode(string name, int price, string description, GameObject prefab, int maxUpgrade = 0)
		{
			Name = name;
			Price = price;
			Description = description;
			Prefab = prefab;
			MaxUpgrade = maxUpgrade;
		}

		public CustomTerminalNode Copy()
		{
			return new CustomTerminalNode(Name = Name, Price = Price, Description = Description, Prefab = Prefab, MaxUpgrade = MaxUpgrade);
		}
	}
	public class PluginConfig
	{
		private readonly ConfigFile configFile;

		public bool ADVANCED_TELE_ENABLED { get; set; }

		public bool WEAK_TELE_ENABLED { get; set; }

		public bool BEEKEEPER_ENABLED { get; set; }

		public bool BIGGER_LUNGS_ENABLED { get; set; }

		public bool BACK_MUSCLES_ENABLED { get; set; }

		public bool LIGHT_FOOTED_ENABLED { get; set; }

		public bool NIGHT_VISION_ENABLED { get; set; }

		public bool RUNNING_SHOES_ENABLED { get; set; }

		public bool BETTER_SCANNER_ENABLED { get; set; }

		public bool STRONG_LEGS_ENABLED { get; set; }

		public bool DISCOMBOBULATOR_ENABLED { get; set; }

		public bool MALWARE_BROADCASTER_ENABLED { get; set; }

		public int ADVANCED_TELE_PRICE { get; set; }

		public int WEAK_TELE_PRICE { get; set; }

		public int BEEKEEPER_PRICE { get; set; }

		public int BIGGER_LUNGS_PRICE { get; set; }

		public int BACK_MUSCLES_PRICE { get; set; }

		public int LIGHT_FOOTED_PRICE { get; set; }

		public int NIGHT_VISION_PRICE { get; set; }

		public int RUNNING_SHOES_PRICE { get; set; }

		public int BETTER_SCANNER_PRICE { get; set; }

		public int STRONG_LEGS_PRICE { get; set; }

		public int DISCOMBOBULATOR_PRICE { get; set; }

		public int MALWARE_BROADCASTER_PRICE { get; set; }

		public bool KEEP_ITEMS_ON_TELE { get; set; }

		public float SPRINT_TIME_INCREASE { get; set; }

		public float MOVEMENT_SPEED { get; set; }

		public float JUMP_FORCE { get; set; }

		public bool DESTROY_TRAP { get; set; }

		public float DISARM_TIME { get; set; }

		public bool EXPLODE_TRAP { get; set; }

		public bool REQUIRE_LINE_OF_SIGHT { get; set; }

		public float CARRY_WEIGHT_REDUCTION { get; set; }

		public float NODE_DISTANCE_INCREASE { get; set; }

		public float SHIP_AND_ENTRANCE_DISTANCE_INCREASE { get; set; }

		public float NOISE_REDUCTION { get; set; }

		public float DISCOMBOBULATOR_COOLDOWN { get; set; }

		public float ADV_CHANCE_TO_BREAK { get; set; }

		public float CHANCE_TO_BREAK { get; set; }

		public float BEEKEEPER_DAMAGE_MULTIPLIER { get; set; }

		public float BEEKEEPER_DAMAGE_MULTIPLIER_INCREMENT { get; set; }

		public float NIGHT_VIS_DRAIN_SPEED { get; set; }

		public float NIGHT_VIS_REGEN_SPEED { get; set; }

		public float DISCOMBOBULATOR_RADIUS { get; set; }

		public float DISCOMBOBULATOR_STUN_DURATION { get; set; }

		public bool DISCOMBOBULATOR_NOTIFY_CHAT { get; set; }

		public Color NIGHT_VIS_COLOR { get; set; }

		public float NIGHT_VIS_RANGE { get; set; }

		public float NIGHT_VIS_INTENSITY { get; set; }

		public float NIGHT_VIS_STARTUP { get; set; }

		public float NIGHT_VIS_EXHAUST { get; set; }

		public float CARRY_WEIGHT_INCREMENT { get; set; }

		public float MOVEMENT_INCREMENT { get; set; }

		public float SPRINT_TIME_INCREMENT { get; set; }

		public float NOISE_REDUCTION_INCREMENT { get; set; }

		public float JUMP_FORCE_INCREMENT { get; set; }

		public float DISCOMBOBULATOR_INCREMENT { get; set; }

		public PluginConfig(ConfigFile cfg)
		{
			configFile = cfg;
		}

		private T ConfigEntry<T>(string section, string key, T defaultVal, string description)
		{
			return configFile.Bind<T>(section, key, defaultVal, description).Value;
		}

		public void InitBindings()
		{
			//IL_0481: Unknown result type (might be due to invalid IL or missing references)
			//IL_048b: Unknown result type (might be due to invalid IL or missing references)
			ADVANCED_TELE_ENABLED = ConfigEntry("Advanced Portable Teleporter", "Enable Advanced Portable Teleporter", defaultVal: true, "");
			ADVANCED_TELE_PRICE = ConfigEntry("Advanced Portable Teleporter", "Price of Advanced Portable Teleporter", 1750, "");
			ADV_CHANCE_TO_BREAK = ConfigEntry("Advanced Portable Teleporter", "Chance to break on use", 0.1f, "value should be 0.00 - 1.00");
			WEAK_TELE_ENABLED = ConfigEntry("Portable Teleporter", "Enable Portable Teleporter", defaultVal: true, "");
			WEAK_TELE_PRICE = ConfigEntry("Portable Teleporter", "Price of Portable Teleporter", 300, "");
			CHANCE_TO_BREAK = ConfigEntry("Portable Teleporter", "Chance to break on use", 0.9f, "value should be 0.00 - 1.00");
			KEEP_ITEMS_ON_TELE = ConfigEntry("Portable Teleporter", "Keep Items When Using Portable Teleporters", defaultVal: true, "If set to false you will drop your items like when using the vanilla TP.");
			BEEKEEPER_ENABLED = ConfigEntry("Beekeeper", "Enable Beekeeper Upgrade", defaultVal: true, "Take no damage from bees");
			BEEKEEPER_PRICE = ConfigEntry("Beekeeper", "Price of Beekeeper Upgrade", 450, "");
			BEEKEEPER_DAMAGE_MULTIPLIER = ConfigEntry("Beekeeper", "Multiplied to incoming damage (rounded to int)", 0.64f, "Incoming damage from bees is 10.");
			BEEKEEPER_DAMAGE_MULTIPLIER_INCREMENT = ConfigEntry("Beekeeper", "Additional % Reduced per level", 0.15f, "Every time beekeeper is upgraded this value will be subtracted to the base multiplier above.");
			BIGGER_LUNGS_ENABLED = ConfigEntry("Bigger Lungs", "Enable Bigger Lungs Upgrade", defaultVal: true, "More Stamina");
			BIGGER_LUNGS_PRICE = ConfigEntry("Bigger Lungs", "Price of Bigger Lungs Upgrade", 700, "");
			SPRINT_TIME_INCREASE = ConfigEntry("Bigger Lungs", "SprintTime value", 17f, "Vanilla value is 11");
			SPRINT_TIME_INCREMENT = ConfigEntry("Bigger Lungs", "SprintTime Increment", 1.25f, "How much the above value is increased on upgrade.");
			RUNNING_SHOES_ENABLED = ConfigEntry("Running Shoes", "Enable Running Shoes Upgrade", defaultVal: true, "Run Faster");
			RUNNING_SHOES_PRICE = ConfigEntry("Running Shoes", "Price of Running Shoes Upgrade", 1000, "");
			MOVEMENT_SPEED = ConfigEntry("Running Shoes", "Movement Speed Value", 6f, "Vanilla value is 4.6");
			MOVEMENT_INCREMENT = ConfigEntry("Running Shoes", "Movement Speed Increment", 0.5f, "How much the above value is increased on upgrade.");
			STRONG_LEGS_ENABLED = ConfigEntry("Strong Legs", "Enable Strong Legs Upgrade", defaultVal: true, "Jump Higher");
			STRONG_LEGS_PRICE = ConfigEntry("Strong Legs", "Price of Strong Legs Upgrade", 300, "");
			JUMP_FORCE = ConfigEntry("Strong Legs", "Jump Force", 16f, "Vanilla value is 13");
			JUMP_FORCE_INCREMENT = ConfigEntry("Strong Legs", "Jump Force Increment", 0.75f, "How much the above value is increased on upgrade.");
			MALWARE_BROADCASTER_ENABLED = ConfigEntry("Malware Broadcaster", "Enable Malware Broadcaster Upgrade", defaultVal: true, "Explode Map Hazards");
			MALWARE_BROADCASTER_PRICE = ConfigEntry("Malware Broadcaster", "Price of Malware Broadcaster Upgrade", 650, "");
			DESTROY_TRAP = ConfigEntry("Malware Broadcaster", "Destroy Trap", defaultVal: true, "If false Malware Broadcaster will disable the trap for a long time instead of destroying.");
			DISARM_TIME = ConfigEntry("Malware Broadcaster", "Disarm Time", 7f, "If `Destroy Trap` is false this is the duration traps will be disabled.");
			EXPLODE_TRAP = ConfigEntry("Malware Broadcaster", "Explode Trap", defaultVal: true, "Destroy Trap must be true! If this is true when destroying a trap it will also explode.");
			LIGHT_FOOTED_ENABLED = ConfigEntry("Light Footed", "Enable Light Footed Upgrade", defaultVal: true, "Make less noise moving.");
			LIGHT_FOOTED_PRICE = ConfigEntry("Light Footed", "Price of Light Footed Upgrade", 350, "");
			NOISE_REDUCTION = ConfigEntry("Light Footed", "Noise Reduction", 7f, "Distance units to subtract from footstep noise.");
			NOISE_REDUCTION_INCREMENT = ConfigEntry("Light Footed", "Noise Reduction Increment", 1f, "The amount added to above value on upgrade.");
			NIGHT_VISION_ENABLED = ConfigEntry("Night Vision", "Enable Night Vision Upgrade", defaultVal: true, "Toggleable night vision.");
			NIGHT_VISION_PRICE = ConfigEntry("Night Vision", "Price of Night Vision Upgrade", 700, "");
			NIGHT_VIS_DRAIN_SPEED = ConfigEntry("Night Vision", "Multiplier for night vis battery drain", 0.1f, "Multiplied by timedelta. A value of 0.1 will result in a 10 second battery life.");
			NIGHT_VIS_REGEN_SPEED = ConfigEntry("Night Vision", "Multiplier for night vis battery regen", 0.05f, "Multiplied by timedelta.");
			NIGHT_VIS_COLOR = ConfigEntry<Color>("Night Vision", "Night Vision Color", Color.green, "The color your night vision light emits.");
			NIGHT_VIS_RANGE = ConfigEntry("Night Vision", "Night Vision Range", 2000f, "Kind of like the distance your night vision travels.");
			NIGHT_VIS_INTENSITY = ConfigEntry("Night Vision", "Night Vision Intensity", 1000f, "Kind of like the brightness of your Night Vision.");
			NIGHT_VIS_STARTUP = ConfigEntry("Night Vision", "Night Vision StartUp Cost", 0.1f, "The percent battery drained when turned on (0.1 = 10%).");
			NIGHT_VIS_EXHAUST = ConfigEntry("Night Vision", "Night Vision Exhaustion", 2f, "How many seconds night vision stays fully depleted.");
			DISCOMBOBULATOR_ENABLED = ConfigEntry("Discombobulator", "Enable Discombobulator Upgrade", defaultVal: true, "Stun enemies around the ship.");
			DISCOMBOBULATOR_PRICE = ConfigEntry("Discombobulator", "Price of Discombobulator Upgrade", 550, "");
			DISCOMBOBULATOR_COOLDOWN = ConfigEntry("Discombobulator", "Discombobulator Cooldown", 120f, "");
			DISCOMBOBULATOR_RADIUS = ConfigEntry("Discombobulator", "Discombobulator Effect Radius", 40f, "");
			DISCOMBOBULATOR_STUN_DURATION = ConfigEntry("Discombobulator", "Discombobulator Stun Duration", 7.5f, "");
			DISCOMBOBULATOR_NOTIFY_CHAT = ConfigEntry("Discombobulator", "Notify Local Chat of Enemy Stun Duration", defaultVal: true, "");
			DISCOMBOBULATOR_INCREMENT = ConfigEntry("Discombobulator", "Discombobulator Increment", 1f, "The amount added to stun duration on upgrade.");
			BETTER_SCANNER_ENABLED = ConfigEntry("Better Scanner", "Enable Better Scanner Upgrade", defaultVal: true, "Further scan distance, no LOS needed.");
			BETTER_SCANNER_PRICE = ConfigEntry("Better Scanner", "Price of Better Scanner Upgrade", 650, "");
			REQUIRE_LINE_OF_SIGHT = ConfigEntry("Better Scanner", "Require Line Of Sight", defaultVal: false, "Default mod value is false.");
			SHIP_AND_ENTRANCE_DISTANCE_INCREASE = ConfigEntry("Better Scanner", "Ship and Entrance node distance boost", 150f, "How much further away you can scan the ship and entrance.");
			NODE_DISTANCE_INCREASE = ConfigEntry("Better Scanner", "Node distance boost", 20f, "How much further away you can scan other nodes.");
			BACK_MUSCLES_ENABLED = ConfigEntry("Back Muscles", "Enable Back Muscles Upgrade", defaultVal: true, "Reduce carry weight");
			BACK_MUSCLES_PRICE = ConfigEntry("Back Muscles", "Price of Back Muscles Upgrade", 835, "");
			CARRY_WEIGHT_REDUCTION = ConfigEntry("Back Muscles", "Carry Weight Multiplier", 0.5f, "Your carry weight is multiplied by this.");
			CARRY_WEIGHT_INCREMENT = ConfigEntry("Back Muscles", "Carry Weight Increment", 0.1f, "Each upgrade subtracts this from the above coefficient.");
		}
	}
	internal static class Metadata
	{
		public const string GUID = "com.malco.lethalcompany.moreshipupgrades";

		public const string NAME = "More Ship Upgrades";

		public const string VERSION = "1.3.1";
	}
}
namespace MoreShipUpgrades.Managers
{
	public class LGUStore : NetworkBehaviour
	{
		public static LGUStore instance;

		public SaveInfo saveInfo;

		private static Dictionary<string, Func<SaveInfo, bool>> conditions = new Dictionary<string, Func<SaveInfo, bool>>
		{
			{
				"Malware Broadcaster",
				(SaveInfo saveInfo) => saveInfo.DestroyTraps
			},
			{
				"Light Footed",
				(SaveInfo saveInfo) => saveInfo.softSteps
			},
			{
				"Discombobulator",
				(SaveInfo SaveInfo) => SaveInfo.terminalFlash
			},
			{
				"Bigger Lungs",
				(SaveInfo SaveInfo) => SaveInfo.biggerLungs
			},
			{
				"Running Shoes",
				(SaveInfo SaveInfo) => SaveInfo.runningShoes
			},
			{
				"Night Vision",
				(SaveInfo SaveInfo) => SaveInfo.nightVision
			},
			{
				"Strong Legs",
				(SaveInfo SaveInfo) => SaveInfo.strongLegs
			},
			{
				"Better Scanner",
				(SaveInfo SaveInfo) => SaveInfo.scannerUpgrade
			},
			{
				"Beekeeper",
				(SaveInfo SaveInfo) => SaveInfo.beekeeper
			},
			{
				"Back Muscles",
				(SaveInfo SaveInfo) => SaveInfo.exoskeleton
			}
		};

		private static Dictionary<string, Func<SaveInfo, int>> levelConditions = new Dictionary<string, Func<SaveInfo, int>>
		{
			{
				"Malware Broadcaster",
				(SaveInfo saveInfo) => 0
			},
			{
				"Light Footed",
				(SaveInfo saveInfo) => saveInfo.lightLevel
			},
			{
				"Discombobulator",
				(SaveInfo saveInfo) => saveInfo.discoLevel
			},
			{
				"Bigger Lungs",
				(SaveInfo saveInfo) => saveInfo.lungLevel
			},
			{
				"Running Shoes",
				(SaveInfo saveInfo) => saveInfo.runningLevel
			},
			{
				"Night Vision",
				(SaveInfo saveInfo) => 0
			},
			{
				"Strong Legs",
				(SaveInfo saveInfo) => saveInfo.legLevel
			},
			{
				"Better Scanner",
				(SaveInfo saveInfo) => 0
			},
			{
				"Beekeeper",
				(SaveInfo saveInfo) => saveInfo.beeLevel
			},
			{
				"Back Muscles",
				(SaveInfo saveInfo) => saveInfo.backLevel
			}
		};

		private bool hasRun = false;

		private void Start()
		{
			instance = this;
			if (((NetworkBehaviour)this).NetworkManager.IsHost && !hasRun)
			{
				hasRun = true;
				string text = GameNetworkManager.Instance.saveFileNum.ToString();
				string path = Path.Combine(Application.persistentDataPath, "LGU_" + text + ".json");
				if (File.Exists(path))
				{
					string text2 = File.ReadAllText(path);
					saveInfo = JsonConvert.DeserializeObject<SaveInfo>(text2);
					UpdateUpgradeBus();
					HandleSpawns();
				}
				else
				{
					saveInfo = new SaveInfo();
					string contents = JsonConvert.SerializeObject((object)saveInfo);
					File.WriteAllText(path, contents);
				}
			}
			else
			{
				ShareSaveServerRpc();
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void ServerSaveFileServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2987346562u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2987346562u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					string text = GameNetworkManager.Instance.saveFileNum.ToString();
					string path = Path.Combine(Application.persistentDataPath, "LGU_" + text + ".json");
					saveInfo = new SaveInfo();
					string contents = JsonConvert.SerializeObject((object)saveInfo);
					File.WriteAllText(path, contents);
				}
			}
		}

		public void HandleSpawns()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			foreach (CustomTerminalNode terminalNode in UpgradeBus.instance.terminalNodes)
			{
				if (terminalNode.Unlocked && !UpgradeBus.instance.UpgradeObjects.Keys.ToList().Contains(terminalNode.Name))
				{
					GameObject val = Object.Instantiate<GameObject>(terminalNode.Prefab, Vector3.zero, Quaternion.identity);
					val.GetComponent<NetworkObject>().Spawn(false);
				}
			}
		}

		public void PlayersFired()
		{
			string text = GameNetworkManager.Instance.saveFileNum.ToString();
			string path = Path.Combine(Application.persistentDataPath, "LGU_" + text + ".json");
			saveInfo = new SaveInfo();
			string contents = JsonConvert.SerializeObject((object)saveInfo);
			File.WriteAllText(path, contents);
		}

		[ServerRpc(RequireOwnership = false)]
		public void ShareSaveServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3123934669u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3123934669u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					string json = JsonConvert.SerializeObject((object)saveInfo);
					ShareSaveClientRpc(json);
				}
			}
		}

		[ClientRpc]
		public void ShareSaveClientRpc(string json)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: 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)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(472891778u, val, (RpcDelivery)0);
				bool flag = json != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(json, false);
				}
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 472891778u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
			{
				saveInfo = JsonConvert.DeserializeObject<SaveInfo>(json);
				UpdateUpgradeBus();
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void SaveLGUDataServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2446161515u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2446161515u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					string text = GameNetworkManager.Instance.saveFileNum.ToString();
					string path = Path.Combine(Application.persistentDataPath, "LGU_" + text + ".json");
					string contents = JsonConvert.SerializeObject((object)new SaveInfo());
					File.WriteAllText(path, contents);
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void ReqSpawnServerRpc(string goName, bool increment = false)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: 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)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(642173559u, val, (RpcDelivery)0);
				bool flag = goName != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(goName, false);
				}
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref increment, default(ForPrimitives));
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 642173559u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage != 1 || (!networkManager.IsServer && !networkManager.IsHost))
			{
				return;
			}
			if (!increment)
			{
				foreach (CustomTerminalNode terminalNode in UpgradeBus.instance.terminalNodes)
				{
					if (terminalNode.Name == goName)
					{
						GameObject val3 = Object.Instantiate<GameObject>(terminalNode.Prefab, Vector3.zero, Quaternion.identity);
						val3.GetComponent<NetworkObject>().Spawn(false);
						UpdateNodesClientRpc(goName);
						break;
					}
				}
				return;
			}
			UpdateNodesClientRpc(goName, increment);
		}

		[ClientRpc]
		private void UpdateNodesClientRpc(string goName, bool increment = false)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: 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)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(459135623u, val, (RpcDelivery)0);
				bool flag = goName != null;
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives));
				if (flag)
				{
					((FastBufferWriter)(ref val2)).WriteValueSafe(goName, false);
				}
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref increment, default(ForPrimitives));
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 459135623u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost))
			{
				return;
			}
			foreach (CustomTerminalNode terminalNode in UpgradeBus.instance.terminalNodes)
			{
				if (terminalNode.Name == goName)
				{
					terminalNode.Unlocked = true;
					if (increment)
					{
						terminalNode.CurrentUpgrade++;
						UpgradeBus.instance.UpgradeObjects[goName].GetComponent<BaseUpgrade>().Increment();
					}
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void DeleteUpgradesServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2466427664u, val, (RpcDelivery)0);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2466427664u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				BaseUpgrade[] array = Object.FindObjectsOfType<BaseUpgrade>();
				BaseUpgrade[] array2 = array;
				foreach (BaseUpgrade baseUpgrade in array2)
				{