Decompiled source of TestingLib v1.2.1

plugins/TestingLib/TestingLib.dll

Decompiled 4 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using IL;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On;
using On.GameNetcodeStuff;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.InputSystem;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("TestingLib")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("TestingLib for Lethal Company.")]
[assembly: AssemblyFileVersion("1.2.1.0")]
[assembly: AssemblyInformationalVersion("1.2.1+29ba464d1a8b40929f9cccc784677d83f373199d")]
[assembly: AssemblyProduct("TestingLib")]
[assembly: AssemblyTitle("TestingLib")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.2.1.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace TestingLib
{
	internal class Helper
	{
		internal static void ListAllEnemies(bool nameOnly)
		{
			Plugin.Logger.LogInfo((object)"-- Inside Enemies ---");
			PrintListEnemy(RoundManager.Instance.currentLevel.Enemies, nameOnly);
			Plugin.Logger.LogInfo((object)"-- Outside Enemies --");
			PrintListEnemy(RoundManager.Instance.currentLevel.OutsideEnemies, nameOnly);
			Plugin.Logger.LogInfo((object)"-- Daytime Enemies --");
			PrintListEnemy(RoundManager.Instance.currentLevel.DaytimeEnemies, nameOnly);
		}

		private static void PrintListEnemy(List<SpawnableEnemyWithRarity> listOfEnemies, bool nameOnly)
		{
			foreach (SpawnableEnemyWithRarity listOfEnemy in listOfEnemies)
			{
				string text = listOfEnemy.enemyType.enemyName.Replace(' ', '_');
				text = text.Replace('-', '_');
				if (nameOnly)
				{
					Plugin.Logger.LogInfo((object)listOfEnemy.enemyType.enemyName);
					continue;
				}
				Plugin.Logger.LogInfo((object)("public const string " + text + " = \"" + listOfEnemy.enemyType.enemyName + "\";"));
			}
			Plugin.Logger.LogInfo((object)"---------------------");
		}

		internal static void ListAllItems(bool nameOnly)
		{
			Plugin.Logger.LogInfo((object)"-- Items ------------");
			foreach (Item items in StartOfRound.Instance.allItemsList.itemsList)
			{
				string text = items.itemName.Replace(' ', '_');
				text = text.Replace('-', '_');
				if (nameOnly)
				{
					Plugin.Logger.LogInfo((object)items.itemName);
					continue;
				}
				Plugin.Logger.LogInfo((object)("public const string " + text + " = \"" + items.itemName + "\";"));
			}
			Plugin.Logger.LogInfo((object)"---------------------");
		}
	}
	internal class Instances
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static hook_Start <0>__QuickMenuManager_Start;
		}

		internal static QuickMenuManager QMM_Instance;

		internal static void Init()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			object obj = <>O.<0>__QuickMenuManager_Start;
			if (obj == null)
			{
				hook_Start val = QuickMenuManager_Start;
				<>O.<0>__QuickMenuManager_Start = val;
				obj = (object)val;
			}
			QuickMenuManager.Start += (hook_Start)obj;
		}

		private static void QuickMenuManager_Start(orig_Start orig, QuickMenuManager self)
		{
			QMM_Instance = self;
			orig.Invoke(self);
		}
	}
	public class Enemy
	{
		public static IEnumerator DrawPath(LineRenderer line, NavMeshAgent agent)
		{
			if (((Behaviour)agent).enabled)
			{
				yield return (object)new WaitForEndOfFrame();
				line.SetPosition(0, ((Component)agent).transform.position);
				line.positionCount = agent.path.corners.Length;
				for (int i = 1; i < agent.path.corners.Length; i++)
				{
					line.SetPosition(i, agent.path.corners[i]);
				}
			}
		}
	}
	[Attributes.DevTools(Attributes.Visibility.Whitelist, Attributes.Available.PlayerSpawn)]
	public class Execute
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static hook_SetPlayerSafeInShip <0>__StartOfRound_SetPlayerSafeInShip;
		}

		[Attributes.DevTools(Attributes.Visibility.ConfigOnly)]
		public static void ToggleTestRoom()
		{
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Expected O, but got Unknown
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Expected O, but got Unknown
			Plugin.Logger.LogInfo((object)"Execute: Toggle Test Room");
			Instances.QMM_Instance.Debug_ToggleTestRoom();
			if (Object.op_Implicit((Object)(object)StartOfRound.Instance.testRoom))
			{
				object obj = <>O.<0>__StartOfRound_SetPlayerSafeInShip;
				if (obj == null)
				{
					hook_SetPlayerSafeInShip val = StartOfRound_SetPlayerSafeInShip;
					<>O.<0>__StartOfRound_SetPlayerSafeInShip = val;
					obj = (object)val;
				}
				StartOfRound.SetPlayerSafeInShip += (hook_SetPlayerSafeInShip)obj;
			}
			else
			{
				object obj2 = <>O.<0>__StartOfRound_SetPlayerSafeInShip;
				if (obj2 == null)
				{
					hook_SetPlayerSafeInShip val2 = StartOfRound_SetPlayerSafeInShip;
					<>O.<0>__StartOfRound_SetPlayerSafeInShip = val2;
					obj2 = (object)val2;
				}
				StartOfRound.SetPlayerSafeInShip -= (hook_SetPlayerSafeInShip)obj2;
			}
		}

		private static void StartOfRound_SetPlayerSafeInShip(orig_SetPlayerSafeInShip orig, StartOfRound self)
		{
			bool isInHangarShipRoom = GameNetworkManager.Instance.localPlayerController.isInHangarShipRoom;
			if (isInHangarShipRoom)
			{
				GameNetworkManager.Instance.localPlayerController.isInHangarShipRoom = false;
			}
			orig.Invoke(self);
			if (isInHangarShipRoom)
			{
				GameNetworkManager.Instance.localPlayerController.isInHangarShipRoom = isInHangarShipRoom;
			}
		}
	}
	public class OnEvent
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static hook_SpawnPlayerAnimation <0>__PlayerControllerB_SpawnPlayerAnimation;
		}

		public static event Action PlayerSpawn;

		internal static void Init()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			object obj = <>O.<0>__PlayerControllerB_SpawnPlayerAnimation;
			if (obj == null)
			{
				hook_SpawnPlayerAnimation val = PlayerControllerB_SpawnPlayerAnimation;
				<>O.<0>__PlayerControllerB_SpawnPlayerAnimation = val;
				obj = (object)val;
			}
			PlayerControllerB.SpawnPlayerAnimation += (hook_SpawnPlayerAnimation)obj;
		}

		private static void PlayerControllerB_SpawnPlayerAnimation(orig_SpawnPlayerAnimation orig, PlayerControllerB self)
		{
			OnEvent.PlayerSpawn?.Invoke();
			if (Patch.shouldSkipSpawnPlayerAnimation)
			{
				Plugin.Logger.LogInfo((object)"Patch: SkipSpawnPlayerAnimation");
			}
			else
			{
				orig.Invoke(self);
			}
		}
	}
	[Attributes.DevTools(Attributes.Visibility.Whitelist, Attributes.Available.Always)]
	public class Patch
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static hook_Update <0>__InfiniteSprint_PlayerControllerB_Update;

			public static hook_Jump_performed <1>__PlayerControllerB_Jump_performed;

			public static hook_Update <2>__PlayerControllerB_Update;

			public static hook_RunTerminalEvents <3>__Terminal_RunTerminalEvents;

			public static Manipulator <4>__ShotgunItem_ItemActivate;
		}

		private static bool shouldDebug;

		internal static bool shouldSkipSpawnPlayerAnimation;

		public static void IsEditor()
		{
			shouldDebug = true;
		}

		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		[HarmonyPostfix]
		private static void Application_isEditor_Postfix(ref bool __result)
		{
			if (shouldDebug)
			{
				__result = true;
			}
		}

		public static void InfiniteSprint()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			object obj = <>O.<0>__InfiniteSprint_PlayerControllerB_Update;
			if (obj == null)
			{
				hook_Update val = InfiniteSprint_PlayerControllerB_Update;
				<>O.<0>__InfiniteSprint_PlayerControllerB_Update = val;
				obj = (object)val;
			}
			PlayerControllerB.Update -= (hook_Update)obj;
			object obj2 = <>O.<0>__InfiniteSprint_PlayerControllerB_Update;
			if (obj2 == null)
			{
				hook_Update val2 = InfiniteSprint_PlayerControllerB_Update;
				<>O.<0>__InfiniteSprint_PlayerControllerB_Update = val2;
				obj2 = (object)val2;
			}
			PlayerControllerB.Update += (hook_Update)obj2;
		}

		private static void InfiniteSprint_PlayerControllerB_Update(orig_Update orig, PlayerControllerB self)
		{
			orig.Invoke(self);
			self.sprintMeter = 1f;
		}

		[Attributes.DevTools(Attributes.Visibility.ConfigOnly)]
		public static void SkipSpawnPlayerAnimation()
		{
			shouldSkipSpawnPlayerAnimation = true;
		}

		public static void OnDeathHeal()
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Expected O, but got Unknown
			MethodInfo methodInfo = AccessTools.DeclaredMethod(typeof(PlayerControllerB), "KillPlayer", (Type[])null, (Type[])null);
			MethodInfo methodInfo2 = AccessTools.DeclaredMethod(typeof(Patch), "PlayerControllerB_KillPlayer", (Type[])null, (Type[])null);
			Plugin._harmony.Patch((MethodBase)methodInfo, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}

		private static bool PlayerControllerB_KillPlayer(PlayerControllerB __instance)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			__instance.health = 100;
			__instance.MakeCriticallyInjured(false);
			HUDManager.Instance.UpdateHealthUI(__instance.health, false);
			__instance.DamagePlayer(0, false, true, (CauseOfDeath)0, 0, false, default(Vector3));
			return false;
		}

		public static void MovementCheat()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Expected O, but got Unknown
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Expected O, but got Unknown
			object obj = <>O.<1>__PlayerControllerB_Jump_performed;
			if (obj == null)
			{
				hook_Jump_performed val = PlayerControllerB_Jump_performed;
				<>O.<1>__PlayerControllerB_Jump_performed = val;
				obj = (object)val;
			}
			PlayerControllerB.Jump_performed -= (hook_Jump_performed)obj;
			object obj2 = <>O.<1>__PlayerControllerB_Jump_performed;
			if (obj2 == null)
			{
				hook_Jump_performed val2 = PlayerControllerB_Jump_performed;
				<>O.<1>__PlayerControllerB_Jump_performed = val2;
				obj2 = (object)val2;
			}
			PlayerControllerB.Jump_performed += (hook_Jump_performed)obj2;
			object obj3 = <>O.<2>__PlayerControllerB_Update;
			if (obj3 == null)
			{
				hook_Update val3 = PlayerControllerB_Update;
				<>O.<2>__PlayerControllerB_Update = val3;
				obj3 = (object)val3;
			}
			PlayerControllerB.Update -= (hook_Update)obj3;
			object obj4 = <>O.<2>__PlayerControllerB_Update;
			if (obj4 == null)
			{
				hook_Update val4 = PlayerControllerB_Update;
				<>O.<2>__PlayerControllerB_Update = val4;
				obj4 = (object)val4;
			}
			PlayerControllerB.Update += (hook_Update)obj4;
		}

		private static void PlayerControllerB_Update(orig_Update orig, PlayerControllerB self)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: 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_009f: 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)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			if (self.isSpeedCheating)
			{
				self.walkForce *= 0.8f;
				self.walkForce = Vector3.ClampMagnitude(self.walkForce, 0.1f);
				if (self.isSprinting)
				{
					self.fallValue -= 130f * Time.deltaTime;
					self.thisController.Move(self.walkForce * 700f * Time.deltaTime);
				}
				else
				{
					self.thisController.Move(self.walkForce * 200f * Time.deltaTime);
				}
			}
			orig.Invoke(self);
		}

		private static void PlayerControllerB_Jump_performed(orig_Jump_performed orig, PlayerControllerB self, CallbackContext context)
		{
			self.playerSlidingTimer = 0f;
			self.isJumping = true;
			self.sprintMeter = Mathf.Clamp(self.sprintMeter - 0.08f, 0f, 1f);
			self.movementAudio.PlayOneShot(StartOfRound.Instance.playerJumpSFX);
			if (self.jumpCoroutine != null)
			{
				((MonoBehaviour)self).StopCoroutine(self.jumpCoroutine);
				self.isSpeedCheating = true;
				if (self.isSprinting)
				{
					self.jumpForce = 50f;
				}
				else
				{
					self.jumpForce = 13f;
				}
				self.jumpCoroutine = ((MonoBehaviour)self).StartCoroutine(CustomPlayerJump(self));
			}
			else
			{
				self.jumpCoroutine = ((MonoBehaviour)self).StartCoroutine(self.PlayerJump());
			}
		}

		private static IEnumerator CustomPlayerJump(PlayerControllerB self)
		{
			self.playerBodyAnimator.SetBool("Jumping", true);
			self.fallValue = self.jumpForce;
			self.fallValueUncapped = self.jumpForce;
			yield return (object)new WaitForSeconds(0.1f);
			self.isJumping = false;
			self.isFallingFromJump = true;
			yield return (object)new WaitUntil((Func<bool>)(() => self.thisController.isGrounded));
			self.playerBodyAnimator.SetBool("Jumping", false);
			self.isFallingFromJump = false;
			self.PlayerHitGroundEffects();
			self.jumpCoroutine = null;
			self.isSpeedCheating = false;
			self.jumpForce = 13f;
		}

		public static void InfiniteCredits()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			object obj = <>O.<3>__Terminal_RunTerminalEvents;
			if (obj == null)
			{
				hook_RunTerminalEvents val = Terminal_RunTerminalEvents;
				<>O.<3>__Terminal_RunTerminalEvents = val;
				obj = (object)val;
			}
			Terminal.RunTerminalEvents -= (hook_RunTerminalEvents)obj;
			object obj2 = <>O.<3>__Terminal_RunTerminalEvents;
			if (obj2 == null)
			{
				hook_RunTerminalEvents val2 = Terminal_RunTerminalEvents;
				<>O.<3>__Terminal_RunTerminalEvents = val2;
				obj2 = (object)val2;
			}
			Terminal.RunTerminalEvents += (hook_RunTerminalEvents)obj2;
		}

		private static void Terminal_RunTerminalEvents(orig_RunTerminalEvents orig, Terminal self, TerminalNode node)
		{
			self.groupCredits = 100000000;
		}

		public static void InfiniteShotgunAmmo()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			object obj = <>O.<4>__ShotgunItem_ItemActivate;
			if (obj == null)
			{
				Manipulator val = ShotgunItem_ItemActivate;
				<>O.<4>__ShotgunItem_ItemActivate = val;
				obj = (object)val;
			}
			ShotgunItem.ItemActivate -= (Manipulator)obj;
			object obj2 = <>O.<4>__ShotgunItem_ItemActivate;
			if (obj2 == null)
			{
				Manipulator val2 = ShotgunItem_ItemActivate;
				<>O.<4>__ShotgunItem_ItemActivate = val2;
				obj2 = (object)val2;
			}
			ShotgunItem.ItemActivate += (Manipulator)obj2;
		}

		private static void ShotgunItem_ItemActivate(ILContext il)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_003e: 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)
			ILCursor val = new ILCursor(il);
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdfld<ShotgunItem>(x, "shellsLoaded")
			});
			val.Remove();
			val.Emit(OpCodes.Pop);
			val.Next.OpCode = OpCodes.Br;
		}

		[Attributes.DevTools(Attributes.Visibility.MenuOnly)]
		public static void PatchAll()
		{
			IsEditor();
			SkipSpawnPlayerAnimation();
			OnDeathHeal();
			MovementCheat();
			InfiniteSprint();
			InfiniteCredits();
			InfiniteShotgunAmmo();
		}

		[Attributes.DevTools(Attributes.Visibility.MenuOnly)]
		public static void UnpatchAll()
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Expected O, but got Unknown
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Expected O, but got Unknown
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Expected O, but got Unknown
			//IL_00b6: 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: Expected O, but got Unknown
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Expected O, but got Unknown
			shouldDebug = false;
			object obj = <>O.<0>__InfiniteSprint_PlayerControllerB_Update;
			if (obj == null)
			{
				hook_Update val = InfiniteSprint_PlayerControllerB_Update;
				<>O.<0>__InfiniteSprint_PlayerControllerB_Update = val;
				obj = (object)val;
			}
			PlayerControllerB.Update -= (hook_Update)obj;
			shouldSkipSpawnPlayerAnimation = false;
			MethodInfo methodInfo = AccessTools.DeclaredMethod(typeof(PlayerControllerB), "KillPlayer", (Type[])null, (Type[])null);
			MethodInfo methodInfo2 = AccessTools.DeclaredMethod(typeof(Patch), "PlayerControllerB_KillPlayer", (Type[])null, (Type[])null);
			Plugin._harmony.Unpatch((MethodBase)methodInfo, methodInfo2);
			object obj2 = <>O.<1>__PlayerControllerB_Jump_performed;
			if (obj2 == null)
			{
				hook_Jump_performed val2 = PlayerControllerB_Jump_performed;
				<>O.<1>__PlayerControllerB_Jump_performed = val2;
				obj2 = (object)val2;
			}
			PlayerControllerB.Jump_performed -= (hook_Jump_performed)obj2;
			object obj3 = <>O.<2>__PlayerControllerB_Update;
			if (obj3 == null)
			{
				hook_Update val3 = PlayerControllerB_Update;
				<>O.<2>__PlayerControllerB_Update = val3;
				obj3 = (object)val3;
			}
			PlayerControllerB.Update -= (hook_Update)obj3;
			object obj4 = <>O.<3>__Terminal_RunTerminalEvents;
			if (obj4 == null)
			{
				hook_RunTerminalEvents val4 = Terminal_RunTerminalEvents;
				<>O.<3>__Terminal_RunTerminalEvents = val4;
				obj4 = (object)val4;
			}
			Terminal.RunTerminalEvents -= (hook_RunTerminalEvents)obj4;
			object obj5 = <>O.<4>__ShotgunItem_ItemActivate;
			if (obj5 == null)
			{
				Manipulator val5 = ShotgunItem_ItemActivate;
				<>O.<4>__ShotgunItem_ItemActivate = val5;
				obj5 = (object)val5;
			}
			ShotgunItem.ItemActivate -= (Manipulator)obj5;
		}
	}
	[Attributes.DevTools(Attributes.Visibility.Whitelist, Attributes.Available.PlayerSpawn)]
	public class Tools
	{
		public enum TeleportLocation
		{
			Inside = 1,
			Outside
		}

		[Attributes.DevTools(Attributes.Visibility.ConfigOnly, Attributes.Available.PlayerSpawn)]
		public static void TeleportSelf(TeleportLocation location = (TeleportLocation)0)
		{
			//IL_003a: 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)
			switch (location)
			{
			case TeleportLocation.Inside:
				Plugin.Logger.LogInfo((object)"Tools: Teleport Inside");
				((Component)GameNetworkManager.Instance.localPlayerController).transform.position = new Vector3(8f, -173.6f, -32f);
				GameNetworkManager.Instance.localPlayerController.isInsideFactory = true;
				break;
			case TeleportLocation.Outside:
				Plugin.Logger.LogInfo((object)"Tools: Teleport Outside");
				((Component)GameNetworkManager.Instance.localPlayerController).transform.position = new Vector3(50f, -5.4f, 0f);
				break;
			}
			GameNetworkManager.Instance.localPlayerController.isInHangarShipRoom = false;
		}

		[Attributes.DevTools(Attributes.Visibility.MenuOnly, Attributes.Available.PlayerSpawn)]
		public static void TeleportSelfToEntrance()
		{
			PlayerControllerB localPlayerController = StartOfRound.Instance.localPlayerController;
			int num = 0;
			EntranceTeleport[] array = Object.FindObjectsByType<EntranceTeleport>((FindObjectsSortMode)0);
			EntranceTeleport[] array2 = array;
			foreach (EntranceTeleport val in array2)
			{
				if (val.entranceId == num && localPlayerController.isInsideFactory != val.isEntranceToBuilding)
				{
					val.TeleportPlayer();
					break;
				}
			}
		}

		[Attributes.DevTools(Attributes.Visibility.ConfigOnly, Attributes.Available.PlayerSpawn)]
		public static void SpawnEnemyInFrontOfSelf(string enemyName)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: 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_00d7: Unknown result type (might be due to invalid IL or missing references)
			Plugin.Logger.LogInfo((object)"Tools: SpawnEnemyInFrontOfSelf");
			Vector3 val = ((Component)GameNetworkManager.Instance.localPlayerController).transform.position - Vector3.Scale(new Vector3(-5f, 0f, -5f), ((Component)GameNetworkManager.Instance.localPlayerController).transform.forward);
			List<SpawnableEnemyWithRarity> list = new List<SpawnableEnemyWithRarity>();
			list.AddRange(RoundManager.Instance.currentLevel.Enemies);
			list.AddRange(RoundManager.Instance.currentLevel.OutsideEnemies);
			list.AddRange(RoundManager.Instance.currentLevel.DaytimeEnemies);
			SpawnableEnemyWithRarity val2 = list.Find((SpawnableEnemyWithRarity x) => x.enemyType.enemyName.Equals(enemyName));
			if (val2 == null)
			{
				Helper.ListAllEnemies(nameOnly: true);
			}
			else
			{
				RoundManager.Instance.SpawnEnemyGameObject(val, 0f, -1, val2.enemyType);
			}
		}

		[Attributes.DevTools(Attributes.Visibility.ConfigOnly, Attributes.Available.PlayerSpawn)]
		public static void GiveItemToSelf(string itemName)
		{
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			Item val = StartOfRound.Instance.allItemsList.itemsList.Find((Item x) => x.itemName.Equals(itemName));
			if ((Object)(object)val == (Object)null)
			{
				Helper.ListAllItems(nameOnly: true);
				return;
			}
			GameObject val2 = Object.Instantiate<GameObject>(val.spawnPrefab, ((Component)GameNetworkManager.Instance.localPlayerController).transform.position, Quaternion.identity, StartOfRound.Instance.propsContainer);
			GrabbableObject component = val2.GetComponent<GrabbableObject>();
			component.fallTime = 0f;
			((NetworkBehaviour)component).NetworkObject.Spawn(false);
			((MonoBehaviour)component).StartCoroutine(WaitAndGrabObject(val2, component));
		}

		private static IEnumerator WaitAndGrabObject(GameObject obj, GrabbableObject _obj)
		{
			yield return (object)new WaitForEndOfFrame();
			_obj.InteractItem();
			PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
			if (GameNetworkManager.Instance.localPlayerController.FirstEmptyItemSlot() == -1)
			{
				Plugin.Logger.LogInfo((object)"GiveItemToSelf: Could not grab item, inventory full!");
				yield break;
			}
			localPlayerController.twoHanded = _obj.itemProperties.twoHanded;
			localPlayerController.carryWeight += Mathf.Clamp(_obj.itemProperties.weight - 1f, 0f, 10f);
			localPlayerController.grabbedObjectValidated = true;
			localPlayerController.GrabObjectServerRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)_obj).NetworkObject));
			_obj.GrabItemOnClient();
			_obj.parentObject = localPlayerController.localItemHolder;
			localPlayerController.isHoldingObject = true;
			_obj.hasBeenHeld = true;
			_obj.EnablePhysics(false);
		}

		[Attributes.DevTools(Attributes.Visibility.Blacklist)]
		[Obsolete("Please use Patch.PatchAll() instead.")]
		public static void RunAllPatchAndExecuteMethods()
		{
			Patch.IsEditor();
			Patch.SkipSpawnPlayerAnimation();
			Patch.OnDeathHeal();
			Patch.MovementCheat();
			Patch.InfiniteSprint();
			Patch.InfiniteCredits();
			Patch.InfiniteShotgunAmmo();
			OnEvent.PlayerSpawn -= OnEvent_PlayerSpawn;
			OnEvent.PlayerSpawn += OnEvent_PlayerSpawn;
		}

		private static void OnEvent_PlayerSpawn()
		{
			Execute.ToggleTestRoom();
		}
	}
	public class Attributes
	{
		public enum Visibility
		{
			Whitelist,
			Blacklist,
			MenuOnly,
			ConfigOnly
		}

		public enum Available
		{
			Always,
			PlayerSpawn
		}

		public class DevTools : Attribute
		{
			private Visibility kindVisiblity;

			private Available kindTime;

			public Visibility Visibility => kindVisiblity;

			public Available Time => kindTime;

			public DevTools(Visibility initVisiblity, Available initTime)
			{
				kindVisiblity = initVisiblity;
				kindTime = initTime;
			}

			public DevTools(Visibility initVisibility)
			{
				kindVisiblity = initVisibility;
				kindTime = Available.Always;
			}
		}
	}
	public class Lookup
	{
		public class Item
		{
			public const string Binoculars = "Binoculars";

			public const string Boombox = "Boombox";

			public const string box = "box";

			public const string Flashlight = "Flashlight";

			public const string Jetpack = "Jetpack";

			public const string Key = "Key";

			public const string Lockpicker = "Lockpicker";

			public const string Apparatus = "Apparatus";

			public const string Mapper = "Mapper";

			public const string Pro_flashlight = "Pro-flashlight";

			public const string Shovel = "Shovel";

			public const string Stun_grenade = "Stun grenade";

			public const string Extension_ladder = "Extension ladder";

			public const string TZP_Inhalant = "TZP-Inhalant";

			public const string Walkie_talkie = "Walkie-talkie";

			public const string Zap_gun = "Zap gun";

			public const string Magic_7_ball = "Magic 7 ball";

			public const string Airhorn = "Airhorn";

			public const string Bell = "Bell";

			public const string Big_bolt = "Big bolt";

			public const string Bottles = "Bottles";

			public const string Brush = "Brush";

			public const string Candy = "Candy";

			public const string Cash_register = "Cash register";

			public const string Chemical_jug = "Chemical jug";

			public const string Clown_horn = "Clown horn";

			public const string Large_axle = "Large axle";

			public const string Teeth = "Teeth";

			public const string Dust_pan = "Dust pan";

			public const string Egg_beater = "Egg beater";

			public const string V_type_engine = "V-type engine";

			public const string Golden_cup = "Golden cup";

			public const string Fancy_lamp = "Fancy lamp";

			public const string Painting = "Painting";

			public const string Plastic_fish = "Plastic fish";

			public const string Laser_pointer = "Laser pointer";

			public const string Gold_bar = "Gold bar";

			public const string Hairdryer = "Hairdryer";

			public const string Magnifying_glass = "Magnifying glass";

			public const string Metal_sheet = "Metal sheet";

			public const string Cookie_mold_pan = "Cookie mold pan";

			public const string Mug = "Mug";

			public const string Perfume_bottle = "Perfume bottle";

			public const string Old_phone = "Old phone";

			public const string Jar_of_pickles = "Jar of pickles";

			public const string Pill_bottle = "Pill bottle";

			public const string Remote = "Remote";

			public const string Ring = "Ring";

			public const string Toy_robot = "Toy robot";

			public const string Rubber_Ducky = "Rubber Ducky";

			public const string Red_soda = "Red soda";

			public const string Steering_wheel = "Steering wheel";

			public const string Stop_sign = "Stop sign";

			public const string Tea_kettle = "Tea kettle";

			public const string Toothpaste = "Toothpaste";

			public const string Toy_cube = "Toy cube";

			public const string Hive = "Hive";

			public const string Radar_booster = "Radar-booster";

			public const string Yield_sign = "Yield sign";

			public const string Shotgun = "Shotgun";

			public const string Ammo = "Ammo";

			public const string Spray_paint = "Spray paint";

			public const string Homemade_flashbang = "Homemade flashbang";

			public const string Gift = "Gift";

			public const string Flask = "Flask";

			public const string Tragedy = "Tragedy";

			public const string Comedy = "Comedy";

			public const string Whoopie_cushion = "Whoopie cushion";
		}

		public class EnemyInside
		{
			public const string Centipede = "Centipede";

			public const string Bunker_Spider = "Bunker Spider";

			public const string Hoarding_bug = "Hoarding bug";

			public const string Flowerman = "Flowerman";

			public const string Crawler = "Crawler";

			public const string Blob = "Blob";

			public const string Girl = "Girl";

			public const string Puffer = "Puffer";

			public const string Nutcracker = "Nutcracker";
		}

		public class EnemyOutside
		{
			public const string MouthDog = "MouthDog";

			public const string ForestGiant = "ForestGiant";

			public const string Earth_Leviathan = "Earth Leviathan";
		}

		public class EnemyDaytime
		{
			public const string Red_Locust_Bees = "Red Locust Bees";

			public const string Manticoil = "Manticoil";

			public const string Docile_Locust_Bees = "Docile Locust Bees";
		}
	}
	[BepInPlugin("hamunii.testinglib", "TestingLib", "1.2.1")]
	public class Plugin : BaseUnityPlugin
	{
		internal static Harmony _harmony;

		public const string ModGUID = "hamunii.testinglib";

		internal static ManualLogSource Logger;

		private void Awake()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			Logger = ((BaseUnityPlugin)this).Logger;
			Logger.LogInfo((object)"Plugin TestingLib is loaded!");
			_harmony = new Harmony("TestingLib");
			_harmony.PatchAll(typeof(Patch));
			Instances.Init();
			OnEvent.Init();
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "TestingLib";

		public const string PLUGIN_NAME = "TestingLib";

		public const string PLUGIN_VERSION = "1.2.1";
	}
}