Decompiled source of EOSExt ExtraDoor v1.0.1

plugins/Inas07.EOSExt.ExtraDoor.dll

Decompiled a month ago
using System;
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 AIGraph;
using AK;
using Agents;
using BepInEx;
using BepInEx.Unity.IL2CPP;
using ChainedPuzzles;
using EOSExt.ExtraDoor.Config;
using Enemies;
using Expedition;
using ExtraObjectiveSetup;
using ExtraObjectiveSetup.BaseClasses;
using ExtraObjectiveSetup.ExtendedWardenEvents;
using ExtraObjectiveSetup.Utils;
using GTFO.API;
using GTFO.API.Extensions;
using GameData;
using HarmonyLib;
using Il2CppInterop.Runtime.Injection;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem;
using Il2CppSystem.Collections.Generic;
using LevelGeneration;
using Localization;
using Microsoft.CodeAnalysis;
using SNetwork;
using UnityEngine;
using XXHashing;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("Inas07.EOSExt.ExtraDoor")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+3b93e6ace64e6a9a93039d59cb8a0c53714a338c")]
[assembly: AssemblyProduct("Inas07.EOSExt.ExtraDoor")]
[assembly: AssemblyTitle("Inas07.EOSExt.ExtraDoor")]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace EOSExt.ExtraDoor
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("Inas.EOSExt.ExtraDoor", "EOSExt.ExtraDoor", "1.0.1")]
	public class EntryPoint : BasePlugin
	{
		public const string AUTHOR = "Inas";

		public const string PLUGIN_NAME = "EOSExt.ExtraDoor";

		public const string VERSION = "1.0.1";

		private Harmony m_Harmony;

		public override void Load()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			SetupManagers();
			m_Harmony = new Harmony("EOSExt.ExtraDoor");
			m_Harmony.PatchAll();
			EOSLogger.Log("ExtraObjectiveSetup.ExtraDoor loaded.");
		}

		private void SetupManagers()
		{
			((GenericExpeditionDefinitionManager<ForceConnectCfg>)ForceConnectManager.Current).Init();
		}
	}
	internal static class ForceConnectDoorUtils
	{
		public static ForceConnect? GetFC(this LG_SecurityDoor fcdoor)
		{
			return ((Component)fcdoor).gameObject.GetComponentInParent<ForceConnect>();
		}

		public static List<(LG_ZoneExpander fromExp, LG_ZoneExpander toExp)> GetExpandersBetween(LG_Area fromArea, LG_Area toAreaB)
		{
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: 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_008c: 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)
			List<(LG_ZoneExpander, LG_ZoneExpander)> list = new List<(LG_ZoneExpander, LG_ZoneExpander)>();
			Enumerator<LG_ZoneExpander> enumerator = fromArea.m_zoneExpanders.GetEnumerator();
			Vector2 val = default(Vector2);
			Vector2 val2 = default(Vector2);
			while (enumerator.MoveNext())
			{
				LG_ZoneExpander current = enumerator.Current;
				Enumerator<LG_ZoneExpander> enumerator2 = toAreaB.m_zoneExpanders.GetEnumerator();
				while (enumerator2.MoveNext())
				{
					LG_ZoneExpander current2 = enumerator2.Current;
					((Vector2)(ref val))..ctor(((Component)current).transform.position.x, ((Component)current).transform.position.z);
					((Vector2)(ref val2))..ctor(((Component)current2).transform.position.x, ((Component)current2).transform.position.z);
					if (Vector2.Distance(val, val2) <= 0.1f)
					{
						list.Add((current, current2));
					}
				}
			}
			return list;
		}

		public static void FCOnDoorOpenStarted(this LG_SecurityDoor fcdoor)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Invalid comparison between Unknown and I4
			//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_0016: 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_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected I4, but got Unknown
			if ((int)fcdoor.m_securityDoorType == 2)
			{
				LG_LayerType linksToLayerType = fcdoor.LinksToLayerType;
				LG_LayerType val = linksToLayerType;
				switch ((int)val)
				{
				case 0:
					fcdoor.m_sound.Post(EVENTS.BULKHEAD_ENTRANCE_THREAT_HIGH_LOOP, true);
					break;
				case 1:
					fcdoor.m_sound.Post(EVENTS.BULKHEAD_ENTRANCE_THREAT_EXTREME_LOOP, true);
					break;
				case 2:
					fcdoor.m_sound.Post(EVENTS.BULKHEAD_ENTRANCE_THREAT_OVERLOAD_LOOP, true);
					break;
				}
			}
		}

		public static void FCOnDoorIsOpen(this LG_SecurityDoor fcdoor)
		{
			ForceConnect fC = fcdoor.GetFC();
			EOSLogger.Log($"OnDoorIsOpened: ForceConnect: {fcdoor.LinkedToZoneData}");
			if (!((Object)(object)fC != (Object)null))
			{
				return;
			}
			List<LevelEventData> eventsOnEnter = fC.Cfg.Setting.EventsOnEnter;
			EOSLogger.Log("OnDoorIsOpened, FC.EventsOnEnter");
			if (eventsOnEnter != null && eventsOnEnter.Count > 0)
			{
				eventsOnEnter.ForEach(delegate(LevelEventData e)
				{
					((MonoBehaviour)fcdoor).StartCoroutine(fcdoor.TriggerLevelEventWithDelay(e));
				});
			}
			WardenObjectiveManager.CheckAndExecuteEventsOnTrigger(ListExtensions.ToIl2Cpp<WardenObjectiveEventData>(fC.Cfg.Setting.EventsOnOpenDoor), (eWardenObjectiveEventTrigger)0, true, 0f, (Il2CppStructArray<eWardenObjectiveEventType>)null);
		}

		public static void FCOnSyncDoorStatusChange(this LG_SecurityDoor fcdoor, pDoorState state, bool isRecall)
		{
			//IL_0022: 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_0071: 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_0083: 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)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: 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_0120: Invalid comparison between Unknown and I4
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Expected I4, but got Unknown
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0184: Invalid comparison between Unknown and I4
			//IL_0304: Unknown result type (might be due to invalid IL or missing references)
			//IL_0309: Unknown result type (might be due to invalid IL or missing references)
			//IL_030f: Invalid comparison between Unknown and I4
			//IL_0653: Unknown result type (might be due to invalid IL or missing references)
			//IL_0654: Unknown result type (might be due to invalid IL or missing references)
			//IL_0660: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ee: 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_01f6: Invalid comparison between Unknown and I4
			//IL_0624: Unknown result type (might be due to invalid IL or missing references)
			//IL_062a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0259: 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_0261: Invalid comparison between Unknown and I4
			//IL_026d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0272: Unknown result type (might be due to invalid IL or missing references)
			//IL_0278: Invalid comparison between Unknown and I4
			//IL_0263: Unknown result type (might be due to invalid IL or missing references)
			//IL_0264: Unknown result type (might be due to invalid IL or missing references)
			//IL_026a: Invalid comparison between Unknown and I4
			//IL_03f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_040b: Unknown result type (might be due to invalid IL or missing references)
			//IL_043d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0448: Unknown result type (might be due to invalid IL or missing references)
			//IL_0452: Unknown result type (might be due to invalid IL or missing references)
			//IL_0457: Unknown result type (might be due to invalid IL or missing references)
			//IL_045c: 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_046b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0470: 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_04f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0500: 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_0597: Unknown result type (might be due to invalid IL or missing references)
			//IL_059d: Unknown result type (might be due to invalid IL or missing references)
			ForceConnect fC = fcdoor.GetFC();
			EOSLogger.Log($"OnSyncDoorStatusChange: m_lastState.hasBeenApproached: {fcdoor.m_lastState.hasBeenApproached}, state.hasBeenApproached: {state.hasBeenApproached}, ForceConnect: {fC}");
			if (fcdoor.m_lastState.hasBeenApproached != state.hasBeenApproached && state.hasBeenApproached && (Object)(object)fC != (Object)null && !isRecall)
			{
				WardenObjectiveManager.CheckAndExecuteEventsOnTrigger(ListExtensions.ToIl2Cpp<WardenObjectiveEventData>(fC.Cfg.Setting.EventsOnApproachDoor), (eWardenObjectiveEventTrigger)0, true, 0f, (Il2CppStructArray<eWardenObjectiveEventType>)null);
				fcdoor.LastStatus = state.status;
				fcdoor.m_lastState = state;
				return;
			}
			fcdoor.Gate.HasBeenOpenedDuringPlay = state.hasBeenOpenedDuringGame;
			fcdoor.m_graphics.OnDoorState(state, isRecall);
			fcdoor.m_anim.OnDoorState(state, isRecall);
			fcdoor.m_locks.OnDoorState(state, isRecall);
			bool flag = (int)fcdoor.m_securityDoorType == 2;
			eDoorStatus status = state.status;
			eDoorStatus val = status;
			switch (val - 1)
			{
			case 0:
			case 1:
			case 4:
			case 5:
			case 6:
			case 7:
			case 8:
				if ((int)state.status == 8 && fcdoor.OnChainPuzzleActivate != null)
				{
					WardenObjectiveManager.CheckAndExecuteEventsOnTrigger(ListExtensions.ToIl2Cpp<WardenObjectiveEventData>(fC.Cfg.Setting.EventsOnDoorScanStart), (eWardenObjectiveEventTrigger)0, true, 0f, (Il2CppStructArray<eWardenObjectiveEventType>)null);
					if (fcdoor.LinkedToZoneData.PlayScannerVoiceAudio)
					{
						fcdoor.m_sound.Post(EVENTS.TTS_PLEASE_STEP_INTO_THE_BIOSCAN, true);
					}
					fcdoor.OnChainPuzzleActivate.Invoke();
				}
				if ((int)state.status == 9 && fcdoor.OnChainPuzzleActivate != null)
				{
					WardenObjectiveManager.CheckAndExecuteEventsOnTrigger(ListExtensions.ToIl2Cpp<WardenObjectiveEventData>(fC.Cfg.Setting.EventsOnDoorScanDone), (eWardenObjectiveEventTrigger)0, true, 0f, (Il2CppStructArray<eWardenObjectiveEventType>)null);
					if (fC.Cfg.Setting.PlayScannerVoiceAudio)
					{
						fcdoor.m_sound.Post(EVENTS.TTS_BIOSCAN_SEQUENCE_COMPLETED, true);
					}
				}
				if (((int)state.status == 9 || (int)state.status == 5) && (int)fcdoor.m_lastState.status == 3)
				{
					WardenObjectiveManager.CheckAndExecuteEventsOnTrigger(ListExtensions.ToIl2Cpp<WardenObjectiveEventData>(fC.Cfg.Setting.EventsOnUnlockDoor), (eWardenObjectiveEventTrigger)0, true, 0f, (Il2CppStructArray<eWardenObjectiveEventType>)null);
				}
				fcdoor.m_mapLookatRevealer.SetLocalGUIObjStatus((eCM_GuiObjectStatus)(flag ? 11 : 7));
				fcdoor.CheckSetNavmarkerForBulkheadDoors();
				break;
			case 2:
			{
				fcdoor.m_mapLookatRevealer.SetLocalGUIObjStatus((eCM_GuiObjectStatus)(flag ? 11 : 8));
				PlaceNavMarkerOnGO navMarkerPlacer2 = fcdoor.m_navMarkerPlacer;
				if ((Object)(object)navMarkerPlacer2 != (Object)null)
				{
					navMarkerPlacer2.SetMarkerVisible(false);
				}
				break;
			}
			case 3:
				if ((int)fcdoor.m_lastState.status == 3)
				{
					WardenObjectiveManager.CheckAndExecuteEventsOnTrigger(ListExtensions.ToIl2Cpp<WardenObjectiveEventData>(fC.Cfg.Setting.EventsOnUnlockDoor), (eWardenObjectiveEventTrigger)0, true, 0f, (Il2CppStructArray<eWardenObjectiveEventType>)null);
				}
				fcdoor.m_mapLookatRevealer.SetLocalGUIObjStatus((eCM_GuiObjectStatus)(flag ? 11 : 9));
				fcdoor.CheckSetNavmarkerForBulkheadDoors();
				break;
			case 9:
			{
				PlaceNavMarkerOnGO navMarkerPlacer = fcdoor.m_navMarkerPlacer;
				if ((Object)(object)navMarkerPlacer != (Object)null)
				{
					navMarkerPlacer.SetMarkerVisible(false);
				}
				fcdoor.m_mapLookatRevealer.SetLocalGUIObjStatus((eCM_GuiObjectStatus)(flag ? 12 : 6));
				ActiveEnemyWaveData activeEnemyWave = fC.Cfg.Setting.ActiveEnemyWave;
				if (activeEnemyWave == null || !activeEnemyWave.HasActiveEnemyWave)
				{
					break;
				}
				fcdoor.m_sound.Post(EVENTS.MONSTER_RUCKUS_FROM_BEHIND_SECURITY_DOOR_LOOP_STOP, true);
				if (isRecall || !SNet.IsMaster)
				{
					break;
				}
				ForceConnectCfg cfg = fC.Cfg;
				LG_Zone val2 = default(LG_Zone);
				Builder.CurrentFloor.TryGetZoneByLocalIndex(cfg.DimensionIndex, cfg.To.Layer, cfg.To.LocalIndex, ref val2);
				AIG_CourseNode courseNode = val2.m_areas[cfg.To.AreaIndex].m_courseNode;
				Vector3 val3 = ((Component)fcdoor).transform.position + ((Component)fcdoor).transform.forward * -1.5f + Vector3.up * 0.3f;
				Vector3 gateCrossingVec = fcdoor.Gate.GetGateCrossingVec();
				if (activeEnemyWave.EnemyGroupInfrontOfDoor != 0)
				{
					EnemyGroupDataBlock block = GameDataBlockBase<EnemyGroupDataBlock>.GetBlock(activeEnemyWave.EnemyGroupInfrontOfDoor);
					if (block == null)
					{
						EOSLogger.Error($"Can not spawn group. EnemyGroupDataBlock.GetBlock(ActiveEnemyWaveData.EnemyGroupInfrontOfDoor = {activeEnemyWave.EnemyGroupInfrontOfDoor}) returned null.");
					}
					else
					{
						Mastermind.Current.SpawnGroup(val3, courseNode, (EnemyGroupType)2, (eEnemyGroupSpawnType)3, block, -1f, gateCrossingVec, (IReplicator)null);
					}
				}
				if (activeEnemyWave.EnemyGroupInArea == 0)
				{
					break;
				}
				EnemyGroupDataBlock block2 = GameDataBlockBase<EnemyGroupDataBlock>.GetBlock(activeEnemyWave.EnemyGroupInArea);
				if (block2 == null)
				{
					EOSLogger.Error($"Can not spawn groups.EnemyGroupDataBlock.GetBlock(ActiveEnemyWaveData.EnemyGroupInArea = {activeEnemyWave.EnemyGroupInArea} ) returned null.");
				}
				else
				{
					for (int i = 0; i < activeEnemyWave.EnemyGroupsInArea; i++)
					{
						Mastermind.Current.SpawnGroup(val3, courseNode, (EnemyGroupType)2, (eEnemyGroupSpawnType)0, block2, -1f, default(Vector3), (IReplicator)null);
					}
				}
				break;
			}
			case 14:
			{
				fcdoor.m_mapLookatRevealer.SetLocalGUIObjStatus((eCM_GuiObjectStatus)(flag ? 11 : 7));
				PlaceNavMarkerOnGO navMarkerPlacer3 = fcdoor.m_navMarkerPlacer;
				if ((Object)(object)navMarkerPlacer3 != (Object)null)
				{
					navMarkerPlacer3.SetMarkerVisible(false);
				}
				break;
			}
			case 15:
				if (isRecall && SNet.IsMaster)
				{
					fcdoor.m_sync.AttemptDoorInteraction((eDoorInteractionType)0, 0f, 0f, default(Vector3), (Agent)null);
				}
				else if (SNet.IsMaster)
				{
					fcdoor.m_checkpointPuzzle.AttemptInteract((eChainedPuzzleInteraction)0);
				}
				break;
			}
			fcdoor.LastStatus = state.status;
			fcdoor.m_lastState = state;
		}
	}
	public class ForceConnect : MonoBehaviour
	{
		internal bool ShouldFlipDoor;

		private bool _IsDynamicPortalSetup;

		private AIG_CourseNode _FromNode;

		private AIG_CourseNode _ToNode;

		private AIG_CoursePortal _Portal;

		private bool _PortalEnabled = true;

		public LG_SecurityDoor LinkedSecDoor { get; internal set; }

		public ForceConnectCfg Cfg { get; internal set; }

		private void Update()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Invalid comparison between Unknown and I4
			//IL_0083: 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_008d: 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_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Invalid comparison between Unknown and I4
			if (!_IsDynamicPortalSetup && (Object)(object)LinkedSecDoor != (Object)null && (int)GameStateManager.CurrentStateName == 10)
			{
				LG_Gate gate = LinkedSecDoor.Gate;
				_Portal = ((LG_ZoneExpander)gate).CoursePortal;
				_FromNode = ((LG_ZoneExpander)gate).m_linksFrom.m_courseNode;
				_ToNode = ((LG_ZoneExpander)gate).m_linksTo.m_courseNode;
				_IsDynamicPortalSetup = true;
			}
			else if (_IsDynamicPortalSetup)
			{
				eDoorStatus status = LinkedSecDoor.m_sync.GetCurrentSyncState().status;
				eDoorStatus val = status;
				if ((int)val != 10)
				{
					SetPortalEnabled(enabled: false);
				}
				else
				{
					SetPortalEnabled(enabled: true);
				}
			}
		}

		private void SetPortalEnabled(bool enabled)
		{
			if (enabled && !_PortalEnabled)
			{
				_FromNode.m_portals.Add(_Portal);
				_ToNode.m_portals.Add(_Portal);
				_PortalEnabled = true;
			}
			else if (!enabled && _PortalEnabled)
			{
				RemoveItem(_FromNode.m_portals, _Portal);
				RemoveItem(_ToNode.m_portals, _Portal);
				_PortalEnabled = false;
			}
		}

		private void RemoveItem(List<AIG_CoursePortal> portals, AIG_CoursePortal portal)
		{
			for (int i = 0; i < portals.Count; i++)
			{
				if (((Il2CppObjectBase)portals[i]).Pointer == ((Il2CppObjectBase)portal).Pointer)
				{
					portals.RemoveAt(i);
					break;
				}
			}
		}

		static ForceConnect()
		{
			ClassInjector.RegisterTypeInIl2Cpp<ForceConnect>();
		}
	}
	public class ForceConnectManager : GenericExpeditionDefinitionManager<ForceConnectCfg>
	{
		public enum FCDoorEventType
		{
			OpenFCDoor = 900,
			UnlockFCDoor,
			CloseFCDoor,
			LockFCDoor
		}

		private Dictionary<string, LG_SecurityDoor> m_doorLookup = new Dictionary<string, LG_SecurityDoor>();

		public static ForceConnectManager Current { get; } = new ForceConnectManager();


		protected override string DEFINITION_NAME => "ExtraDoor";

		public void BuildCfg(ForceConnectCfg cfg)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: 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_01eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f1: 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_0233: Unknown result type (might be due to invalid IL or missing references)
			//IL_0239: Unknown result type (might be due to invalid IL or missing references)
			//IL_023f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0312: Unknown result type (might be due to invalid IL or missing references)
			//IL_0318: Unknown result type (might be due to invalid IL or missing references)
			//IL_031e: Unknown result type (might be due to invalid IL or missing references)
			//IL_035a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0360: Unknown result type (might be due to invalid IL or missing references)
			//IL_0366: Unknown result type (might be due to invalid IL or missing references)
			eDimensionIndex dimensionIndex = cfg.DimensionIndex;
			Door from = cfg.From;
			Door to = cfg.To;
			LG_Zone val = default(LG_Zone);
			LG_Zone val2 = default(LG_Zone);
			if (!Builder.CurrentFloor.TryGetZoneByLocalIndex(dimensionIndex, from.Layer, from.LocalIndex, ref val) || 0 > from.AreaIndex || from.AreaIndex >= val.m_areas.Count || !Builder.CurrentFloor.TryGetZoneByLocalIndex(dimensionIndex, to.Layer, to.LocalIndex, ref val2) || 0 > to.AreaIndex || to.AreaIndex >= val2.m_areas.Count)
			{
				EOSLogger.Error($"CircularZones Build: Cannot find Zone 'From' or 'To'!\nFrom:({(cfg.DimensionIndex, from.Layer, from.LocalIndex, (char)(65 + from.AreaIndex))})To:({(cfg.DimensionIndex, to.Layer, to.LocalIndex, (char)(65 + to.AreaIndex))})");
				return;
			}
			LG_Area fromArea = val.m_areas[from.AreaIndex];
			LG_Area toArea = val2.m_areas[to.AreaIndex];
			List<(LG_ZoneExpander, LG_ZoneExpander)> expandersBetween = ForceConnectDoorUtils.GetExpandersBetween(fromArea, toArea);
			if (expandersBetween.Count < 1)
			{
				EOSLogger.Error($"ExtraDoor: cannot find gate / plug! From:({(cfg.DimensionIndex, from.Layer, from.LocalIndex, (char)(65 + from.AreaIndex))})To:({(cfg.DimensionIndex, to.Layer, to.LocalIndex, (char)(65 + to.AreaIndex))})");
			}
			else if (cfg.FromDoorIndex < 0 || cfg.FromDoorIndex >= expandersBetween.Count)
			{
				EOSLogger.Error($"ExtraDoor: FromDoorIndex ({cfg.FromDoorIndex}) is out of range [0, {expandersBetween.Count})From:({(cfg.DimensionIndex, from.Layer, from.LocalIndex, (char)(65 + from.AreaIndex))})To:({(cfg.DimensionIndex, to.Layer, to.LocalIndex, (char)(65 + to.AreaIndex))})");
			}
			else
			{
				Setup(expandersBetween[cfg.FromDoorIndex].Item1, expandersBetween[cfg.FromDoorIndex].Item2);
			}
			void Setup(LG_ZoneExpander expandFrom, LG_ZoneExpander expandTo)
			{
				LG_Plug val3 = ((Il2CppObjectBase)expandFrom).TryCast<LG_Plug>();
				LG_Plug val4 = ((Il2CppObjectBase)expandTo).TryCast<LG_Plug>();
				if ((Object)(object)val3 != (Object)null && (Object)(object)val4 != (Object)null)
				{
					val3.m_pariedWith = val4;
					val4.m_pariedWith = val3;
					((LG_ZoneExpander)val3).m_isZoneSource = true;
					expandFrom.ExpanderStatus = (LG_ZoneExpanderStatus)1;
					expandTo.ExpanderStatus = (LG_ZoneExpanderStatus)1;
					expandFrom.m_linksTo = expandTo.m_linksFrom;
					expandTo.m_linksTo = expandFrom.m_linksFrom;
					GameObject gameObject = ((Component)val3).gameObject;
					((Object)gameObject).name = ((Object)gameObject).name + "FORCE PAIR";
					((Component)val3).gameObject.AddComponent<ForceConnect>().Cfg = cfg;
				}
				else
				{
					LG_Gate gate = expandFrom.GetGate();
					switch (cfg.Setting.SecurityGateToEnter)
					{
					case GateType.Security:
						gate.ForceSecurityGate = true;
						break;
					case GateType.Apex:
						gate.ForceApexGate = true;
						break;
					case GateType.Bulkhead:
					case GateType.Bulkhead_Main:
						gate.ForceSecurityGate = true;
						gate.ForceBulkheadGate = true;
						break;
					}
					if (((Il2CppObjectBase)fromArea.m_zone).Pointer != ((Il2CppObjectBase)toArea.m_zone).Pointer)
					{
						expandFrom.m_isZoneSource = true;
						expandFrom.ExpanderStatus = (LG_ZoneExpanderStatus)1;
						expandTo.ExpanderStatus = (LG_ZoneExpanderStatus)1;
					}
					GameObject gameObject2 = ((Component)gate).gameObject;
					((Object)gameObject2).name = ((Object)gameObject2).name + "FORCE PAIR";
					((Component)gate).gameObject.AddComponent<ForceConnect>().Cfg = cfg;
				}
			}
		}

		private void Build()
		{
			if (base.definitions.TryGetValue(base.CurrentMainLevelLayout, out var value))
			{
				value.Definitions.ForEach(BuildCfg);
			}
		}

		private void BuildProgressionPuzzle()
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: 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)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_015f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Expected I4, but got Unknown
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Expected O, but got Unknown
			//IL_023c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0241: Unknown result type (might be due to invalid IL or missing references)
			//IL_0250: Expected O, but got Unknown
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f0: 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_0202: Unknown result type (might be due to invalid IL or missing references)
			//IL_0284: Unknown result type (might be due to invalid IL or missing references)
			//IL_028b: Expected O, but got Unknown
			//IL_039e: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_040a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0416: Unknown result type (might be due to invalid IL or missing references)
			//IL_041d: Unknown result type (might be due to invalid IL or missing references)
			//IL_042d: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_033d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0359: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0306: Unknown result type (might be due to invalid IL or missing references)
			LG_Zone val = default(LG_Zone);
			LG_Zone val2 = default(LG_Zone);
			foreach (KeyValuePair<string, LG_SecurityDoor> item in m_doorLookup)
			{
				LG_SecurityDoor value = item.Value;
				ForceConnect fC = value.GetFC();
				Door from = fC.Cfg.From;
				Door to = fC.Cfg.To;
				if (!Builder.CurrentFloor.TryGetZoneByLocalIndex(fC.Cfg.DimensionIndex, from.Layer, from.LocalIndex, ref val) || 0 > from.AreaIndex || from.AreaIndex >= val.m_areas.Count || !Builder.CurrentFloor.TryGetZoneByLocalIndex(fC.Cfg.DimensionIndex, to.Layer, to.LocalIndex, ref val2) || 0 > to.AreaIndex || to.AreaIndex >= val2.m_areas.Count || val2.ID <= 0)
				{
					continue;
				}
				if ((Object)(object)val2.m_sourceExpander == (Object)null)
				{
					EOSLogger.Error("Found zone without sourceGate AND ID over 0, id: " + val.ID);
					continue;
				}
				FCProgressionPuzzleToEnter progressionPuzzleToEnter = fC.Cfg.Setting.ProgressionPuzzleToEnter;
				LG_Layer layer = val2.Layer;
				eProgressionPuzzleType puzzleType = progressionPuzzleToEnter.PuzzleType;
				eProgressionPuzzleType val3 = puzzleType;
				switch (val3 - 1)
				{
				case 0:
				{
					GateKeyItem randomKey = Builder.CurrentFloor.GetRandomKey(Builder.SessionSeedRandom);
					LG_Factory.InjectJob((LG_FactoryJob)new LG_BuildKeyItemLockJob(value, randomKey), (BatchName)43);
					if (progressionPuzzleToEnter.ZonePlacementData.Count > 0)
					{
						LG_Zone val8 = CreateKeyItemDistribution(randomKey, progressionPuzzleToEnter.ZonePlacementData[Builder.SessionSeedRandom.Range(0, progressionPuzzleToEnter.ZonePlacementData.Count, "NO_TAG")], layer);
						ProgressionObjectivesManager.RegisterProgressionObjective(val2.DimensionIndex, val2.Layer.m_type, val2.LocalIndex, ((Il2CppObjectBase)new ProgressionObjective_KeyCard(randomKey, val2, val8)).Cast<IProgressionObjective>());
					}
					break;
				}
				case 1:
				{
					AIG_CourseNode courseNode = val.m_areas[from.AreaIndex].m_courseNode;
					LG_DistributeItem val4 = new LG_DistributeItem((ExpeditionFunction)6, 1f, courseNode, (LG_Gate)null)
					{
						m_assignedGate = value.Gate
					};
					courseNode.m_zone.DistributionData.GenericFunctionItems.Enqueue(val4);
					LG_Zone val5 = null;
					for (int i = 0; i < progressionPuzzleToEnter.PlacementCount; i++)
					{
						LG_Zone val6 = layer.m_zones[0];
						ZonePlacementWeights val7 = new ZonePlacementWeights();
						if (progressionPuzzleToEnter.ZonePlacementData.Count > 0)
						{
							FCZonePlacementData fCZonePlacementData = progressionPuzzleToEnter.ZonePlacementData[Builder.SessionSeedRandom.Range(0, progressionPuzzleToEnter.ZonePlacementData.Count, "NO_TAG")];
							if (layer.m_zonesByLocalIndex.ContainsKey(((GlobalZoneIndex)fCZonePlacementData).LocalIndex))
							{
								val6 = layer.m_zonesByLocalIndex[((GlobalZoneIndex)fCZonePlacementData).LocalIndex];
								val5 = layer.m_zonesByLocalIndex[((GlobalZoneIndex)fCZonePlacementData).LocalIndex];
								val7 = fCZonePlacementData.Weights;
							}
							else
							{
								EOSLogger.Error($"ProgressionPuzzleToEnter, Could NOT find zone with LocalIndex {((GlobalZoneIndex)fCZonePlacementData).LocalIndex} to place powerCell in to enter Zone {val2.LocalIndex}. Faulty zone specified!? DEFAULTING TO THE FIRST ZONE");
							}
						}
						else
						{
							EOSLogger.Error($"ProgressionPuzzleToEnter has NO placement data for power cell going into {layer.m_type} lg_Zone.LocalIndex");
						}
						((LG_FactoryJob)new LG_Distribute_PickupItemsPerZone(val6, 1f, (ePickupItemType)3, 131u, val7)).Build();
					}
					if ((Object)(object)val5 != (Object)null)
					{
						ProgressionObjectivesManager.RegisterProgressionObjective(val2.DimensionIndex, val2.Layer.m_type, val2.LocalIndex, ((Il2CppObjectBase)new ProgressionObjective_GeneratorCell(val2, val5, courseNode.m_zone)).Cast<IProgressionObjective>());
					}
					break;
				}
				case 2:
					value.SetupAsLockedNoKey(progressionPuzzleToEnter.CustomText);
					break;
				}
			}
		}

		private LG_Zone CreateKeyItemDistribution(GateKeyItem keyItem, FCZonePlacementData placementData, LG_Layer doorLayer)
		{
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Expected O, but got Unknown
			//IL_0230: Unknown result type (might be due to invalid IL or missing references)
			//IL_0237: Expected O, but got Unknown
			EOSLogger.Log($"CreateKeyItemDistribution, keyItem: {keyItem}, placementData: {placementData}");
			LG_Zone val = doorLayer.m_zones[0];
			if (doorLayer.m_zonesByLocalIndex.ContainsKey(((GlobalZoneIndex)placementData).LocalIndex))
			{
				val = doorLayer.m_zonesByLocalIndex[((GlobalZoneIndex)placementData).LocalIndex];
			}
			else
			{
				EOSLogger.Error($"LG_Distribute_ProgressionPuzzles.CreateKeyItemDistribution, Could NOT find zone with LocalIndex {((GlobalZoneIndex)placementData).LocalIndex} to place keycard in to enter Zone {val.LocalIndex} Faulty zone specified!? Dim: {doorLayer.m_dimension.DimensionIndex} | DEFAULTING TO THE FIRST ZONE");
			}
			ResourceContainerSpawnData val2 = new ResourceContainerSpawnData
			{
				m_type = (eResourceContainerSpawnType)7,
				m_keyItem = keyItem
			};
			float num = Builder.BuildSeedRandom.Value("LG_Distribute_ProgressionPuzzles.CreateKeyItemDistribution_" + keyItem.PublicName);
			AIG_CourseNode val3 = null;
			LG_DistributeItem val4 = default(LG_DistributeItem);
			if (LG_DistributionJobUtils.TryGetExistingZoneFunctionDistribution(val, (ExpeditionFunction)10, Builder.SessionSeedRandom.Value("LG_Distribute_ProgressionPuzzles.CreateKeyItemDistribution_TryGetZoneFunctionDistribution"), placementData.Weights, ref val4, ref val3, true, "FindContainerFor " + (object)keyItem))
			{
				LG_DistributeResourceContainer val5 = ((Il2CppObjectBase)val4).Cast<LG_DistributeResourceContainer>();
				if (val5 != null)
				{
					val5.m_packs.Add(val2);
					val5.m_locked = true;
				}
				else
				{
					EOSLogger.Error("LG_Distribute_ProgressionPuzzles.CreateKeyItemDistribution could not cast distItem as LG_DistributeResourceContainer!!");
				}
			}
			else
			{
				val3 = LG_DistributionJobUtils.GetRandomNodeFromZoneForFunction(val, (ExpeditionFunction)10, num, 1f);
				LG_DistributeResourceContainer val6 = new LG_DistributeResourceContainer((ExpeditionFunction)10, val2, false, val3, Builder.BuildSeedRandom.Range(0, int.MaxValue, "LG_Distribute_ProgressionPuzzles_New_LG_DistributeResourceContainer"), Builder.BuildSeedRandom.Value("LG_Distribute_ProgressionPuzzles_New_LG_DistributeResourceContainer_Lock"), Builder.BuildSeedRandom.Range(2, 4, "LG_Distribute_ProgressionPuzzles_New_LG_DistributeResourceContainer_StoragePotential"));
				val3.m_zone.DistributionData.ResourceContainerItems.Enqueue(val6);
				EOSLogger.Error("LG_Distribute_ProgressionPuzzles.CreateKeyItemDistribution Had to create a new resourceContainer!!");
			}
			iLG_SpawnedInNodeHandler component = ((Component)keyItem.SpawnedItem).GetComponent<iLG_SpawnedInNodeHandler>();
			if (component != null)
			{
				component.SpawnNode = val3;
			}
			return val;
		}

		public void RegisterFCDoor(LG_SecurityDoor fcdoor)
		{
			ForceConnect fC = fcdoor.GetFC();
			if ((Object)(object)fC == (Object)null)
			{
				EOSLogger.Error("ExtraDoor: Registering non-forceconnect door");
				return;
			}
			if (m_doorLookup.ContainsKey(fC.Cfg.WorldEventObjectFilter))
			{
				EOSLogger.Error("ExtraDoor: Duplicate ExtraDoor '" + fC.Cfg.WorldEventObjectFilter + "'");
			}
			m_doorLookup[fC.Cfg.WorldEventObjectFilter] = fcdoor;
		}

		public LG_SecurityDoor GetFCDoor(string worldEventObjectFilter)
		{
			LG_SecurityDoor value;
			return m_doorLookup.TryGetValue(worldEventObjectFilter, out value) ? value : null;
		}

		private void Cleanup()
		{
			m_doorLookup.Clear();
		}

		private void OnEnterLevel()
		{
		}

		private ForceConnectManager()
		{
			BatchBuildManager.Current.Add_OnBatchDone((BatchName)5, (Action)Build);
			BatchBuildManager.Current.Add_OnBatchDone((BatchName)16, (Action)BuildProgressionPuzzle);
			EOSWardenEventManager.Current.AddEventDefinition(FCDoorEventType.OpenFCDoor.ToString(), 900u, (Action<WardenObjectiveEventData>)OpenFCDoor);
			EOSWardenEventManager.Current.AddEventDefinition(FCDoorEventType.UnlockFCDoor.ToString(), 901u, (Action<WardenObjectiveEventData>)UnlockFCDoor);
			EOSWardenEventManager.Current.AddEventDefinition(FCDoorEventType.CloseFCDoor.ToString(), 902u, (Action<WardenObjectiveEventData>)CloseFCDoor);
			EOSWardenEventManager.Current.AddEventDefinition(FCDoorEventType.LockFCDoor.ToString(), 903u, (Action<WardenObjectiveEventData>)LockFCDoor);
			LevelAPI.OnEnterLevel += OnEnterLevel;
			LevelAPI.OnLevelCleanup += Cleanup;
		}

		private static void OpenFCDoor(WardenObjectiveEventData e)
		{
			if (SNet.IsMaster)
			{
				LG_SecurityDoor fCDoor = Current.GetFCDoor(e.WorldEventObjectFilter);
				if ((Object)(object)fCDoor == (Object)null)
				{
					EOSLogger.Error("OpenFCDoor: Cannot find FC door with '" + e.WorldEventObjectFilter + "'");
				}
				else
				{
					fCDoor.ForceOpenSecurityDoor();
				}
			}
		}

		private static void UnlockFCDoor(WardenObjectiveEventData e)
		{
			if (SNet.IsMaster)
			{
				LG_SecurityDoor fCDoor = Current.GetFCDoor(e.WorldEventObjectFilter);
				if ((Object)(object)fCDoor == (Object)null)
				{
					EOSLogger.Error("UnlockFCDoor: Cannot find FC door with '" + e.WorldEventObjectFilter + "'");
				}
				else
				{
					fCDoor.UseChainedPuzzleOrUnlock(SNet.Master);
				}
			}
		}

		private static void CloseFCDoor(WardenObjectiveEventData e)
		{
			//IL_0059: 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_005f: 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_0067: Invalid comparison between Unknown and I4
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Invalid comparison between Unknown and I4
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: 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)
			//IL_00bc: 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)
			if (!SNet.IsMaster)
			{
				return;
			}
			LG_SecurityDoor fCDoor = Current.GetFCDoor(e.WorldEventObjectFilter);
			if ((Object)(object)fCDoor == (Object)null)
			{
				EOSLogger.Error("UnlockFCDoor: Cannot find FC door with '" + e.WorldEventObjectFilter + "'");
				return;
			}
			pDoorState currentSyncState = fCDoor.m_sync.GetCurrentSyncState();
			if ((int)currentSyncState.status != 10 && (int)currentSyncState.status != 16)
			{
				return;
			}
			LG_Door_Sync val = ((Il2CppObjectBase)fCDoor.m_sync).TryCast<LG_Door_Sync>();
			if (!((Object)(object)val == (Object)null))
			{
				pDoorState currentSyncState2 = val.GetCurrentSyncState();
				currentSyncState2.status = (eDoorStatus)1;
				currentSyncState2.hasBeenOpenedDuringGame = false;
				pDoorState state = currentSyncState2;
				val.m_stateReplicator.State = state;
				LG_Gate gate = fCDoor.Gate;
				gate.HasBeenOpenedDuringPlay = false;
				gate.IsTraversable = false;
				ForceConnect fC = fCDoor.GetFC();
				DoorSetting setting = fC.Cfg.Setting;
				if (setting.ActiveEnemyWave != null && setting.ActiveEnemyWave.HasActiveEnemyWave)
				{
					fCDoor.m_sound.Post(EVENTS.MONSTER_RUCKUS_FROM_BEHIND_SECURITY_DOOR_LOOP_START, true);
				}
				EOSLogger.Debug("Door Closed!");
			}
		}

		private static void LockFCDoor(WardenObjectiveEventData e)
		{
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: 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_0082: Unknown result type (might be due to invalid IL or missing references)
			if (!SNet.IsMaster)
			{
				return;
			}
			LG_SecurityDoor fCDoor = Current.GetFCDoor(e.WorldEventObjectFilter);
			if ((Object)(object)fCDoor == (Object)null)
			{
				EOSLogger.Error("UnlockFCDoor: Cannot find FC door with '" + e.WorldEventObjectFilter + "'");
				return;
			}
			LG_Door_Sync val = ((Il2CppObjectBase)fCDoor.m_sync).TryCast<LG_Door_Sync>();
			if (!((Object)(object)val == (Object)null))
			{
				pDoorState currentSyncState = val.GetCurrentSyncState();
				currentSyncState.status = (eDoorStatus)7;
				pDoorState state = currentSyncState;
				val.m_stateReplicator.State = state;
				EOSLogger.Debug("Door Locked!");
			}
		}
	}
}
namespace EOSExt.ExtraDoor.Patches
{
	[HarmonyPatch]
	internal static class CheckDoorFlip
	{
		[HarmonyPrefix]
		[HarmonyWrapSafe]
		[HarmonyPatch(typeof(LG_BuildSecurityDoorLockJob), "CheckFlip")]
		private static bool Pre_(LG_BuildSecurityDoorLockJob __instance)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: 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_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
			ForceConnect fC = __instance.m_door.GetFC();
			if ((Object)(object)fC == (Object)null)
			{
				return true;
			}
			LG_SecurityDoor door = __instance.m_door;
			Vector3 forward = ((Component)door).transform.forward;
			ForceConnectCfg cfg = fC.Cfg;
			Door from = cfg.From;
			LG_Zone val = default(LG_Zone);
			Builder.CurrentFloor.TryGetZoneByLocalIndex(cfg.DimensionIndex, from.Layer, from.LocalIndex, ref val);
			LG_Area val2 = val.m_areas[from.AreaIndex];
			LG_Area linksFrom = ((LG_ZoneExpander)door.Gate).m_linksFrom;
			Door to = cfg.To;
			EOSLogger.Warning($"CheckFilp!\nOri: {((Object)linksFrom).name} -> {((Object)((LG_ZoneExpander)door.Gate).m_linksTo).name}\nShould be: {(cfg.DimensionIndex, from.Layer, from.LocalIndex, (char)(65 + from.AreaIndex))} -> {(cfg.DimensionIndex, to.Layer, to.LocalIndex, (char)(65 + to.AreaIndex))}");
			if (door.FlippedForProgresion)
			{
				EOSLogger.Error("Door already flipped, skipped ....");
				return false;
			}
			if (((Il2CppObjectBase)val2).Pointer == ((Il2CppObjectBase)linksFrom).Pointer)
			{
				EOSLogger.Error("Flipped!");
				door.FlippedForProgresion = true;
				((Component)door).transform.rotation = Quaternion.LookRotation(((Component)door).transform.forward * -1f, ((Component)door).transform.up);
			}
			return false;
		}
	}
	[HarmonyPatch]
	internal static class OnSecurityDoorSetup
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(LG_SecurityDoor), "Setup")]
		private static void Postfix(LG_SecurityDoor __instance)
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: 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_0167: Unknown result type (might be due to invalid IL or missing references)
			ForceConnect fC = __instance.GetFC();
			if (!((Object)(object)fC != (Object)null))
			{
				return;
			}
			ForceConnectCfg cfg = fC.Cfg;
			Door from = cfg.From;
			Door to = cfg.To;
			EOSLogger.Debug($"ForceConnect: {cfg.DimensionIndex}, ({from.Layer}, {from.LocalIndex}, {(ushort)(65 + from.AreaIndex)}) <-> ({to.Layer}, {to.LocalIndex}, {(ushort)(65 + to.AreaIndex)})\nWorldEventObjectFilter: '{cfg.WorldEventObjectFilter}', FromDoorIndex: {cfg.FromDoorIndex}");
			ForceConnectManager.Current.RegisterFCDoor(__instance);
			fC.LinkedSecDoor = __instance;
			__instance.LinksToLayerType = to.Layer;
			LG_Door_Sync val = ((Il2CppObjectBase)__instance.m_sync).Cast<LG_Door_Sync>();
			val.OnDoorStateChange = Action<pDoorState, bool>.op_Implicit((Action<pDoorState, bool>)__instance.FCOnSyncDoorStatusChange);
			LG_SecurityDoor_Anim val2 = ((Il2CppObjectBase)__instance.m_anim).TryCast<LG_SecurityDoor_Anim>();
			if ((Object)(object)val2 != (Object)null)
			{
				val2.OnDoorOpenStarted = Action.op_Implicit((Action)__instance.FCOnDoorOpenStarted);
				val2.OnDoorIsOpen = Action.op_Implicit((Action)__instance.FCOnDoorIsOpen);
				return;
			}
			LG_ApexDoor_Anim val3 = ((Il2CppObjectBase)__instance.m_anim).TryCast<LG_ApexDoor_Anim>();
			if ((Object)(object)val3 != (Object)null)
			{
				val3.OnDoorOpenStarted = Action.op_Implicit((Action)__instance.FCOnDoorOpenStarted);
				val3.OnDoorIsOpen = Action.op_Implicit((Action)__instance.FCOnDoorIsOpen);
			}
			else
			{
				EOSLogger.Error("LG_SecurityDoor: Cannot cast iLG_Door_Anim");
			}
		}
	}
}
namespace EOSExt.ExtraDoor.Patches.SetupFCDoor
{
	[HarmonyPatch]
	internal static class BuildGate
	{
		[HarmonyPrefix]
		[HarmonyWrapSafe]
		[HarmonyPatch(typeof(LG_BuildGateJob), "Build")]
		private static bool Pre_(LG_BuildGateJob __instance, ref bool __result)
		{
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Invalid comparison between Unknown and I4
			//IL_0184: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ae: Expected I4, but got Unknown
			//IL_0818: Unknown result type (might be due to invalid IL or missing references)
			//IL_081e: Invalid comparison between Unknown and I4
			//IL_07a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_07b5: Expected O, but got Unknown
			//IL_084f: Unknown result type (might be due to invalid IL or missing references)
			//IL_085b: Expected O, but got Unknown
			//IL_0327: Unknown result type (might be due to invalid IL or missing references)
			//IL_0332: Unknown result type (might be due to invalid IL or missing references)
			//IL_0337: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0254: Unknown result type (might be due to invalid IL or missing references)
			//IL_0259: Unknown result type (might be due to invalid IL or missing references)
			//IL_027f: Unknown result type (might be due to invalid IL or missing references)
			//IL_037b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0386: Unknown result type (might be due to invalid IL or missing references)
			//IL_038b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0609: Unknown result type (might be due to invalid IL or missing references)
			//IL_060e: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_05cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_05d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_05dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_061e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0624: Invalid comparison between Unknown and I4
			//IL_0404: Unknown result type (might be due to invalid IL or missing references)
			//IL_040f: 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_0465: Unknown result type (might be due to invalid IL or missing references)
			//IL_0470: Unknown result type (might be due to invalid IL or missing references)
			//IL_0475: Unknown result type (might be due to invalid IL or missing references)
			//IL_0672: Unknown result type (might be due to invalid IL or missing references)
			//IL_0677: Unknown result type (might be due to invalid IL or missing references)
			//IL_063b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0645: Unknown result type (might be due to invalid IL or missing references)
			//IL_064a: Unknown result type (might be due to invalid IL or missing references)
			//IL_064f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0654: Unknown result type (might be due to invalid IL or missing references)
			//IL_04b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_04be: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0689: Unknown result type (might be due to invalid IL or missing references)
			//IL_068b: Unknown result type (might be due to invalid IL or missing references)
			//IL_06dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_0705: Unknown result type (might be due to invalid IL or missing references)
			//IL_0721: Unknown result type (might be due to invalid IL or missing references)
			//IL_0731: Unknown result type (might be due to invalid IL or missing references)
			//IL_074a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0762: Unknown result type (might be due to invalid IL or missing references)
			//IL_076e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0778: Unknown result type (might be due to invalid IL or missing references)
			//IL_0791: Unknown result type (might be due to invalid IL or missing references)
			//IL_0589: Unknown result type (might be due to invalid IL or missing references)
			//IL_0594: Unknown result type (might be due to invalid IL or missing references)
			//IL_0599: Unknown result type (might be due to invalid IL or missing references)
			//IL_050b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0510: Unknown result type (might be due to invalid IL or missing references)
			//IL_0536: Unknown result type (might be due to invalid IL or missing references)
			//IL_056a: Unknown result type (might be due to invalid IL or missing references)
			ForceConnect forceConnect = null;
			forceConnect = ((!((Object)(object)__instance.m_plug != (Object)null)) ? ((Component)__instance.m_gate).gameObject.GetComponent<ForceConnect>() : ((Component)__instance.m_plug).gameObject.GetComponent<ForceConnect>());
			if ((Object)(object)forceConnect == (Object)null)
			{
				return true;
			}
			try
			{
				if (((LG_ZoneExpander)__instance.m_gate).m_wasProcessed)
				{
					__result = true;
					return false;
				}
				((LG_ZoneExpander)__instance.m_gate).m_wasProcessed = true;
				if ((Object)(object)__instance.m_plug != (Object)null)
				{
					((LG_ZoneExpander)__instance.m_gate).m_linksFrom = ((LG_ZoneExpander)__instance.m_plug).m_linksFrom;
					((LG_ZoneExpander)__instance.m_gate).ExpanderStatus = ((LG_ZoneExpander)__instance.m_plug).ExpanderStatus;
					if (((LG_ZoneExpander)__instance.m_plug).CoursePortal != null)
					{
						((LG_ZoneExpander)__instance.m_gate).CoursePortal = ((LG_ZoneExpander)__instance.m_plug).CoursePortal;
						((LG_ZoneExpander)__instance.m_gate).CoursePortal.Gate = __instance.m_gate;
						__instance.m_gate.m_needsBorderLinks = true;
						((LG_ZoneExpander)__instance.m_gate).m_linksTo = ((LG_ZoneExpander)__instance.m_plug).m_linksTo;
					}
				}
				else if (((LG_ZoneExpander)__instance.m_gate).CoursePortal != null)
				{
					((LG_ZoneExpander)__instance.m_gate).CoursePortal.Gate = __instance.m_gate;
				}
				if ((int)((LG_ZoneExpander)__instance.m_gate).ExpanderStatus == 2)
				{
					__instance.SetupCappedGate();
				}
				else
				{
					__instance.CalcOpenAtStart();
					LG_GateType type = __instance.m_gate.Type;
					LG_GateType val = type;
					switch ((int)val)
					{
					case 0:
					case 1:
					case 2:
						__instance.CalcOpenAtStart();
						if (__instance.m_gate.m_isTraversableFromStart && __instance.m_gate.HasGateWallRemover && Builder.BuildSeedRandom.Value("LG_BuildGateJob") < RundownManager.ActiveExpeditionBalanceData.WeakDoorOpenChanceForWallRemoverUsed)
						{
							__instance.m_gate.EnableGateWallRemover(RandomExtensions.NextSubSeed(__instance.m_rnd.Random));
						}
						else
						{
							GameObject val2 = null;
							XXHashSeed seed;
							if (__instance.m_gate.ForceBulkheadGate)
							{
								if (forceConnect.Cfg.Setting.SecurityGateToEnter == GateType.Bulkhead_Main)
								{
									seed = __instance.m_rnd.Seed;
									uint num = ((XXHashSeed)(ref seed)).SubSeed(RandomExtensions.NextSubSeed(__instance.m_rnd.Random));
									val2 = Builder.ComplexResourceSetBlock.GetMainPathBulkheadGate(__instance.m_gate.Type, num, (SubComplex)5);
									if ((Object)(object)val2 == (Object)null)
									{
										EOSLogger.Error("Could not get main path bulkhead door prefab: defaulting back to a normal bulkhead door! (You're Complex Resource Set probably don't have the main path bulkhead door references set).");
										val2 = Builder.ComplexResourceSetBlock.GetBulkheadGate(__instance.m_gate.Type, num, (SubComplex)5);
									}
								}
								else
								{
									ComplexResourceSetDataBlock complexResourceSetBlock = Builder.ComplexResourceSetBlock;
									LG_GateType type2 = __instance.m_gate.Type;
									seed = __instance.m_rnd.Seed;
									val2 = complexResourceSetBlock.GetBulkheadGate(type2, ((XXHashSeed)(ref seed)).SubSeed(RandomExtensions.NextSubSeed(__instance.m_rnd.Random)), (SubComplex)5);
								}
							}
							else if (__instance.m_gate.ForceApexGate)
							{
								ComplexResourceSetDataBlock complexResourceSetBlock2 = Builder.ComplexResourceSetBlock;
								LG_GateType type3 = __instance.m_gate.Type;
								seed = __instance.m_rnd.Seed;
								val2 = complexResourceSetBlock2.GetApexGate(type3, ((XXHashSeed)(ref seed)).SubSeed(RandomExtensions.NextSubSeed(__instance.m_rnd.Random)), (SubComplex)5);
							}
							else if (__instance.m_gate.ForceSecurityGate)
							{
								ComplexResourceSetDataBlock complexResourceSetBlock3 = Builder.ComplexResourceSetBlock;
								LG_GateType type4 = __instance.m_gate.Type;
								seed = __instance.m_rnd.Seed;
								val2 = complexResourceSetBlock3.GetSecurityGate(type4, ((XXHashSeed)(ref seed)).SubSeed(RandomExtensions.NextSubSeed(__instance.m_rnd.Random)), (SubComplex)5);
							}
							else if (((LG_ZoneExpander)__instance.m_gate).m_isZoneSource)
							{
								__instance.m_gate.IsCheckpointDoor = forceConnect.Cfg.Setting.IsCheckpointDoor;
								LG_Layer val3 = default(LG_Layer);
								LG_Layer val4 = default(LG_Layer);
								if (((LG_ZoneExpander)__instance.m_gate).IsLayerSource(ref val3, ref val4))
								{
									ComplexResourceSetDataBlock complexResourceSetBlock4 = Builder.ComplexResourceSetBlock;
									LG_GateType type5 = __instance.m_gate.Type;
									seed = __instance.m_rnd.Seed;
									val2 = complexResourceSetBlock4.GetBulkheadGate(type5, ((XXHashSeed)(ref seed)).SubSeed(RandomExtensions.NextSubSeed(__instance.m_rnd.Random)), (SubComplex)5);
								}
								else
								{
									switch (forceConnect.Cfg.Setting.SecurityGateToEnter)
									{
									case GateType.Apex:
									{
										ComplexResourceSetDataBlock complexResourceSetBlock7 = Builder.ComplexResourceSetBlock;
										LG_GateType type8 = __instance.m_gate.Type;
										seed = __instance.m_rnd.Seed;
										val2 = complexResourceSetBlock7.GetApexGate(type8, ((XXHashSeed)(ref seed)).SubSeed(RandomExtensions.NextSubSeed(__instance.m_rnd.Random)), (SubComplex)5);
										break;
									}
									case GateType.Security:
									{
										ComplexResourceSetDataBlock complexResourceSetBlock6 = Builder.ComplexResourceSetBlock;
										LG_GateType type7 = __instance.m_gate.Type;
										seed = __instance.m_rnd.Seed;
										val2 = complexResourceSetBlock6.GetSecurityGate(type7, ((XXHashSeed)(ref seed)).SubSeed(RandomExtensions.NextSubSeed(__instance.m_rnd.Random)), (SubComplex)5);
										break;
									}
									default:
										if (forceConnect.Cfg.Setting.SecurityGateToEnter == GateType.Bulkhead_Main)
										{
											seed = __instance.m_rnd.Seed;
											uint num2 = ((XXHashSeed)(ref seed)).SubSeed(RandomExtensions.NextSubSeed(__instance.m_rnd.Random));
											val2 = Builder.ComplexResourceSetBlock.GetMainPathBulkheadGate(__instance.m_gate.Type, num2, (SubComplex)5);
											if ((Object)(object)val2 == (Object)null)
											{
												EOSLogger.Error("Could not get main path bulkhead door prefab: defaulting back to a normal bulkhead door! (You're Complex Resource Set probably don't have the main path bulkhead door references set).");
												val2 = Builder.ComplexResourceSetBlock.GetBulkheadGate(__instance.m_gate.Type, num2, (SubComplex)5);
											}
										}
										else
										{
											ComplexResourceSetDataBlock complexResourceSetBlock5 = Builder.ComplexResourceSetBlock;
											LG_GateType type6 = __instance.m_gate.Type;
											seed = __instance.m_rnd.Seed;
											val2 = complexResourceSetBlock5.GetBulkheadGate(type6, ((XXHashSeed)(ref seed)).SubSeed(RandomExtensions.NextSubSeed(__instance.m_rnd.Random)), (SubComplex)5);
										}
										break;
									}
								}
							}
							else
							{
								ComplexResourceSetDataBlock complexResourceSetBlock8 = Builder.ComplexResourceSetBlock;
								LG_GateType type9 = __instance.m_gate.Type;
								seed = __instance.m_rnd.Seed;
								val2 = complexResourceSetBlock8.GetWeakGate(type9, ((XXHashSeed)(ref seed)).SubSeed(RandomExtensions.NextSubSeed(__instance.m_rnd.Random)), (SubComplex)5);
							}
							Vector3 position = ((Component)__instance.m_gate).transform.position;
							Quaternion val5;
							if (__instance.m_plugWasFlipped || (int)((LG_ZoneExpander)__instance.m_gate).ExpanderRotation == 3)
							{
								val5 = Quaternion.LookRotation(((Component)__instance.m_gate).transform.forward * -1f, Vector3.up);
								__instance.m_gate.m_hasBeenFlipped = true;
							}
							else
							{
								val5 = ((Component)__instance.m_gate).transform.rotation;
								__instance.m_gate.m_hasBeenFlipped = false;
							}
							GameObject val6 = Object.Instantiate<GameObject>(val2, position, val5, ((Component)__instance.m_gate).transform);
							__instance.m_gate.SpawnedDoor = SetupDoor(__instance, val6, forceConnect);
							__instance.SetupSpawners(val6);
							__instance.ProcessDivider(val6, __instance.m_gate.m_hasBeenFlipped);
							Debug.DrawLine(((Component)__instance.m_gate).transform.position, ((LG_ZoneExpander)__instance.m_gate).m_linksFrom.Position, new Color(0f, 0.5f, 1f, 1f), 10000f, false);
							Debug.DrawLine(((Component)__instance.m_gate).transform.position, ((LG_ZoneExpander)__instance.m_gate).m_linksTo.Position, new Color(0f, 1f, 0.5f, 0.25f), 10000f, false);
							Debug.DrawRay(val6.transform.position, val6.transform.forward * 10f, new Color(0f, 1f, 0f, 1f), 10000f, false);
						}
						LG_Factory.InjectJob((LG_FactoryJob)new LG_LinkAIGateJob(__instance.m_gate), (BatchName)29);
						break;
					case 3:
						Debug.LogError(Object.op_Implicit("ERROR : Do we need to use this anymore?"));
						break;
					case 5:
					{
						__instance.m_gate.m_isTraversableFromStart = true;
						((LG_ZoneExpander)__instance.m_gate).m_wasProcessed = true;
						LG_Gate gate = __instance.m_gate;
						((Object)gate).name = ((Object)gate).name + " freePassage!";
						if (__instance.m_plugWasFlipped || (int)((LG_ZoneExpander)__instance.m_gate).ExpanderRotation == 3)
						{
							__instance.m_gate.m_hasBeenFlipped = true;
						}
						else
						{
							__instance.m_gate.m_hasBeenFlipped = false;
						}
						LG_Factory.InjectJob((LG_FactoryJob)new LG_LinkAIGateJob(__instance.m_gate), (BatchName)29);
						break;
					}
					}
				}
				__result = true;
				return false;
			}
			catch (Exception value)
			{
				EOSLogger.Error($"Exception occurred when building Gate: {value}");
				EOSLogger.Error("Falling back to vanilla");
				((LG_ZoneExpander)__instance.m_gate).m_wasProcessed = false;
				return true;
			}
		}

		private static iLG_Door_Core SetupDoor(LG_BuildGateJob __instance, GameObject doorGO, ForceConnect fc)
		{
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Expected O, but got Unknown
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Expected O, but got Unknown
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Expected O, but got Unknown
			iLG_Door_Core val = __instance.SetupDoor(doorGO);
			if (__instance.m_gate.ForceSecurityGate || __instance.m_gate.ForceApexGate || ((LG_ZoneExpander)__instance.m_gate).m_isZoneSource)
			{
				LG_SecurityDoor val2 = ((Il2CppObjectBase)val).Cast<LG_SecurityDoor>();
				if (((LG_ZoneExpander)__instance.m_gate).m_linksTo.m_zone.m_settings.m_zoneData.ChainedPuzzleToEnter == 0)
				{
					uint chainedPuzzleToEnter = fc.Cfg.Setting.ChainedPuzzleToEnter;
					if (chainedPuzzleToEnter != 0)
					{
						LG_Factory.InjectJob((LG_FactoryJob)new LG_BuildChainedPuzzleDoorLockJob(val2, chainedPuzzleToEnter), (BatchName)43);
					}
					else
					{
						LG_Factory.InjectJob((LG_FactoryJob)new LG_SimpleDoorLockJob(val2), (BatchName)43);
					}
				}
				if (fc.Cfg.Setting.IsCheckpointDoor)
				{
					LG_Factory.InjectJob((LG_FactoryJob)new LG_CheckpointScannerJob(val2), (BatchName)43);
				}
				if (fc.Cfg.Setting.ActiveEnemyWave.HasActiveEnemyWave)
				{
					val2.SetupActiveEnemyWaveData(fc.Cfg.Setting.ActiveEnemyWave);
				}
			}
			return val;
		}
	}
}
namespace EOSExt.ExtraDoor.Patches.SetupDoor
{
	[HarmonyPatch]
	internal static class ChainedPuzzles
	{
		[HarmonyPrefix]
		[HarmonyWrapSafe]
		[HarmonyPatch(typeof(LG_BuildChainedPuzzleDoorLockJob), "Build")]
		private static bool Pre_(LG_BuildChainedPuzzleDoorLockJob __instance, ref bool __result)
		{
			try
			{
				LG_SecurityDoor door = ((LG_BuildSecurityDoorLockJob)__instance).m_door;
				ForceConnect fC = ((LG_BuildSecurityDoorLockJob)__instance).m_door.GetFC();
				if ((Object)(object)fC == (Object)null)
				{
					return true;
				}
				((LG_BuildSecurityDoorLockJob)__instance).CheckFlip();
				((Object)door).name = ((Object)door).name + "_ChainedPuzzleLock";
				uint chainedPuzzleToEnter = fC.Cfg.Setting.ChainedPuzzleToEnter;
				if (chainedPuzzleToEnter != 0)
				{
					door.SetupChainedPuzzleLock(chainedPuzzleToEnter);
				}
				__result = true;
				return false;
			}
			catch (Exception value)
			{
				EOSLogger.Error($"Exception occurred when building ChainedPuzzleDoorLock: {value}");
				EOSLogger.Error("Falling back to vanilla");
				return true;
			}
		}

		[HarmonyPrefix]
		[HarmonyWrapSafe]
		[HarmonyPatch(typeof(LG_SecurityDoor), "SetupChainedPuzzleLock")]
		private static bool Pre_SetupCPLock(LG_SecurityDoor __instance, uint puzzleDataId)
		{
			//IL_004b: 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_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: 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_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			ForceConnect fC = __instance.GetFC();
			if ((Object)(object)fC == (Object)null)
			{
				return true;
			}
			ChainedPuzzleDataBlock block = GameDataBlockBase<ChainedPuzzleDataBlock>.GetBlock(puzzleDataId);
			Vector3 val = default(Vector3);
			if (__instance.GetChainedPuzzleStartPosition(ref val))
			{
				ChainedPuzzleInstance val2 = ChainedPuzzleManager.CreatePuzzleInstance(block, ((LG_ZoneExpander)__instance.Gate).m_linksFrom, ((LG_ZoneExpander)__instance.Gate).m_linksTo, val, ((Component)__instance).transform, false);
				eDoorStatus status = __instance.m_locks.SetupForChainedPuzzle(val2);
				__instance.m_sync.SetStateUnsynced(new pDoorState
				{
					status = status,
					damageTaken = 0f
				});
				if (block.ChainedPuzzle.Count == 0)
				{
					__instance.SetupInstantOpeningDoor();
				}
				if (block.TriggerAlarmOnActivate)
				{
					__instance.m_graphics.OnDoorState(new pDoorState
					{
						status = (eDoorStatus)4
					}, false);
					__instance.m_mapLookatRevealer.SetLocalGUIObjStatus((eCM_GuiObjectStatus)9);
					return false;
				}
				__instance.m_graphics.OnDoorState(new pDoorState
				{
					status = (eDoorStatus)5
				}, false);
			}
			return false;
		}
	}
}
namespace EOSExt.ExtraDoor.Patches.DisableAlarmShutdownOnTerminal
{
	[HarmonyPatch]
	internal static class BuildJob_AlarmShutdownOnTerminalJob
	{
		[HarmonyPrefix]
		[HarmonyPatch(typeof(LG_AlarmShutdownOnTerminalJob), "Build")]
		private static bool Pre_(LG_AlarmShutdownOnTerminalJob __instance)
		{
			return (Object)(object)__instance.m_securityDoor.GetFC() == (Object)null;
		}
	}
	[HarmonyPatch]
	internal static class DoorLock_OnDoorState
	{
		[HarmonyPrefix]
		[HarmonyWrapSafe]
		[HarmonyPatch(typeof(LG_SecurityDoor_Locks), "OnDoorState")]
		private static bool Pre_(LG_SecurityDoor_Locks __instance, pDoorState state)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Invalid comparison between Unknown and I4
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)__instance.m_door == (Object)null || (int)state.status != 4)
			{
				return true;
			}
			ForceConnect fC = __instance.m_door.GetFC();
			if ((Object)(object)fC == (Object)null)
			{
				return true;
			}
			((Interact_Base)__instance.m_intUseKeyItem).SetActive(false);
			((Interact_Base)__instance.m_intHack).SetActive(false);
			((Interact_Base)__instance.m_intOpenDoor).SetActive(true);
			__instance.m_intOpenDoor.InteractionMessage = Text.Format(840u, (Object[])(object)new Object[1] { Object.op_Implicit(__instance.ChainedPuzzleToSolve.Data.PublicAlarmName) });
			((Interact_Base)__instance.m_intCustomMessage).SetActive(false);
			__instance.m_lastStatus = state.status;
			return false;
		}
	}
}
namespace EOSExt.ExtraDoor.Config
{
	public class Door
	{
		public LG_LayerType Layer { get; set; }

		public eLocalZoneIndex LocalIndex { get; set; }

		public int AreaIndex { get; set; } = 0;

	}
	public class DoorSetting
	{
		public GateType SecurityGateToEnter { get; set; }

		public List<LevelEventData> EventsOnEnter { get; set; } = new List<LevelEventData>();


		public List<WardenObjectiveEventData> EventsOnApproachDoor { get; set; } = new List<WardenObjectiveEventData>();


		public List<WardenObjectiveEventData> EventsOnUnlockDoor { get; set; } = new List<WardenObjectiveEventData>();


		public List<WardenObjectiveEventData> EventsOnOpenDoor { get; set; } = new List<WardenObjectiveEventData>();


		public List<WardenObjectiveEventData> EventsOnDoorScanStart { get; set; } = new List<WardenObjectiveEventData>();


		public List<WardenObjectiveEventData> EventsOnDoorScanDone { get; set; } = new List<WardenObjectiveEventData>();


		public FCProgressionPuzzleToEnter ProgressionPuzzleToEnter { get; set; } = new FCProgressionPuzzleToEnter();


		public uint ChainedPuzzleToEnter { get; set; }

		public bool IsCheckpointDoor { get; set; } = false;


		public bool PlayScannerVoiceAudio { get; set; } = true;


		public ActiveEnemyWaveData ActiveEnemyWave { get; set; } = new ActiveEnemyWaveData();

	}
	public class FCZonePlacementData : GlobalZoneIndex
	{
		public ZonePlacementWeights Weights { get; set; } = new ZonePlacementWeights();

	}
	public class FCProgressionPuzzleToEnter
	{
		public eProgressionPuzzleType PuzzleType { get; set; }

		public LocalizedText CustomText { get; set; } = null;


		public int PlacementCount { get; set; } = 1;


		public List<FCZonePlacementData> ZonePlacementData { get; set; } = new List<FCZonePlacementData>
		{
			new FCZonePlacementData()
		};

	}
	public enum GateType
	{
		Security,
		Apex,
		Bulkhead,
		Bulkhead_Main
	}
	public class ForceConnectCfg
	{
		public string WorldEventObjectFilter { get; set; } = string.Empty;


		public eDimensionIndex DimensionIndex { get; set; }

		public Door From { get; set; } = new Door();


		public int FromDoorIndex { get; set; } = 0;


		public Door To { get; set; } = new Door();


		public DoorSetting Setting { get; set; } = new DoorSetting();

	}
}