Decompiled source of StarlancerEnemyEscape v2.5.7

StarlancerEnemyEscape.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using EnemyEscape;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using StarlancerAIFix.Patches;
using StarlancerEnemyEscape;
using UnityEngine;
using UnityEngine.AI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: IgnoresAccessChecksTo("AmazingAssets.TerrainToMesh")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("ClientNetworkTransform")]
[assembly: IgnoresAccessChecksTo("DissonanceVoip")]
[assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")]
[assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")]
[assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")]
[assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging")]
[assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging.DocCodeExamples")]
[assembly: IgnoresAccessChecksTo("Unity.Burst")]
[assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")]
[assembly: IgnoresAccessChecksTo("Unity.Collections")]
[assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")]
[assembly: IgnoresAccessChecksTo("Unity.Jobs")]
[assembly: IgnoresAccessChecksTo("Unity.Mathematics")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.Common")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.MetricTypes")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStats")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Component")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Configuration")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Implementation")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsReporting")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkProfiler.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkSolutionInterface")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Components")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.Networking.Transport")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Csg")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.KdTree")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Poly2Tri")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Stl")]
[assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Config.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Authentication")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Analytics")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Configuration")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Device")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments.Internal")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Internal")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Networking")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Registration")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Scheduler")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Telemetry")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Threading")]
[assembly: IgnoresAccessChecksTo("Unity.Services.QoS")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Relay")]
[assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")]
[assembly: IgnoresAccessChecksTo("Unity.Timeline")]
[assembly: IgnoresAccessChecksTo("Unity.VisualEffectGraph.Runtime")]
[assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.UI")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("StarlancerEnemyEscape")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+59295cca759c482e1cb3a7e3cce1b058dec3b59b")]
[assembly: AssemblyProduct("StarlancerEnemyEscape")]
[assembly: AssemblyTitle("StarlancerEnemyEscape")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[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 StarlancerEnemyEscape
{
	[BepInPlugin("AudioKnight.StarlancerEnemyEscape", "Starlancer EnemyEscape", "2.5.6")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class StarlancerEnemyEscapeBase : BaseUnityPlugin
	{
		public enum ConfigPreset
		{
			Disabled,
			ReasonableDefaults,
			Minimal,
			Chaos
		}

		private const string modGUID = "AudioKnight.StarlancerEnemyEscape";

		private const string modName = "Starlancer EnemyEscape";

		private const string modVersion = "2.5.6";

		private readonly Harmony harmony = new Harmony("AudioKnight.StarlancerEnemyEscape");

		public static StarlancerEnemyEscapeBase Instance;

		internal static ManualLogSource logger;

		internal static ConfigFile EnemyEscapeConfig = new ConfigFile(Path.Combine(Paths.ConfigPath, "AudioKnight.StarlancerEnemyEscape.cfg"), true);

		public static ConfigEntry<ConfigPreset> configEscapePreset;

		internal static Dictionary<string, ConfigEntry<int>> EnemyEscapeConfigDictionary = new Dictionary<string, ConfigEntry<int>>();

		internal static Dictionary<string, ConfigEntry<int>> configEscapeInteriorRange = new Dictionary<string, ConfigEntry<int>>();

		internal static Dictionary<string, ConfigEntry<int>> configEscapeExteriorRange = new Dictionary<string, ConfigEntry<int>>();

		internal static Dictionary<string, ConfigEntry<int>> configEscapeCooldownTime = new Dictionary<string, ConfigEntry<int>>();

		internal static Dictionary<string, string> EnemyBlacklist = new Dictionary<string, string>
		{
			{ "Girl", "Unneeded" },
			{ "Masked", "Unneeded" },
			{ "Docile Locust Bees", "Unneeded" },
			{ "Manticoil", "Unneeded" },
			{ "Lasso", "Unimplemented" },
			{ "Red pill", "Unimplemented" },
			{ "Red Locust Bees", "Buggy" }
		};

		internal static Dictionary<string, string> VanillaEnemyList = new Dictionary<string, string>
		{
			{ "Blob", "" },
			{ "Bunker Spider", "" },
			{ "Butler", "" },
			{ "Butler Bees", "" },
			{ "Centipede", "" },
			{ "Crawler", "" },
			{ "Flowerman", "" },
			{ "Hoarding bug", "" },
			{ "Jester", "" },
			{ "Nutcracker", "" },
			{ "Puffer", "" },
			{ "Spring", "" },
			{ "Baboon hawk", "" },
			{ "Earth Leviathan", "" },
			{ "ForestGiant", "" },
			{ "MouthDog", "" },
			{ "RadMech", "" },
			{ "Tulip Snake", "" },
			{ "Clay Surgeon", "" },
			{ "Maneater", "" }
		};

		internal static Dictionary<string, int> DefaultPresetValues = new Dictionary<string, int>
		{
			{ "Blob", 2 },
			{ "Bunker Spider", 10 },
			{ "Butler", 5 },
			{ "Butler Bees", 5 },
			{ "Centipede", 0 },
			{ "Crawler", 10 },
			{ "Flowerman", 10 },
			{ "Hoarding bug", 10 },
			{ "Jester", 1 },
			{ "Nutcracker", 5 },
			{ "Puffer", 10 },
			{ "Spring", 5 },
			{ "Baboon hawk", 15 },
			{ "Earth Leviathan", 1 },
			{ "ForestGiant", 0 },
			{ "MouthDog", 0 },
			{ "RadMech", 0 },
			{ "Tulip Snake", 5 },
			{ "Clay Surgeon", 5 },
			{ "Maneater", 1 }
		};

		internal static Dictionary<string, int> DisabledPresetValues = new Dictionary<string, int>
		{
			{ "Blob", 0 },
			{ "Bunker Spider", 0 },
			{ "Butler", 0 },
			{ "Butler Bees", 0 },
			{ "Centipede", 0 },
			{ "Crawler", 0 },
			{ "Flowerman", 0 },
			{ "Hoarding bug", 0 },
			{ "Jester", 0 },
			{ "Nutcracker", 0 },
			{ "Puffer", 0 },
			{ "Spring", 0 },
			{ "Baboon hawk", 0 },
			{ "Earth Leviathan", 0 },
			{ "ForestGiant", 0 },
			{ "MouthDog", 0 },
			{ "RadMech", 0 },
			{ "Tulip Snake", 0 },
			{ "Clay Surgeon", 0 },
			{ "Maneater", 0 }
		};

		internal static Dictionary<string, int> MinimalPresetValues = new Dictionary<string, int>
		{
			{ "Blob", 1 },
			{ "Bunker Spider", 1 },
			{ "Butler", 1 },
			{ "Butler Bees", 1 },
			{ "Centipede", 1 },
			{ "Crawler", 1 },
			{ "Flowerman", 1 },
			{ "Hoarding bug", 1 },
			{ "Jester", 1 },
			{ "Nutcracker", 1 },
			{ "Puffer", 1 },
			{ "Spring", 1 },
			{ "Baboon hawk", 1 },
			{ "Earth Leviathan", 1 },
			{ "ForestGiant", 1 },
			{ "MouthDog", 1 },
			{ "RadMech", 1 },
			{ "Tulip Snake", 1 },
			{ "Clay Surgeon", 1 },
			{ "Maneater", 1 }
		};

		internal static Dictionary<string, int> ChaosPresetValues = new Dictionary<string, int>
		{
			{ "Blob", 100 },
			{ "Bunker Spider", 100 },
			{ "Butler", 100 },
			{ "Butler Bees", 100 },
			{ "Centipede", 100 },
			{ "Crawler", 100 },
			{ "Flowerman", 100 },
			{ "Hoarding bug", 100 },
			{ "Jester", 100 },
			{ "Nutcracker", 100 },
			{ "Puffer", 100 },
			{ "Spring", 100 },
			{ "Baboon hawk", 100 },
			{ "Earth Leviathan", 100 },
			{ "ForestGiant", 100 },
			{ "MouthDog", 100 },
			{ "RadMech", 100 },
			{ "Tulip Snake", 100 },
			{ "Clay Surgeon", 100 },
			{ "Maneater", 100 }
		};

		private void Awake()
		{
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Expected O, but got Unknown
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			EnemyEscapeConfig = ((BaseUnityPlugin)this).Config;
			logger = ((BaseUnityPlugin)this).Logger;
			logger.LogInfo((object)"Starlancer is allowing enemies to roam.");
			configEscapePreset = ((BaseUnityPlugin)this).Config.Bind<ConfigPreset>("EnemyEscape", "EscapePreset", ConfigPreset.ReasonableDefaults, new ConfigDescription("Which preset to use. If an enemy has a value manually set below, it will take priority.\nReasonableDefaults: Blob:2, Bunker Spider:10, Butler:5, Butler Bees:5, Centipede:0, Crawler:10, Flowerman:10, Hoarding bug:10, Jester:1, Nutcracker:5, Puffer:10, Spring:5, Baboon hawk:15, Earth Leviathan:1, ForestGiant:0, MouthDog:0, RadMech:0, Tulip Snake:5, Clay Surgeon:5, Maneater:1\nDisabled: All 0s, Minimal: All 1s, Chaos: All 100s (Use at your own risk)", (AcceptableValueBase)null, Array.Empty<object>()));
			harmony.PatchAll(typeof(StarlancerEnemyEscapeBase));
			harmony.PatchAll(typeof(StarlancerEscapeComponent));
		}

		internal static Dictionary<string, int> GetPresetValues(ConfigPreset preset)
		{
			return preset switch
			{
				ConfigPreset.Disabled => DisabledPresetValues, 
				ConfigPreset.ReasonableDefaults => DefaultPresetValues, 
				ConfigPreset.Minimal => MinimalPresetValues, 
				ConfigPreset.Chaos => ChaosPresetValues, 
				_ => DefaultPresetValues, 
			};
		}

		internal static Dictionary<string, int> GetCurrentlySelectedPreset()
		{
			return GetPresetValues(configEscapePreset.Value);
		}
	}
}
namespace EnemyEscape
{
	internal class StarlancerEscapeComponent : MonoBehaviour
	{
		private const int UpdateInterval = 1;

		private const float TeleportCooldownTime = 5f;

		private const float TeleportRange = 1f;

		private const int intPathRangeDefault = 20;

		private const int extPathRangeDefault = 200;

		private const int cooldownTimeDefault = 30;

		internal static EntranceTeleport[] entranceTeleports;

		internal static List<EntranceTeleport> outsideTeleports = new List<EntranceTeleport>();

		internal static List<EntranceTeleport> insideTeleports = new List<EntranceTeleport>();

		internal static List<EnemyAI> enemiesThatCanEscape = new List<EnemyAI>();

		internal static bool isSomethingBroken;

		internal static bool isMineshaft;

		internal int chanceToEscape;

		internal int interiorPathRange;

		internal int exteriorPathRange;

		internal int pathCooldownTime;

		private bool ignoreStateCheck;

		private bool preventPathing;

		private bool pathingToTeleport;

		private bool teleportFound;

		private bool closeToTeleport;

		private int pathRange;

		private float lastTeleportCheck;

		private float lastTeleportTime;

		private float lastPathAttempt;

		private float prevPathDistance;

		private Vector3 closestTeleportPosition;

		private Vector3 randomEnemyDestination;

		private Random random;

		private EnemyAI enemy;

		private NavMeshPath pathToTeleport;

		private EntranceTeleport closestTeleport;

		private Transform insideFavoriteSpot;

		private Transform outsideFavoriteSpot;

		private void Awake()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: 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)
			enemy = ((Component)this).GetComponent<EnemyAI>();
			pathToTeleport = new NavMeshPath();
			lastTeleportCheck = Time.time;
			lastTeleportTime = Time.time;
			lastPathAttempt = Time.time;
			closestTeleportPosition = Vector3.negativeInfinity;
			prevPathDistance = float.PositiveInfinity;
			random = new Random(StartOfRound.Instance.randomMapSeed);
			interiorPathRange = StarlancerEnemyEscapeBase.configEscapeInteriorRange[enemy.enemyType.enemyName].Value;
			exteriorPathRange = StarlancerEnemyEscapeBase.configEscapeExteriorRange[enemy.enemyType.enemyName].Value;
			pathCooldownTime = StarlancerEnemyEscapeBase.configEscapeCooldownTime[enemy.enemyType.enemyName].Value;
			StarlancerEnemyEscapeBase.logger.LogInfo((object)("Adding EscapeComponent to " + ((Object)((Component)enemy).gameObject).name + ". It may now roam freely."));
			if (StarlancerEnemyEscapeBase.EnemyEscapeConfigDictionary[enemy.enemyType.enemyName].Value == -1)
			{
				chanceToEscape = StarlancerEnemyEscapeBase.GetCurrentlySelectedPreset().GetValueOrDefault(enemy.enemyType.enemyName, 0);
			}
			else
			{
				chanceToEscape = StarlancerEnemyEscapeBase.EnemyEscapeConfigDictionary[enemy.enemyType.enemyName].Value;
			}
			if (chanceToEscape == 0)
			{
				StarlancerEnemyEscapeBase.logger.LogInfo((object)("ChanceToEscape is 0, removing EscapeComponent from " + ((Object)((Component)this).gameObject).name));
				Object.Destroy((Object)(object)this);
			}
			else
			{
				enemiesThatCanEscape.Add(enemy);
			}
			if (enemy.isOutside)
			{
				outsideFavoriteSpot = enemy.favoriteSpot;
				insideFavoriteSpot = AIFix.insideAINodes[random.Next(0, AIFix.insideAINodes.Length - 1)].transform;
				pathRange = exteriorPathRange;
			}
			else
			{
				insideFavoriteSpot = enemy.favoriteSpot;
				outsideFavoriteSpot = AIFix.outsideAINodes[random.Next(0, AIFix.outsideAINodes.Length - 1)].transform;
				pathRange = interiorPathRange;
			}
			if (enemy is FlowermanAI)
			{
				preventPathing = true;
			}
		}

		private void Update()
		{
			//IL_0666: Unknown result type (might be due to invalid IL or missing references)
			//IL_066c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01da: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0202: Unknown result type (might be due to invalid IL or missing references)
			//IL_021b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0222: Unknown result type (might be due to invalid IL or missing references)
			//IL_0232: Unknown result type (might be due to invalid IL or missing references)
			//IL_0577: Unknown result type (might be due to invalid IL or missing references)
			//IL_0588: Unknown result type (might be due to invalid IL or missing references)
			//IL_0605: Unknown result type (might be due to invalid IL or missing references)
			//IL_0616: Unknown result type (might be due to invalid IL or missing references)
			//IL_0414: Unknown result type (might be due to invalid IL or missing references)
			//IL_042c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0455: Unknown result type (might be due to invalid IL or missing references)
			//IL_045a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0460: Unknown result type (might be due to invalid IL or missing references)
			//IL_0466: Unknown result type (might be due to invalid IL or missing references)
			//IL_0478: Unknown result type (might be due to invalid IL or missing references)
			//IL_047d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0484: Unknown result type (might be due to invalid IL or missing references)
			//IL_0488: Unknown result type (might be due to invalid IL or missing references)
			//IL_048d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0492: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_04b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_04d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0308: Unknown result type (might be due to invalid IL or missing references)
			//IL_032f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0335: Invalid comparison between Unknown and I4
			//IL_0365: Unknown result type (might be due to invalid IL or missing references)
			//IL_036e: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_03de: Unknown result type (might be due to invalid IL or missing references)
			if (enemy.isEnemyDead || StartOfRound.Instance.allPlayersDead || RoundManager.Instance.playersManager.livingPlayers == 0)
			{
				Object.Destroy((Object)(object)this);
			}
			if (Time.time - lastTeleportCheck <= 1f)
			{
				return;
			}
			lastTeleportCheck = Time.time;
			if (!ignoreStateCheck && enemy.currentBehaviourStateIndex != 0)
			{
				lastPathAttempt += Time.deltaTime;
			}
			if (Time.time - lastPathAttempt > (float)pathCooldownTime || pathingToTeleport)
			{
				EnemyAI obj = enemy;
				HoarderBugAI val = (HoarderBugAI)(object)((obj is HoarderBugAI) ? obj : null);
				if (val != null)
				{
					if (val.heldItem != null)
					{
						pathingToTeleport = false;
						preventPathing = true;
					}
					else
					{
						preventPathing = false;
					}
				}
				else
				{
					EnemyAI obj2 = enemy;
					BaboonBirdAI val2 = (BaboonBirdAI)(object)((obj2 is BaboonBirdAI) ? obj2 : null);
					if (val2 != null)
					{
						if ((Object)(object)val2.heldScrap != (Object)null || (Object)(object)val2.focusedScrap != (Object)null)
						{
							pathingToTeleport = false;
							preventPathing = true;
						}
						else
						{
							preventPathing = false;
						}
					}
				}
				if (pathingToTeleport)
				{
					enemy.SetDestinationToPosition(closestTeleportPosition, false);
					enemy.agent.SetDestination(closestTeleportPosition);
					EnemyAI obj3 = enemy;
					SandSpiderAI val3 = (SandSpiderAI)(object)((obj3 is SandSpiderAI) ? obj3 : null);
					if (val3 != null)
					{
						Vector3 meshContainerPosition = val3.meshContainerPosition;
						val3.meshContainerPosition = Vector3.MoveTowards(val3.meshContainerPosition, closestTeleportPosition, val3.spiderSpeed * Time.deltaTime);
						val3.refVel = meshContainerPosition - val3.meshContainerPosition;
						val3.meshContainer.position = val3.meshContainerPosition;
						val3.meshContainer.rotation = Quaternion.Lerp(val3.meshContainer.rotation, val3.meshContainerTargetRotation, 8f * Time.deltaTime);
					}
					else
					{
						EnemyAI obj4 = enemy;
						BaboonBirdAI val4 = (BaboonBirdAI)(object)((obj4 is BaboonBirdAI) ? obj4 : null);
						if (val4 != null)
						{
							val4.scoutTimer = 0f;
						}
					}
				}
				else if (random.Next(0, 100) <= chanceToEscape && !preventPathing)
				{
					EntranceTeleport[] array = entranceTeleports;
					foreach (EntranceTeleport val5 in array)
					{
						if (!val5.FindExitPoint() || (isMineshaft && val5.entranceId == 0 && val5.isEntranceToBuilding))
						{
							continue;
						}
						NavMesh.CalculatePath(((Component)enemy).transform.position, ((Component)val5.entrancePoint).transform.position, enemy.agent.areaMask, pathToTeleport);
						if ((int)pathToTeleport.status <= 0)
						{
							Vector3[] corners = pathToTeleport.corners;
							float num = 0f;
							for (int j = 1; j < corners.Length; j++)
							{
								num += Vector3.Distance(corners[j - 1], corners[j]);
							}
							if (!(num > (float)pathRange) && num < prevPathDistance)
							{
								teleportFound = true;
								prevPathDistance = num;
								closestTeleport = val5;
								closestTeleportPosition = ((Component)val5.entrancePoint).transform.position;
							}
						}
					}
					if (teleportFound)
					{
						pathingToTeleport = true;
						enemy.SetDestinationToPosition(closestTeleportPosition, false);
						enemy.agent.SetDestination(closestTeleportPosition);
						EnemyAI obj5 = enemy;
						SandSpiderAI val6 = (SandSpiderAI)(object)((obj5 is SandSpiderAI) ? obj5 : null);
						if (val6 != null)
						{
							Vector3 meshContainerPosition2 = val6.meshContainerPosition;
							val6.meshContainerPosition = Vector3.MoveTowards(val6.meshContainerPosition, closestTeleportPosition, val6.spiderSpeed * Time.deltaTime);
							val6.refVel = meshContainerPosition2 - val6.meshContainerPosition;
							val6.meshContainer.position = val6.meshContainerPosition;
							val6.meshContainer.rotation = Quaternion.Lerp(val6.meshContainer.rotation, val6.meshContainerTargetRotation, 8f * Time.deltaTime);
						}
						else
						{
							EnemyAI obj6 = enemy;
							BaboonBirdAI val7 = (BaboonBirdAI)(object)((obj6 is BaboonBirdAI) ? obj6 : null);
							if (val7 != null)
							{
								val7.LeaveCurrentScoutingGroup(true);
							}
						}
					}
				}
				lastPathAttempt = Time.time;
			}
			if (Time.time - lastTeleportTime < 5f)
			{
				return;
			}
			if (!pathingToTeleport)
			{
				if (enemy.isOutside)
				{
					foreach (EntranceTeleport outsideTeleport in outsideTeleports)
					{
						if (Vector3.Distance(((Component)enemy).transform.position, ((Component)outsideTeleport.entrancePoint).transform.position) < 1f)
						{
							closestTeleport = outsideTeleport;
							closeToTeleport = true;
						}
					}
				}
				if (!enemy.isOutside)
				{
					foreach (EntranceTeleport insideTeleport in insideTeleports)
					{
						if (Vector3.Distance(((Component)enemy).transform.position, ((Component)insideTeleport.entrancePoint).transform.position) < 1f)
						{
							closestTeleport = insideTeleport;
							closeToTeleport = true;
						}
					}
				}
			}
			if (Vector3.Distance(((Component)enemy).transform.position, closestTeleportPosition) <= 1f || closeToTeleport)
			{
				TeleportAndRefresh();
			}
		}

		private void TeleportAndRefresh()
		{
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0255: Unknown result type (might be due to invalid IL or missing references)
			//IL_025a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0266: Unknown result type (might be due to invalid IL or missing references)
			//IL_027e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_030b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0312: Expected O, but got Unknown
			//IL_03d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0466: Unknown result type (might be due to invalid IL or missing references)
			//IL_0414: Unknown result type (might be due to invalid IL or missing references)
			if (enemy.isOutside)
			{
				StarlancerEnemyEscapeBase.logger.LogInfo((object)("Warping " + ((Object)enemy).name + " inside."));
				enemy.agent.Warp(insideTeleports[closestTeleport.entranceId].entrancePoint.position);
				enemy.SetEnemyOutside(false);
				pathRange = interiorPathRange;
				enemy.favoriteSpot = insideFavoriteSpot;
			}
			else if (!enemy.isOutside)
			{
				StarlancerEnemyEscapeBase.logger.LogInfo((object)("Warping " + ((Object)enemy).name + " outside."));
				enemy.agent.Warp(outsideTeleports[closestTeleport.entranceId].entrancePoint.position);
				enemy.SetEnemyOutside(true);
				pathRange = exteriorPathRange;
				enemy.favoriteSpot = outsideFavoriteSpot;
			}
			EnemyAI obj = enemy;
			BlobAI val = (BlobAI)(object)((obj is BlobAI) ? obj : null);
			if (val != null)
			{
				val.centerPoint.position = ((Component)enemy.agent).transform.position;
				for (int i = 0; i < val.maxDistanceForSlimeRays.Length; i++)
				{
					val.maxDistanceForSlimeRays[i] = 3.7f;
					val.SlimeBonePositions[i] = ((Component)val.SlimeBones[i]).transform.position;
				}
			}
			else
			{
				EnemyAI obj2 = enemy;
				SandSpiderAI val2 = (SandSpiderAI)(object)((obj2 is SandSpiderAI) ? obj2 : null);
				if (val2 != null)
				{
					val2.meshContainerPosition = ((Component)enemy.agent).transform.position;
					val2.meshContainerTarget = val2.meshContainerPosition;
				}
			}
			closeToTeleport = false;
			lastTeleportTime = Time.time;
			prevPathDistance = float.PositiveInfinity;
			pathingToTeleport = false;
			teleportFound = false;
			randomEnemyDestination = enemy.allAINodes[random.Next(0, enemy.allAINodes.Length - 1)].transform.position;
			enemy.SetDestinationToPosition(randomEnemyDestination, false);
			enemy.agent.SetDestination(randomEnemyDestination);
			enemy.DoAIInterval();
			EnemyAI val3 = enemy;
			if (1 == 0)
			{
			}
			BaboonBirdAI val4 = (BaboonBirdAI)(object)((val3 is BaboonBirdAI) ? val3 : null);
			AISearchRoutine val8;
			if (val4 == null)
			{
				HoarderBugAI val5 = (HoarderBugAI)(object)((val3 is HoarderBugAI) ? val3 : null);
				if (val5 == null)
				{
					BlobAI val6 = (BlobAI)(object)((val3 is BlobAI) ? val3 : null);
					if (val6 == null)
					{
						SandSpiderAI val7 = (SandSpiderAI)(object)((val3 is SandSpiderAI) ? val3 : null);
						val8 = (AISearchRoutine)((val7 == null) ? ((object)new AISearchRoutine()) : ((object)val7.patrolHomeBase));
					}
					else
					{
						val8 = val6.searchForPlayers;
					}
				}
				else
				{
					val8 = val5.searchForItems;
				}
			}
			else
			{
				val8 = val4.scoutingSearchRoutine;
			}
			if (1 == 0)
			{
			}
			AISearchRoutine val9 = val8;
			EnemyAI obj3 = enemy;
			BaboonBirdAI val10 = (BaboonBirdAI)(object)((obj3 is BaboonBirdAI) ? obj3 : null);
			if (val10 != null)
			{
				val10.scoutingSearchRoutine.unsearchedNodes = ((EnemyAI)val10).allAINodes.ToList();
				if ((Object)(object)val10.heldScrap != (Object)null)
				{
					return;
				}
			}
			else
			{
				EnemyAI obj4 = enemy;
				HoarderBugAI val11 = (HoarderBugAI)(object)((obj4 is HoarderBugAI) ? obj4 : null);
				if (val11 != null)
				{
					val11.searchForItems.unsearchedNodes = ((EnemyAI)val11).allAINodes.ToList();
					if (val11.heldItem != null)
					{
						return;
					}
				}
				else
				{
					EnemyAI obj5 = enemy;
					CrawlerAI val12 = (CrawlerAI)(object)((obj5 is CrawlerAI) ? obj5 : null);
					if (val12 != null)
					{
						((EnemyAI)val12).StartSearch(((Component)enemy).transform.position, val12.searchForPlayers);
					}
					else
					{
						EnemyAI obj6 = enemy;
						SpringManAI val13 = (SpringManAI)(object)((obj6 is SpringManAI) ? obj6 : null);
						if (val13 != null)
						{
							((EnemyAI)val13).StartSearch(((Component)enemy).transform.position, val13.searchForPlayers);
						}
						else
						{
							EnemyAI obj7 = enemy;
							SandSpiderAI val14 = (SandSpiderAI)(object)((obj7 is SandSpiderAI) ? obj7 : null);
							if (val14 != null)
							{
								val14.homeNode = enemy.favoriteSpot;
							}
						}
					}
				}
			}
			enemy.StartSearch(((Component)enemy).transform.position, val9);
		}

		[HarmonyPatch(typeof(EnemyAI), "Start")]
		[HarmonyPostfix]
		private static void EscapeSetup(EnemyAI __instance)
		{
			//IL_052f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0539: Expected O, but got Unknown
			//IL_0616: Unknown result type (might be due to invalid IL or missing references)
			//IL_0620: Expected O, but got Unknown
			//IL_06fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0704: Expected O, but got Unknown
			//IL_07de: Unknown result type (might be due to invalid IL or missing references)
			//IL_07e8: Expected O, but got Unknown
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Expected O, but got Unknown
			//IL_025c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0266: Expected O, but got Unknown
			//IL_0340: Unknown result type (might be due to invalid IL or missing references)
			//IL_034a: Expected O, but got Unknown
			//IL_0424: Unknown result type (might be due to invalid IL or missing references)
			//IL_042e: Expected O, but got Unknown
			if (StarlancerEnemyEscapeBase.EnemyBlacklist.ContainsKey(__instance.enemyType.enemyName))
			{
				return;
			}
			if (!StarlancerEnemyEscapeBase.EnemyEscapeConfigDictionary.ContainsKey(__instance.enemyType.enemyName))
			{
				if (StarlancerEnemyEscapeBase.VanillaEnemyList.ContainsKey(__instance.enemyType.enemyName))
				{
					StarlancerEnemyEscapeBase.logger.LogInfo((object)("Adding " + __instance.enemyType.enemyName + " to the StarlancerEnemyEscape config."));
					StarlancerEnemyEscapeBase.EnemyEscapeConfigDictionary[__instance.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Vanilla Enemies", __instance.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
						.Replace("\\", "")
						.Replace("\"", "")
						.Replace("'", "")
						.Replace("[", "")
						.Replace("]", "") ?? "", -1, new ConfigDescription("Chance for " + __instance.enemyType.enemyName + " to go into or out of the facility. Set to -1 to use the value from the chosen preset.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(-1, 100), Array.Empty<object>()));
					StarlancerEnemyEscapeBase.logger.LogInfo((object)("Adding " + __instance.enemyType.enemyName + " to the StarlancerEnemyEscape config."));
					StarlancerEnemyEscapeBase.configEscapeExteriorRange[__instance.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Vanilla Enemies", __instance.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
						.Replace("\\", "")
						.Replace("\"", "")
						.Replace("'", "")
						.Replace("[", "")
						.Replace("]", "") + " Exterior Range", 200, new ConfigDescription("Range at which " + __instance.enemyType.enemyName + " can detect a teleport while outside.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(20, 9999), Array.Empty<object>()));
					StarlancerEnemyEscapeBase.configEscapeInteriorRange[__instance.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Vanilla Enemies", __instance.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
						.Replace("\\", "")
						.Replace("\"", "")
						.Replace("'", "")
						.Replace("[", "")
						.Replace("]", "") + " Interior Range", 20, new ConfigDescription("Range at which " + __instance.enemyType.enemyName + " can detect a teleport while inside.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(10, 9999), Array.Empty<object>()));
					StarlancerEnemyEscapeBase.configEscapeCooldownTime[__instance.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Vanilla Enemies", __instance.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
						.Replace("\\", "")
						.Replace("\"", "")
						.Replace("'", "")
						.Replace("[", "")
						.Replace("]", "") + " Cooldown Time", 30, new ConfigDescription("Length of the cooldown between attempts at pathing to a nearby EntranceTeleport for " + __instance.enemyType.enemyName + ".", (AcceptableValueBase)(object)new AcceptableValueRange<int>(10, 9999), Array.Empty<object>()));
				}
				else
				{
					StarlancerEnemyEscapeBase.logger.LogInfo((object)("Adding " + __instance.enemyType.enemyName + " to the StarlancerEnemyEscape config."));
					StarlancerEnemyEscapeBase.EnemyEscapeConfigDictionary[__instance.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Mod Enemies", __instance.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
						.Replace("\\", "")
						.Replace("\"", "")
						.Replace("'", "")
						.Replace("[", "")
						.Replace("]", "") ?? "", -1, new ConfigDescription("Chance for " + __instance.enemyType.enemyName + " to go into or out of the facility. Set to -1 to use the value from the chosen preset.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(20, 100), Array.Empty<object>()));
					StarlancerEnemyEscapeBase.configEscapeExteriorRange[__instance.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Mod Enemies", __instance.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
						.Replace("\\", "")
						.Replace("\"", "")
						.Replace("'", "")
						.Replace("[", "")
						.Replace("]", "") + " Exterior Range", 200, new ConfigDescription("Range at which " + __instance.enemyType.enemyName + " can detect a teleport while outside.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(20, 9999), Array.Empty<object>()));
					StarlancerEnemyEscapeBase.configEscapeInteriorRange[__instance.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Mod Enemies", __instance.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
						.Replace("\\", "")
						.Replace("\"", "")
						.Replace("'", "")
						.Replace("[", "")
						.Replace("]", "") + " Interior Range", 20, new ConfigDescription("Range at which " + __instance.enemyType.enemyName + " can detect a teleport while inside.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(10, 9999), Array.Empty<object>()));
					StarlancerEnemyEscapeBase.configEscapeCooldownTime[__instance.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Mod Enemies", __instance.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
						.Replace("\\", "")
						.Replace("\"", "")
						.Replace("'", "")
						.Replace("[", "")
						.Replace("]", "") + " Cooldown Time", 30, new ConfigDescription("Length of the cooldown between attempts at pathing to a nearby EntranceTeleport for " + __instance.enemyType.enemyName + ".", (AcceptableValueBase)(object)new AcceptableValueRange<int>(10, 9999), Array.Empty<object>()));
				}
			}
			if (!isSomethingBroken && AIFix.insideAINodes.Length != 0 && (Object)(object)((Component)__instance).gameObject.GetComponent<StarlancerEscapeComponent>() == (Object)null)
			{
				StarlancerEscapeComponent starlancerEscapeComponent = ((Component)__instance).gameObject.AddComponent<StarlancerEscapeComponent>();
			}
		}

		[HarmonyPatch(typeof(GameNetworkManager), "Start")]
		[HarmonyPostfix]
		[HarmonyPriority(0)]
		private static void BindRegisteredEnemies()
		{
			//IL_050b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0515: Expected O, but got Unknown
			//IL_05f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_05fc: Expected O, but got Unknown
			//IL_06d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_06e0: Expected O, but got Unknown
			//IL_07ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_07c4: Expected O, but got Unknown
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Expected O, but got Unknown
			//IL_0260: Unknown result type (might be due to invalid IL or missing references)
			//IL_026a: Expected O, but got Unknown
			//IL_0344: Unknown result type (might be due to invalid IL or missing references)
			//IL_034e: Expected O, but got Unknown
			//IL_0428: Unknown result type (might be due to invalid IL or missing references)
			//IL_0432: Expected O, but got Unknown
			EnemyAI[] array = Resources.FindObjectsOfTypeAll<EnemyAI>();
			EnemyAI[] array2 = array;
			foreach (EnemyAI val in array2)
			{
				if (!((Object)(object)val == (Object)null) && !((Object)(object)val.enemyType == (Object)null) && val.enemyType.enemyName != null && !StarlancerEnemyEscapeBase.EnemyBlacklist.ContainsKey(val.enemyType.enemyName) && !StarlancerEnemyEscapeBase.EnemyEscapeConfigDictionary.ContainsKey(val.enemyType.enemyName))
				{
					if (StarlancerEnemyEscapeBase.VanillaEnemyList.ContainsKey(val.enemyType.enemyName))
					{
						StarlancerEnemyEscapeBase.EnemyEscapeConfigDictionary[val.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Vanilla Enemies", val.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
							.Replace("\\", "")
							.Replace("\"", "")
							.Replace("'", "")
							.Replace("[", "")
							.Replace("]", "") ?? "", -1, new ConfigDescription("Chance for " + val.enemyType.enemyName + " to go into or out of the facility. Set to -1 to use the value from the chosen preset.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(-1, 100), Array.Empty<object>()));
						StarlancerEnemyEscapeBase.configEscapeExteriorRange[val.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Vanilla Enemies", val.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
							.Replace("\\", "")
							.Replace("\"", "")
							.Replace("'", "")
							.Replace("[", "")
							.Replace("]", "") + " Exterior Range", 200, new ConfigDescription("Range at which " + val.enemyType.enemyName + " can detect a teleport while outside.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(20, 9999), Array.Empty<object>()));
						StarlancerEnemyEscapeBase.configEscapeInteriorRange[val.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Vanilla Enemies", val.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
							.Replace("\\", "")
							.Replace("\"", "")
							.Replace("'", "")
							.Replace("[", "")
							.Replace("]", "") + " Interior Range", 20, new ConfigDescription("Range at which " + val.enemyType.enemyName + " can detect a teleport while inside.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(10, 9999), Array.Empty<object>()));
						StarlancerEnemyEscapeBase.configEscapeCooldownTime[val.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Vanilla Enemies", val.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
							.Replace("\\", "")
							.Replace("\"", "")
							.Replace("'", "")
							.Replace("[", "")
							.Replace("]", "") + " Cooldown Time", 30, new ConfigDescription("Length of the cooldown between attempts at pathing to a nearby EntranceTeleport for " + val.enemyType.enemyName + ".", (AcceptableValueBase)(object)new AcceptableValueRange<int>(10, 9999), Array.Empty<object>()));
					}
					else
					{
						StarlancerEnemyEscapeBase.EnemyEscapeConfigDictionary[val.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Mod Enemies", val.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
							.Replace("\\", "")
							.Replace("\"", "")
							.Replace("'", "")
							.Replace("[", "")
							.Replace("]", "") ?? "", -1, new ConfigDescription("Chance for " + val.enemyType.enemyName + " to go into or out of the facility. Set to -1 to use the value from the chosen preset.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(-1, 100), Array.Empty<object>()));
						StarlancerEnemyEscapeBase.configEscapeExteriorRange[val.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Mod Enemies", val.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
							.Replace("\\", "")
							.Replace("\"", "")
							.Replace("'", "")
							.Replace("[", "")
							.Replace("]", "") + " Exterior Range", 200, new ConfigDescription("Range at which " + val.enemyType.enemyName + " can detect a teleport while outside.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(20, 9999), Array.Empty<object>()));
						StarlancerEnemyEscapeBase.configEscapeInteriorRange[val.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Mod Enemies", val.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
							.Replace("\\", "")
							.Replace("\"", "")
							.Replace("'", "")
							.Replace("[", "")
							.Replace("]", "") + " Interior Range", 20, new ConfigDescription("Range at which " + val.enemyType.enemyName + " can detect a teleport while inside.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(10, 9999), Array.Empty<object>()));
						StarlancerEnemyEscapeBase.configEscapeCooldownTime[val.enemyType.enemyName] = StarlancerEnemyEscapeBase.EnemyEscapeConfig.Bind<int>("Mod Enemies", val.enemyType.enemyName.Replace("=", "").Replace("\n", "").Replace("\t", "")
							.Replace("\\", "")
							.Replace("\"", "")
							.Replace("'", "")
							.Replace("[", "")
							.Replace("]", "") + " Cooldown Time", 30, new ConfigDescription("Length of the cooldown between attempts at pathing to a nearby EntranceTeleport for " + val.enemyType.enemyName + ".", (AcceptableValueBase)(object)new AcceptableValueRange<int>(10, 9999), Array.Empty<object>()));
					}
				}
			}
		}

		[HarmonyPatch(typeof(RoundManager), "SetLevelObjectVariables")]
		[HarmonyPostfix]
		private static void EntranceTeleportsAndAINodes()
		{
			isSomethingBroken = false;
			isMineshaft = false;
			enemiesThatCanEscape.Clear();
			outsideTeleports.Clear();
			insideTeleports.Clear();
			if (RoundManager.Instance.currentLevel.sceneName != "CompanyBuilding" && (Object)(object)RoundManager.Instance.dungeonGenerator == (Object)null && (Object)(object)RoundManager.Instance.dungeonGenerator.Generator.DungeonFlow == (Object)null)
			{
				isSomethingBroken = true;
				StarlancerEnemyEscapeBase.logger.LogError((object)("Something related to dungeon generation is null. Aborting registration of EntranceTeleports and disabling escape functionality for this round. Moon is " + RoundManager.Instance.currentLevel.PlanetName + ". Please report this error to the author of this moon."));
				return;
			}
			if (((Object)RoundManager.Instance.dungeonGenerator.Generator.DungeonFlow).name == "Level3Flow")
			{
				isMineshaft = true;
			}
			entranceTeleports = Object.FindObjectsByType<EntranceTeleport>((FindObjectsSortMode)0);
			for (int i = 0; i < entranceTeleports.Length; i++)
			{
				int entranceId = entranceTeleports[i].entranceId;
				if (entranceTeleports[i].isEntranceToBuilding)
				{
					if (!entranceTeleports[i].FindExitPoint())
					{
						StarlancerEnemyEscapeBase.logger.LogError((object)$"EntranceTeleport {entranceId} does not have a matching interior EntranceTeleport. Interior is {((Object)RoundManager.Instance.dungeonGenerator.Generator.DungeonFlow).name}. Please report this error to the author of this interior.");
						isSomethingBroken = true;
						continue;
					}
					if ((Object)(object)entranceTeleports[i].entrancePoint == (Object)null)
					{
						StarlancerEnemyEscapeBase.logger.LogError((object)$"EntranceTeleport {entranceId} does not have an entrancePoint. Moon is {RoundManager.Instance.currentLevel.PlanetName}. Please report this error to the author of this moon.");
						isSomethingBroken = true;
						continue;
					}
					outsideTeleports.Add(entranceTeleports[i]);
					outsideTeleports.Sort((EntranceTeleport entranceA, EntranceTeleport entranceB) => entranceA.entranceId.CompareTo(entranceB.entranceId));
					StarlancerEnemyEscapeBase.logger.LogInfo((object)$"Registering exterior EntranceTeleport({entranceId}).");
				}
				else if (!entranceTeleports[i].FindExitPoint())
				{
					StarlancerEnemyEscapeBase.logger.LogError((object)$"EntranceTeleport {entranceId} does not have a matching exterior EntranceTeleport. Moon is {RoundManager.Instance.currentLevel.PlanetName}. Please report this error to the author of this moon.");
					isSomethingBroken = true;
				}
				else if ((Object)(object)entranceTeleports[i].entrancePoint == (Object)null)
				{
					StarlancerEnemyEscapeBase.logger.LogError((object)$"EntranceTeleport {entranceId} does not have an entrancePoint. Interior is {((Object)RoundManager.Instance.dungeonGenerator.Generator.DungeonFlow).name}. Please report this error to the author of this interior.");
					isSomethingBroken = true;
				}
				else
				{
					insideTeleports.Add(entranceTeleports[i]);
					insideTeleports.Sort((EntranceTeleport entranceA, EntranceTeleport entranceB) => entranceA.entranceId.CompareTo(entranceB.entranceId));
					StarlancerEnemyEscapeBase.logger.LogInfo((object)$"Registering interior EntranceTeleport({entranceId}).");
				}
			}
			if (isSomethingBroken)
			{
				StarlancerEnemyEscapeBase.logger.LogWarning((object)"Escaping is disabled for this round as there is an issue with the EntranceTeleports. Please see the error logged above.");
			}
		}

		[HarmonyPatch(typeof(EnemyAI), "SetDestinationToPosition")]
		[HarmonyPrefix]
		private static void SetDestinationToPositionPrefix(EnemyAI __instance, ref Vector3 position, ref bool checkForPath)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: 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: Invalid comparison between Unknown and I4
			//IL_021a: Unknown result type (might be due to invalid IL or missing references)
			//IL_022b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0243: Unknown result type (might be due to invalid IL or missing references)
			//IL_0249: Invalid comparison between Unknown and I4
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_0274: Unknown result type (might be due to invalid IL or missing references)
			//IL_027d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d1: Unknown result type (might be due to invalid IL or missing references)
			if (!enemiesThatCanEscape.Contains(__instance))
			{
				return;
			}
			StarlancerEscapeComponent component = ((Component)__instance).GetComponent<StarlancerEscapeComponent>();
			bool flag = false;
			NavMeshPath val = new NavMeshPath();
			float num = float.PositiveInfinity;
			if (__instance.isOutside)
			{
				Vector3[] outsideNodePositions = AIFix.outsideNodePositions;
				foreach (Vector3 val2 in outsideNodePositions)
				{
					if (Vector3.Distance(val2, position) < 10f)
					{
						flag = false;
						break;
					}
					flag = true;
				}
				if (flag)
				{
					foreach (EntranceTeleport outsideTeleport in outsideTeleports)
					{
						NavMesh.CalculatePath(((Component)__instance).transform.position, ((Component)outsideTeleport.entrancePoint).transform.position, __instance.agent.areaMask, val);
						if ((int)val.status <= 0)
						{
							Vector3[] corners = val.corners;
							float num2 = 0f;
							for (int j = 1; j < corners.Length; j++)
							{
								num2 += Vector3.Distance(corners[j - 1], corners[j]);
							}
							if (num2 < num)
							{
								num = num2;
								checkForPath = false;
								position = ((Component)outsideTeleport.entrancePoint).transform.position;
								__instance.destination = position;
							}
						}
					}
				}
			}
			if (__instance.isOutside)
			{
				return;
			}
			Vector3[] insideNodePositions = AIFix.insideNodePositions;
			foreach (Vector3 val3 in insideNodePositions)
			{
				if (Vector3.Distance(val3, position) < 10f)
				{
					flag = false;
					break;
				}
				flag = true;
			}
			if (!flag)
			{
				return;
			}
			foreach (EntranceTeleport insideTeleport in insideTeleports)
			{
				NavMesh.CalculatePath(((Component)__instance).transform.position, ((Component)insideTeleport.entrancePoint).transform.position, __instance.agent.areaMask, val);
				if ((int)val.status <= 0)
				{
					Vector3[] corners2 = val.corners;
					float num3 = 0f;
					for (int l = 1; l < corners2.Length; l++)
					{
						num3 += Vector3.Distance(corners2[l - 1], corners2[l]);
					}
					if (num3 < num)
					{
						num = num3;
						checkForPath = false;
						position = ((Component)insideTeleport.entrancePoint).transform.position;
						__instance.destination = position;
					}
				}
			}
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}