Decompiled source of ImmersiveEntrance v1.0.0

BepInEx/plugins/com.github.zehsteam.ImmersiveEntrance.dll

Decompiled 19 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
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 System.Text;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using DunGen.Graph;
using GameNetcodeStuff;
using HarmonyLib;
using LethalConfig;
using LethalConfig.ConfigItems;
using LethalConfig.ConfigItems.Options;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using com.github.zehsteam.ImmersiveEntrance.Dependencies.LethalConfigMod;
using com.github.zehsteam.ImmersiveEntrance.Extensions;
using com.github.zehsteam.ImmersiveEntrance.Helpers;
using com.github.zehsteam.ImmersiveEntrance.Managers;
using com.github.zehsteam.ImmersiveEntrance.MonoBehaviours;
using com.github.zehsteam.ImmersiveEntrance.Objects;
using com.github.zehsteam.ImmersiveEntrance.Objects.PortalSettingTypes;
using com.github.zehsteam.ImmersiveEntrance.Patches;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Zehs")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyCopyright("Copyright © 2026 Zehs")]
[assembly: AssemblyDescription("See the other side through the main entrance doors.")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+911fd64ffdf339a94c25a9e8d80bcfae667b8156")]
[assembly: AssemblyProduct("ImmersiveEntrance")]
[assembly: AssemblyTitle("com.github.zehsteam.ImmersiveEntrance")]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace com.github.zehsteam.ImmersiveEntrance
{
	internal static class Assets
	{
		public static readonly string AssetBundleFileName = "immersiveentrance_assets";

		public static AssetBundle AssetBundle { get; private set; }

		public static bool IsLoaded { get; private set; }

		public static GameObject DoorPortalPrefab { get; private set; }

		public static EntranceDoorReplacement MansionEntranceDoorReplacement { get; private set; }

		public static void Load()
		{
			string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
			string text = Path.Combine(directoryName, AssetBundleFileName);
			if (!File.Exists(text))
			{
				Logger.LogFatal("Failed to load assets. AssetBundle file could not be found at path \"" + text + "\". Make sure the \"" + AssetBundleFileName + "\" file is in the same folder as the mod's DLL file.");
			}
			else
			{
				AssetBundle = AssetBundle.LoadFromFile(text);
				if ((Object)(object)AssetBundle == (Object)null)
				{
					Logger.LogFatal("Failed to load assets. AssetBundle is null.");
					return;
				}
				OnAssetBundleLoaded(AssetBundle);
				IsLoaded = true;
			}
		}

		private static void OnAssetBundleLoaded(AssetBundle assetBundle)
		{
			DoorPortalPrefab = LoadAsset<GameObject>("DoorPortal", assetBundle);
			MansionEntranceDoorReplacement = LoadAsset<EntranceDoorReplacement>("MansionEntranceDoorReplacement", assetBundle);
		}

		private static T LoadAsset<T>(string name, AssetBundle assetBundle) where T : Object
		{
			if (string.IsNullOrWhiteSpace(name))
			{
				Logger.LogError("Failed to load asset of type \"" + typeof(T).Name + "\" from AssetBundle. Name is null or whitespace.");
				return default(T);
			}
			if ((Object)(object)assetBundle == (Object)null)
			{
				Logger.LogError("Failed to load asset of type \"" + typeof(T).Name + "\" with name \"" + name + "\" from AssetBundle. AssetBundle is null.");
				return default(T);
			}
			T val = assetBundle.LoadAsset<T>(name);
			if ((Object)(object)val == (Object)null)
			{
				Logger.LogError("Failed to load asset of type \"" + typeof(T).Name + "\" with name \"" + name + "\" from AssetBundle. No asset found with that type and name.");
				return default(T);
			}
			return val;
		}

		private static bool TryLoadAsset<T>(string name, AssetBundle assetBundle, out T asset) where T : Object
		{
			asset = LoadAsset<T>(name, assetBundle);
			return (Object)(object)asset != (Object)null;
		}
	}
	internal static class Logger
	{
		public static ManualLogSource ManualLogSource { get; private set; }

		public static bool IsExtendedLoggingEnabled => ConfigManager.Misc_ExtendedLogging?.Value ?? false;

		public static void Initialize(ManualLogSource manualLogSource)
		{
			ManualLogSource = manualLogSource;
		}

		public static void LogDebug(object data)
		{
			Log((LogLevel)32, data);
		}

		public static void LogInfo(object data, bool extended = false)
		{
			Log((LogLevel)16, data, extended);
		}

		public static void LogMessage(object data, bool extended = false)
		{
			Log((LogLevel)8, data, extended);
		}

		public static void LogWarning(object data, bool extended = false)
		{
			Log((LogLevel)4, data, extended);
		}

		public static void LogError(object data, bool extended = false)
		{
			Log((LogLevel)2, data, extended);
		}

		public static void LogFatal(object data, bool extended = false)
		{
			Log((LogLevel)1, data, extended);
		}

		public static void Log(LogLevel logLevel, object data, bool extended = false)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			if (!extended || IsExtendedLoggingEnabled)
			{
				ManualLogSource manualLogSource = ManualLogSource;
				if (manualLogSource != null)
				{
					manualLogSource.Log(logLevel, data);
				}
			}
		}
	}
	[BepInPlugin("com.github.zehsteam.ImmersiveEntrance", "ImmersiveEntrance", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	internal class Plugin : BaseUnityPlugin
	{
		private readonly Harmony _harmony = new Harmony("com.github.zehsteam.ImmersiveEntrance");

		internal static Plugin Instance { get; private set; }

		private void Awake()
		{
			Instance = this;
			Logger.Initialize(Logger.CreateLogSource("com.github.zehsteam.ImmersiveEntrance"));
			Logger.LogInfo("ImmersiveEntrance has awoken!");
			_harmony.PatchAll(typeof(StartOfRound_Patches));
			_harmony.PatchAll(typeof(RoundManager_Patches));
			_harmony.PatchAll(typeof(TimeOfDay_Patches));
			_harmony.PatchAll(typeof(MatchLocalPlayerPosition_Patches));
			_harmony.PatchAll(typeof(EntranceTeleport_Patches));
			Assets.Load();
			ConfigManager.Initialize(((BaseUnityPlugin)this).Config);
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "com.github.zehsteam.ImmersiveEntrance";

		public const string PLUGIN_NAME = "ImmersiveEntrance";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace com.github.zehsteam.ImmersiveEntrance.Patches
{
	[HarmonyPatch(typeof(EntranceTeleport))]
	internal static class EntranceTeleport_Patches
	{
		[HarmonyPatch("Awake")]
		[HarmonyPostfix]
		private static void Awake_Patch(EntranceTeleport __instance)
		{
			EntranceDoorReplacementManager.ReplaceDoor(__instance);
			EntranceManager.SpawnDoorPortal(__instance);
		}
	}
	[HarmonyPatch(typeof(MatchLocalPlayerPosition))]
	internal static class MatchLocalPlayerPosition_Patches
	{
		[HarmonyPatch("LateUpdate")]
		[HarmonyPrefix]
		private static bool LateUpdate_Patch(MatchLocalPlayerPosition __instance)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			if (!PlayerUtils.IsLocalPlayerCameraInsideInterior())
			{
				return true;
			}
			if (DoorPortal.TryGetRenderingInstance(out var doorPortal))
			{
				((Component)__instance).transform.position = ((Component)doorPortal.PortalCamera).transform.position;
				return false;
			}
			return false;
		}
	}
	[HarmonyPatch(typeof(RoundManager))]
	internal static class RoundManager_Patches
	{
		[HarmonyPatch("FinishGeneratingNewLevelClientRpc")]
		[HarmonyPostfix]
		private static void FinishGeneratingNewLevelClientRpc_Patch(RoundManager __instance)
		{
			if (NetworkUtils.IsExecutingRPCMethod((NetworkBehaviour)(object)__instance))
			{
				EntranceManager.LinkMainEntrancePortals();
			}
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	internal static class StartOfRound_Patches
	{
		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		[HarmonyPriority(0)]
		private static void Start_Patch()
		{
			PortalSettingsManager.Initialize();
		}

		[HarmonyPatch("EndOfGame")]
		[HarmonyPostfix]
		private static void EndOfGame_Patch()
		{
			EntranceManager.Reset();
		}

		[HarmonyPatch("OnLocalDisconnect")]
		[HarmonyPostfix]
		private static void OnLocalDisconnect_Patch()
		{
			EntranceManager.Reset();
		}
	}
	[HarmonyPatch(typeof(TimeOfDay))]
	internal static class TimeOfDay_Patches
	{
		[HarmonyPatch("SetInsideLightingDimness")]
		[HarmonyPostfix]
		private static void SetInsideLightingDimness_Patch(TimeOfDay __instance)
		{
			float lightDimmer = (PlayerUtils.IsLocalPlayerCameraInsideInterior() ? 0f : 1f);
			__instance.indirectLightData.lightDimmer = lightDimmer;
		}
	}
}
namespace com.github.zehsteam.ImmersiveEntrance.Objects
{
	[CreateAssetMenu(menuName = "ImmersiveEntrance/EntranceDoorReplacement", order = 0, fileName = "EntranceDoorReplacement")]
	public class EntranceDoorReplacement : ScriptableObject
	{
		[field: SerializeField]
		public GameObject DoorLeft { get; private set; }

		[field: SerializeField]
		public GameObject DoorRight { get; private set; }
	}
	internal enum InteriorType
	{
		Facility = 0,
		Mansion = 1,
		Mineshaft = 2,
		Unknown = 999
	}
	public class MainEntranceData
	{
		public EntranceTeleport EntranceTeleport { get; set; }

		public DoorPortal DoorPortal { get; set; }

		public GameObject DoorViewBlocker { get; set; }

		public List<GameObject> DoorObjects { get; set; } = new List<GameObject>();


		public bool IsOutside => EntranceTeleport.IsOutside();

		public bool HasEntranceTeleport => (Object)(object)EntranceTeleport != (Object)null;

		public bool HasDoorPortal => (Object)(object)DoorPortal != (Object)null;

		public bool HasDoorViewBlocker => (Object)(object)DoorViewBlocker != (Object)null;

		public bool HasDoorObjects
		{
			get
			{
				if (DoorObjects != null)
				{
					return DoorObjects.Count > 0;
				}
				return false;
			}
		}

		public void Reset()
		{
			EntranceTeleport = null;
			DoorViewBlocker = null;
			DoorObjects.Clear();
			if ((Object)(object)DoorPortal != (Object)null)
			{
				Object.Destroy((Object)(object)DoorPortal);
			}
		}

		public void SetDoorObjectsEnabled(bool value)
		{
			if (DoorObjects == null || DoorObjects.Count == 0)
			{
				return;
			}
			foreach (GameObject doorObject in DoorObjects)
			{
				if (!((Object)(object)doorObject == (Object)null))
				{
					doorObject.SetActive(value);
				}
			}
		}
	}
	internal struct Padding
	{
		public float Left { get; set; }

		public float Right { get; set; }

		public float Top { get; set; }

		public float Bottom { get; set; }

		public Padding(float left, float right, float top, float bottom)
		{
			Left = left;
			Right = right;
			Top = top;
			Bottom = bottom;
		}
	}
	internal enum PixelResolutionType
	{
		PlayerCamera,
		Default,
		Performance,
		UltraPerformance,
		Retro
	}
}
namespace com.github.zehsteam.ImmersiveEntrance.Objects.PortalSettingTypes
{
	internal class InteriorPortalSettings : PortalSettings
	{
		public struct InteriorDefaultValues
		{
			public Func<EntranceDoorReplacement> GetDoorReplacement { get; set; }

			public InteriorDefaultValues()
			{
				GetDoorReplacement = null;
			}

			public InteriorDefaultValues(Func<EntranceDoorReplacement> getDoorReplacement = null)
			{
				GetDoorReplacement = getDoorReplacement;
			}
		}

		private InteriorDefaultValues _interiorDefaultValues;

		public InteriorType InteriorType { get; private set; } = InteriorType.Unknown;


		public string DungeonFlowName { get; private set; }

		public bool HasDoorReplacement => GetDoorReplacement != null;

		public Func<EntranceDoorReplacement> GetDoorReplacement => _interiorDefaultValues.GetDoorReplacement;

		public ConfigEntry<bool> ReplaceDoor { get; private set; }

		public override string ConfigSection => "Interior: " + GetInteriorName();

		public InteriorPortalSettings(InteriorType interiorType, InteriorDefaultValues interiorDefaultValues, DefaultValues defaultValues)
			: base(defaultValues)
		{
			InteriorType = interiorType;
			_interiorDefaultValues = interiorDefaultValues;
		}

		public InteriorPortalSettings(string dungeonFlowName, InteriorDefaultValues interiorDefaultValues, DefaultValues defaultValues)
			: base(defaultValues)
		{
			InteriorType = InteriorType.Unknown;
			DungeonFlowName = dungeonFlowName;
			_interiorDefaultValues = interiorDefaultValues;
		}

		public override void BindConfigs()
		{
			base.BindConfigs();
			if (HasDoorReplacement)
			{
				ReplaceDoor = ConfigHelper.Bind(ConfigSection, "ReplaceDoor", defaultValue: true, "If enabled, will replace the door model.");
			}
		}

		public bool Matches(DungeonFlow dungeonFlow)
		{
			InteriorType interiorType = InteriorHelper.GetInteriorType(dungeonFlow);
			if (interiorType == InteriorType.Unknown)
			{
				return ((Object)dungeonFlow).name.Equals(DungeonFlowName, StringComparison.OrdinalIgnoreCase);
			}
			return interiorType == InteriorType;
		}

		public string GetInteriorName()
		{
			if (InteriorType != InteriorType.Unknown)
			{
				return InteriorType.ToString();
			}
			return DungeonFlowName;
		}
	}
	internal class MoonPortalSettings : PortalSettings
	{
		public string PlanetName { get; private set; }

		public override string ConfigSection => "Moon: " + PlanetName;

		public MoonPortalSettings(string planetName, DefaultValues defaultValues)
			: base(defaultValues)
		{
			PlanetName = planetName;
		}

		public bool Matches(SelectableLevel level)
		{
			return PlanetName.Equals(level.PlanetName, StringComparison.OrdinalIgnoreCase);
		}

		public string GetStrippedPlanetName()
		{
			if (!PlanetName.Contains(" "))
			{
				return PlanetName;
			}
			return PlanetName.Substring(PlanetName.IndexOf(" "));
		}
	}
	internal abstract class PortalSettings
	{
		public struct DefaultValues
		{
			public bool Enabled { get; set; }

			public bool UseDynamicPivot { get; set; }

			public Vector3 PivotPositionOffset { get; set; }

			public Padding ScreenCrop { get; set; }

			public bool UseViewDistance { get; set; }

			public float ViewDistance { get; set; }

			public DefaultValues()
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				PivotPositionOffset = default(Vector3);
				ScreenCrop = default(Padding);
				UseViewDistance = false;
				Enabled = true;
				UseDynamicPivot = true;
				ViewDistance = 50f;
			}

			public DefaultValues(bool enabled = true, bool useDynamicPivot = true, Vector3? pivotPositionOffset = null, Padding? screenCrop = null, float? viewDistance = null)
			{
				//IL_0023: Unknown result type (might be due to invalid IL or missing references)
				//IL_001a: Unknown result type (might be due to invalid IL or missing references)
				Enabled = enabled;
				UseDynamicPivot = useDynamicPivot;
				PivotPositionOffset = (Vector3)(((??)pivotPositionOffset) ?? Vector3.zero);
				ScreenCrop = screenCrop.GetValueOrDefault();
				UseViewDistance = viewDistance.HasValue;
				ViewDistance = viewDistance.GetValueOrDefault(50f);
			}
		}

		private DefaultValues _defaultValues;

		public ConfigEntry<bool> Enabled { get; private set; }

		public bool UseDynamicPivot => _defaultValues.UseDynamicPivot;

		public Vector3 PivotPositionOffset => _defaultValues.PivotPositionOffset;

		public Padding ScreenCrop => _defaultValues.ScreenCrop;

		public ConfigEntry<bool> UseViewDistance { get; private set; }

		public ConfigEntry<float> ViewDistance { get; private set; }

		public abstract string ConfigSection { get; }

		public PortalSettings(DefaultValues defaultValues)
		{
			_defaultValues = defaultValues;
		}

		public virtual void BindConfigs()
		{
			Enabled = ConfigHelper.Bind(ConfigSection, "Enabled", _defaultValues.Enabled, "Enable this portal. If disabled, will also disable the other portal.");
			UseViewDistance = ConfigHelper.Bind(ConfigSection, "UseViewDistance", _defaultValues.UseViewDistance, "If enabled, this portal will use the view distance in this config instead of the global view distance config.");
			ViewDistance = ConfigHelper.Bind(ConfigSection, "ViewDistance", _defaultValues.ViewDistance, "The distance you can see through this portal. Requires UseViewDistance to be enabled.", requiresRestart: false, (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.06f, 250f));
			UseViewDistance.SettingChanged += delegate
			{
				DoorPortal.OnConfigSettingsChanged();
			};
			ViewDistance.SettingChanged += delegate
			{
				DoorPortal.OnConfigSettingsChanged();
			};
		}
	}
}
namespace com.github.zehsteam.ImmersiveEntrance.MonoBehaviours
{
	internal class CoroutineRunner : MonoBehaviour
	{
		public static CoroutineRunner Instance { get; private set; }

		public static CoroutineRunner Spawn()
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			if ((Object)(object)Instance != (Object)null)
			{
				return Instance;
			}
			GameObject val = new GameObject("ImmersiveEntrance CoroutineRunner", new Type[1] { typeof(CoroutineRunner) })
			{
				hideFlags = (HideFlags)61
			};
			Object.DontDestroyOnLoad((Object)(object)val);
			return val.GetComponent<CoroutineRunner>();
		}

		private void Awake()
		{
			if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
			{
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
			else
			{
				Instance = this;
			}
		}

		public static Coroutine Start(IEnumerator routine)
		{
			if ((Object)(object)Instance == (Object)null)
			{
				CoroutineRunner coroutineRunner = Spawn();
				return ((coroutineRunner != null) ? ((MonoBehaviour)coroutineRunner).StartCoroutine(routine) : null) ?? null;
			}
			CoroutineRunner instance = Instance;
			return ((instance != null) ? ((MonoBehaviour)instance).StartCoroutine(routine) : null) ?? null;
		}

		public static void Stop(IEnumerator routine)
		{
			CoroutineRunner instance = Instance;
			if (instance != null)
			{
				((MonoBehaviour)instance).StopCoroutine(routine);
			}
		}

		public static void Stop(Coroutine routine)
		{
			CoroutineRunner instance = Instance;
			if (instance != null)
			{
				((MonoBehaviour)instance).StopCoroutine(routine);
			}
		}
	}
	public class DoorPortal : MonoBehaviour
	{
		private static readonly List<DoorPortal> _instances = new List<DoorPortal>();

		[SerializeField]
		private Transform _pivot;

		[SerializeField]
		private MeshRenderer _screen;

		[SerializeField]
		private MeshRenderer _screenOccluder;

		[SerializeField]
		private GameObject _renderingContainer;

		[SerializeField]
		private Camera _portalCamera;

		[SerializeField]
		private Light _nightVision;

		[SerializeField]
		private Transform _volumeContainer;

		private MainEntranceData _mainEntrance;

		private PortalSettings _portalSettings;

		private DoorPortal _linkedPortal;

		private RenderTexture _viewTexture;

		private bool _isDrawing;

		private bool _isInRange;

		private LayerMask _pivotRaycastMask;

		public Camera PortalCamera => _portalCamera;

		private void Awake()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			_pivotRaycastMask = LayerMask.op_Implicit(LayerMask.GetMask(new string[1] { "Room" }));
			((Behaviour)_portalCamera).enabled = false;
			SetDrawing(value: false);
			SetRendering(value: false);
		}

		private void OnEnable()
		{
			if (!_instances.Contains(this))
			{
				_instances.Add(this);
			}
		}

		private void OnDisable()
		{
			_instances.Remove(this);
		}

		private void Start()
		{
			InitializeVolumes();
			InitializePivot();
		}

		private void Update()
		{
			if (!((Object)(object)_linkedPortal == (Object)null))
			{
				UpdateScreenVisibility();
			}
		}

		private void LateUpdate()
		{
			if (!((Object)(object)_linkedPortal == (Object)null))
			{
				UpdatePortalCamera();
			}
		}

		public void SetMainEntranceData(MainEntranceData mainEntrance)
		{
			_mainEntrance = mainEntrance;
			if (mainEntrance.IsOutside)
			{
				_portalSettings = PortalSettingsManager.GetCurrentMoonSettings();
			}
			else
			{
				_portalSettings = PortalSettingsManager.GetCurrentInteriorSettings();
			}
			InitializeScreen();
			InitializeCamera();
		}

		public void LinkPortal(DoorPortal other)
		{
			_linkedPortal = other;
			SetScreenRenderTexture(other._viewTexture);
			Logger.LogInfo("[DoorPortal] Linked portal " + _mainEntrance.EntranceTeleport.GetLogInfo() + " -> " + other._mainEntrance.EntranceTeleport.GetLogInfo());
		}

		public bool IsEnabled()
		{
			if (!ConfigManager.Portal_Enabled.Value)
			{
				return false;
			}
			if (_portalSettings == null || (Object)(object)_linkedPortal == (Object)null)
			{
				return false;
			}
			if (!_portalSettings.Enabled.Value)
			{
				return false;
			}
			if (!_linkedPortal._portalSettings.Enabled.Value)
			{
				return false;
			}
			return true;
		}

		private void UpdateScreenVisibility()
		{
			if (!IsEnabled())
			{
				_isInRange = false;
				OnLocalPlayerExitRange();
				return;
			}
			bool flag = IsLocalPlayerCameraInRange();
			bool flag2 = CameraHelper.IsVisibleFromCamera((Renderer)(object)_screen, PlayerUtils.GetLocalPlayerCamera());
			if (flag && flag2)
			{
				if (!_isInRange)
				{
					_isInRange = true;
					OnLocalPlayerEnterRange();
				}
			}
			else if (_isInRange)
			{
				_isInRange = false;
				OnLocalPlayerExitRange();
			}
		}

		private bool IsLocalPlayerCameraInRange()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			if (!PlayerUtils.TryGetLocalPlayerCamera(out var camera))
			{
				return false;
			}
			float value = ConfigManager.Portal_ActivationRange.Value;
			Vector3 position = ((Component)camera).transform.position;
			float num = Vector3.Distance(position, ((Component)this).transform.position);
			return num <= value;
		}

		private void OnLocalPlayerEnterRange()
		{
			SetDrawing(value: true);
			_linkedPortal.SetRendering(value: true);
			if (_mainEntrance.IsOutside)
			{
				InteriorHelper.RenderInterior();
			}
		}

		private void OnLocalPlayerExitRange()
		{
			SetDrawing(value: false);
			_linkedPortal.SetRendering(value: false);
			_ = _mainEntrance.IsOutside;
		}

		private void InitializeVolumes()
		{
			CreateVolumesFromScene();
		}

		private void CreateVolumesFromScene()
		{
			//IL_007e: 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_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: 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_00df: Unknown result type (might be due to invalid IL or missing references)
			foreach (Transform child in _volumeContainer.GetChildren())
			{
				Object.Destroy((Object)(object)((Component)child).gameObject);
			}
			Volume[] array = (from x in Object.FindObjectsByType<Volume>((FindObjectsSortMode)0)
				where x.isGlobal && ((Component)x).gameObject.layer == 0
				select x).ToArray();
			if (array.Length != 0)
			{
				LayerMask val = LayerMask.op_Implicit(LayerMask.NameToLayer("NavigationSurface"));
				Volume[] array2 = array;
				foreach (Volume val2 in array2)
				{
					GameObject val3 = Object.Instantiate<GameObject>(((Component)val2).gameObject, _volumeContainer);
					val3.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity);
					val3.layer = LayerMask.op_Implicit(val);
					BoxCollider val4 = val3.AddComponent<BoxCollider>();
					val4.size = Vector3.one * 0.1f;
					Volume component = val3.GetComponent<Volume>();
					component.isGlobal = false;
				}
			}
		}

		private void InitializePivot()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			if (_portalSettings.UseDynamicPivot)
			{
				SetDynamicPivot();
			}
			Transform pivot = _pivot;
			pivot.localPosition += _portalSettings.PivotPositionOffset;
		}

		private void SetDynamicPivot()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			if (TryGetDynamicPivotPosition(out var position))
			{
				_pivot.position = position;
			}
			if (TryGetDynamicPivotRotation(out var rotation))
			{
				_pivot.rotation = rotation;
			}
		}

		private bool TryGetDynamicPivotPosition(out Vector3 position)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: 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_0061: 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_006c: 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_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: 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_00b1: Unknown result type (might be due to invalid IL or missing references)
			position = Vector3.zero;
			Vector3 origin = _pivot.position + _pivot.forward * -0.25f;
			if (!TryRaycastForPivot(origin, _pivot.forward, out var hit))
			{
				return false;
			}
			float num = -0.001f;
			Vector3 val = ((RaycastHit)(ref hit)).point + _pivot.forward * num;
			if (TryRaycastForPivot(origin, -_pivot.up, out var hit2, 5f))
			{
				float num2 = ((Component)_screen).transform.lossyScale.y / 2f;
				float y = ((RaycastHit)(ref hit2)).point.y + num2;
				val.y = y;
			}
			position = val;
			return true;
		}

		private bool TryGetDynamicPivotRotation(out Quaternion rotation)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_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)
			//IL_00a5: 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_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: 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_00bf: 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_00ca: 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)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: 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_00ec: 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_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: 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)
			rotation = Quaternion.identity;
			Vector3 val = _pivot.position + _pivot.forward * -0.25f;
			Vector3 forward = _pivot.forward;
			Vector3 origin = val + _pivot.right * -0.25f;
			if (!TryRaycastForPivot(origin, forward, out var hit))
			{
				return false;
			}
			Vector3 origin2 = val + _pivot.right * 0.25f;
			if (!TryRaycastForPivot(origin2, forward, out var hit2))
			{
				return false;
			}
			Vector3 val2 = ((RaycastHit)(ref hit)).normal + ((RaycastHit)(ref hit2)).normal;
			Vector3 normalized = ((Vector3)(ref val2)).normalized;
			val2 = ((RaycastHit)(ref hit2)).point - ((RaycastHit)(ref hit)).point;
			Vector3 normalized2 = ((Vector3)(ref val2)).normalized;
			Vector3 val3 = -normalized;
			val2 = Vector3.Cross(val3, normalized2);
			Vector3 normalized3 = ((Vector3)(ref val2)).normalized;
			rotation = Quaternion.LookRotation(val3, normalized3);
			return true;
		}

		private bool TryRaycastForPivot(Vector3 origin, Vector3 direction, out RaycastHit hit, float maxDistance = 1f)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return Physics.Raycast(origin, direction, ref hit, maxDistance, LayerMask.op_Implicit(_pivotRaycastMask), (QueryTriggerInteraction)1);
		}

		private void InitializeScreen()
		{
			ApplyScreenCrop();
		}

		private void ApplyScreenCrop()
		{
			SetScreenCrop(_portalSettings.ScreenCrop);
		}

		private void SetScreenCrop(Padding padding)
		{
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: 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_010a: Unknown result type (might be due to invalid IL or missing references)
			((Renderer)_screen).material.SetFloat("_CropLeft", padding.Left);
			((Renderer)_screen).material.SetFloat("_CropRight", padding.Right);
			((Renderer)_screen).material.SetFloat("_CropTop", padding.Top);
			((Renderer)_screen).material.SetFloat("_CropBottom", padding.Bottom);
			float num = 1f - padding.Left - padding.Right;
			float num2 = 1f - padding.Top - padding.Bottom;
			((Component)_screenOccluder).transform.localScale = new Vector3(num, num2, 1f);
			float num3 = (padding.Left - padding.Right) * 0.5f;
			float num4 = (padding.Bottom - padding.Top) * 0.5f;
			Vector3 localPosition = ((Component)_screenOccluder).transform.localPosition;
			((Component)_screenOccluder).transform.localPosition = new Vector3(num3, num4, localPosition.z);
		}

		private void SetScreenRenderTexture(RenderTexture renderTexture)
		{
			((Renderer)_screen).material.SetTexture("_MainTex", (Texture)(object)renderTexture);
		}

		private void SetDrawing(bool value)
		{
			_isDrawing = value;
			((Component)_screen).gameObject.SetActive(value);
			UpdateDoor();
		}

		private void InitializeCamera()
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			if (_mainEntrance != null)
			{
				HDAdditionalCameraData component = ((Component)_portalCamera).GetComponent<HDAdditionalCameraData>();
				if (_mainEntrance.IsOutside)
				{
					component.clearColorMode = (ClearColorMode)0;
				}
				else
				{
					component.clearColorMode = (ClearColorMode)1;
				}
				CreateViewTexture();
			}
		}

		private void ApplyCameraViewDistance()
		{
			if (_mainEntrance != null)
			{
				float farClipPlane = (_portalSettings.UseViewDistance.Value ? _portalSettings.ViewDistance.Value : ((!_mainEntrance.IsOutside) ? ConfigManager.Portal_InsideViewDistance.Value : ConfigManager.Portal_OutsideViewDistance.Value));
				_portalCamera.farClipPlane = farClipPlane;
			}
		}

		private Size GetTargetScreenSize()
		{
			return ConfigManager.Portal_PixelResolution.Value switch
			{
				PixelResolutionType.PlayerCamera => CameraHelper.GetCameraScreenSize(), 
				PixelResolutionType.Default => new Size(860, 520), 
				PixelResolutionType.Performance => new Size(620, 364), 
				PixelResolutionType.UltraPerformance => new Size(400, 260), 
				PixelResolutionType.Retro => new Size(186, 104), 
				_ => CameraHelper.GetCameraScreenSize(), 
			};
		}

		private void CreateViewTexture()
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Expected O, but got Unknown
			Size targetScreenSize = GetTargetScreenSize();
			if (CanCreate())
			{
				RenderTexture viewTexture = _viewTexture;
				if (viewTexture != null)
				{
					viewTexture.Release();
				}
				_viewTexture = new RenderTexture(targetScreenSize.Width, targetScreenSize.Height, 24, (RenderTextureFormat)9);
				Logger.LogInfo(string.Format("[{0}] {1}() width: {2}, height: {3}", "DoorPortal", "CreateViewTexture", targetScreenSize.Width, targetScreenSize.Height), extended: true);
				_portalCamera.targetTexture = _viewTexture;
				_linkedPortal?.SetScreenRenderTexture(_viewTexture);
			}
			bool CanCreate()
			{
				if ((Object)(object)_viewTexture == (Object)null)
				{
					return true;
				}
				if (((Texture)_viewTexture).width != targetScreenSize.Width)
				{
					return true;
				}
				if (((Texture)_viewTexture).height != targetScreenSize.Height)
				{
					return true;
				}
				return false;
			}
		}

		private bool IsRendering()
		{
			return _renderingContainer.activeSelf;
		}

		private void SetRendering(bool value)
		{
			_renderingContainer.SetActive(value);
			if (_mainEntrance != null)
			{
				if (value)
				{
					ApplyCameraViewDistance();
				}
				UpdateNightVision();
				UpdateDoor();
			}
		}

		private void UpdateNightVision()
		{
			if (_mainEntrance != null && !_mainEntrance.IsOutside)
			{
				((Behaviour)_nightVision).enabled = IsRendering();
			}
		}

		private void UpdatePortalCamera()
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: 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_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: 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)
			if (IsRendering() && PlayerUtils.TryGetLocalPlayerCamera(out var camera))
			{
				CreateViewTexture();
				Transform transform = ((Component)_linkedPortal._screen).transform;
				Transform transform2 = ((Component)_screen).transform;
				Matrix4x4 val = transform.localToWorldMatrix * Matrix4x4.Rotate(Quaternion.Euler(0f, 180f, 0f));
				Matrix4x4 val2 = transform2.localToWorldMatrix * Matrix4x4.Inverse(val);
				((Component)_portalCamera).transform.SetPositionAndRotation(((Matrix4x4)(ref val2)).MultiplyPoint(((Component)camera).transform.position), ((Matrix4x4)(ref val2)).rotation * ((Component)camera).transform.rotation);
				SetObliqueNearClipPlane(camera);
				OutsideHelper.SetSunEnabled(_mainEntrance.IsOutside);
				_portalCamera.Render();
				OutsideHelper.SetSunEnabled(!_mainEntrance.IsOutside);
			}
		}

		private void SetObliqueNearClipPlane(Camera playerCamera)
		{
			//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_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: 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_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: 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_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_007a: Unknown result type (might be due to invalid IL or missing references)
			Transform transform = ((Component)_screen).transform;
			Plane val = default(Plane);
			((Plane)(ref val))..ctor(-transform.forward, transform.position);
			Vector4 val2 = default(Vector4);
			((Vector4)(ref val2))..ctor(((Plane)(ref val)).normal.x, ((Plane)(ref val)).normal.y, ((Plane)(ref val)).normal.z, ((Plane)(ref val)).distance);
			Vector4 val3 = Matrix4x4.Transpose(Matrix4x4.Inverse(_portalCamera.worldToCameraMatrix)) * val2;
			_portalCamera.projectionMatrix = playerCamera.CalculateObliqueMatrix(val3);
		}

		public static bool TryGetRenderingInstance(out DoorPortal doorPortal)
		{
			doorPortal = _instances.FirstOrDefault((DoorPortal x) => x.IsRendering());
			return (Object)(object)doorPortal != (Object)null;
		}

		private void UpdateDoor()
		{
			if (_mainEntrance == null)
			{
				return;
			}
			if (_mainEntrance.HasDoorViewBlocker)
			{
				if (IsRendering())
				{
					_mainEntrance.DoorViewBlocker.SetActive(false);
				}
				else
				{
					_mainEntrance.DoorViewBlocker.SetActive(!_isDrawing);
				}
			}
			if (ConfigManager.Debug_HideDoorObjects.Value)
			{
				_mainEntrance.SetDoorObjectsEnabled(value: false);
			}
			else
			{
				_mainEntrance.SetDoorObjectsEnabled(!IsRendering());
			}
		}

		private void ApplyConfigSettings()
		{
			ApplyCameraViewDistance();
		}

		public static void OnConfigSettingsChanged()
		{
			foreach (DoorPortal instance in _instances)
			{
				instance.ApplyConfigSettings();
			}
		}
	}
}
namespace com.github.zehsteam.ImmersiveEntrance.Managers
{
	internal static class ConfigManager
	{
		public static ConfigFile ConfigFile { get; private set; }

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

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

		public static ConfigEntry<PixelResolutionType> Portal_PixelResolution { get; private set; }

		public static ConfigEntry<float> Portal_ActivationRange { get; private set; }

		public static ConfigEntry<float> Portal_OutsideViewDistance { get; private set; }

		public static ConfigEntry<float> Portal_InsideViewDistance { get; private set; }

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

		public static void Initialize(ConfigFile configFile)
		{
			ConfigFile = configFile;
			BindConfigs();
		}

		private static void BindConfigs()
		{
			ConfigHelper.SkipAutoGen();
			Misc_ExtendedLogging = ConfigHelper.Bind("Misc", "ExtendedLogging", defaultValue: false, "Enable extended logging.");
			Portal_Enabled = ConfigHelper.Bind("Portal", "Enabled", defaultValue: true, "Enable portals!");
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.AppendLine("The rendering pixel resolution of portals.");
			stringBuilder.AppendLine("PlayerCamera = Automatically adjusts to the player camera's rendering resolution.");
			stringBuilder.AppendLine("Default = 860x520.");
			stringBuilder.AppendLine("Performance = 620x364.");
			stringBuilder.AppendLine("UltraPerformance = 400x260.");
			stringBuilder.AppendLine("Retro = 186x104.");
			Portal_PixelResolution = ConfigHelper.Bind("Portal", "PixelResolution", PixelResolutionType.PlayerCamera, stringBuilder.ToString());
			Portal_ActivationRange = ConfigHelper.Bind("Portal", "ActivationRange", 10f, "The distance in meters the player needs to be within a portal for it to render.", requiresRestart: false, (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 50f));
			Portal_OutsideViewDistance = ConfigHelper.Bind("Portal", "OutsideViewDistance", 250f, "The distance you can see through an outside portal.", requiresRestart: false, (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.06f, 250f));
			Portal_InsideViewDistance = ConfigHelper.Bind("Portal", "InsideViewDistance", 50f, "The distance you can see through an inside portal.", requiresRestart: false, (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.06f, 100f));
			Portal_OutsideViewDistance.SettingChanged += delegate
			{
				DoorPortal.OnConfigSettingsChanged();
			};
			Portal_InsideViewDistance.SettingChanged += delegate
			{
				DoorPortal.OnConfigSettingsChanged();
			};
			Debug_HideDoorObjects = ConfigHelper.Bind("Debug", "HideDoorObjects", defaultValue: false, "If enabled, will hide all of the door meshes and only show the portal screen.");
		}
	}
	internal static class EntranceDoorReplacementManager
	{
		[CompilerGenerated]
		private sealed class <>c__DisplayClass3_0
		{
			public float delay;

			public GameObject gameObject;
		}

		public static void ReplaceDoor(EntranceTeleport entranceTeleport)
		{
			if (!((Object)(object)entranceTeleport == (Object)null) && entranceTeleport.IsMainEntrance() && !entranceTeleport.IsOutside())
			{
				InteriorPortalSettings currentInteriorSettings = PortalSettingsManager.GetCurrentInteriorSettings();
				if (currentInteriorSettings.HasDoorReplacement && currentInteriorSettings.ReplaceDoor.Value)
				{
					ReplaceDoor(entranceTeleport, currentInteriorSettings.GetDoorReplacement());
				}
			}
		}

		private static void ReplaceDoor(EntranceTeleport entranceTeleport, EntranceDoorReplacement replacement)
		{
			if ((Object)(object)entranceTeleport == (Object)null || (Object)(object)replacement == (Object)null)
			{
				return;
			}
			if (!InteriorHelper.TryGetVisualDoorsContainer(entranceTeleport, out var transform))
			{
				Logger.LogError("[EntranceDoorReplacementManager] Failed to replace main entrance door " + entranceTeleport.GetLogInfo() + " with " + ((Object)replacement).name + ". Could not find visual doors container.");
				return;
			}
			Transform val = transform.Find("DoorMesh (1)");
			Transform val2 = transform.Find("DoorMesh");
			if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
			{
				Logger.LogError("[EntranceDoorReplacementManager] Failed to replace main entrance door " + entranceTeleport.GetLogInfo() + " with " + ((Object)replacement).name + ". Could not find all of the original door objects.");
			}
			else
			{
				SpawnReplacementDoor(val, replacement.DoorLeft);
				SpawnReplacementDoor(val2, replacement.DoorRight);
				Logger.LogInfo("[EntranceDoorReplacementManager] Replaced main entrance door " + entranceTeleport.GetLogInfo() + " with " + ((Object)replacement).name, extended: true);
			}
		}

		private static void SpawnReplacementDoor(Transform parent, GameObject prefab)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = Object.Instantiate<GameObject>(prefab, parent);
			val.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity);
			HideAfterDelay(((Component)parent).gameObject);
		}

		private static void HideAfterDelay(GameObject gameObject, float delay = 0.1f)
		{
			<>c__DisplayClass3_0 CS$<>8__locals0 = new <>c__DisplayClass3_0();
			CS$<>8__locals0.delay = delay;
			CS$<>8__locals0.gameObject = gameObject;
			CoroutineRunner.Start(Coroutine());
			[IteratorStateMachine(typeof(<>c__DisplayClass3_0.<<HideAfterDelay>g__Coroutine|0>d))]
			IEnumerator Coroutine()
			{
				//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
				return new <>c__DisplayClass3_0.<<HideAfterDelay>g__Coroutine|0>d(0)
				{
					<>4__this = CS$<>8__locals0
				};
			}
		}
	}
	internal static class EntranceManager
	{
		private static readonly Dictionary<EntranceTeleport, DoorPortal> _entranceToPortals = new Dictionary<EntranceTeleport, DoorPortal>();

		private static bool _linkedMainEntrancePortals;

		public static IReadOnlyDictionary<EntranceTeleport, DoorPortal> EntranceToPortals => _entranceToPortals;

		public static MainEntranceData OutsideMainEntrance { get; private set; }

		public static MainEntranceData InsideMainEntrance { get; private set; }

		public static void Reset()
		{
			OutsideMainEntrance.Reset();
			InsideMainEntrance.Reset();
			_linkedMainEntrancePortals = false;
			foreach (KeyValuePair<EntranceTeleport, DoorPortal> entranceToPortal in _entranceToPortals)
			{
				DoorPortal value = entranceToPortal.Value;
				if (!((Object)(object)value == (Object)null))
				{
					Object.Destroy((Object)(object)((Component)value).gameObject);
					Logger.LogInfo("[EntranceManager] Reset() Destroyed DoorPortal " + entranceToPortal.Key?.GetLogInfo(), extended: true);
				}
			}
			_entranceToPortals.Clear();
		}

		public static void SpawnDoorPortal(EntranceTeleport entranceTeleport)
		{
			//IL_0159: 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_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: 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)
			if ((Object)(object)entranceTeleport == (Object)null || !entranceTeleport.IsMainEntrance())
			{
				return;
			}
			Logger.LogInfo("[EntranceManager] Attempting to spawn main entrance door portal! " + entranceTeleport.GetLogInfo());
			if (_entranceToPortals.ContainsKey(entranceTeleport))
			{
				Logger.LogWarning("[EntranceManager] Failed to spawn main entrance door portal. This EntranceTeleport is already in use!");
				return;
			}
			if (_entranceToPortals.Count >= 2)
			{
				Logger.LogError(string.Format("[{0}] Failed to spawn main entrance door portal. There are already {1} entrance portals.", "EntranceManager", _entranceToPortals.Count));
				return;
			}
			MainEntranceData mainEntranceData;
			if (entranceTeleport.IsOutside())
			{
				if (OutsideMainEntrance == null)
				{
					OutsideMainEntrance = new MainEntranceData();
				}
				OutsideMainEntrance.Reset();
				mainEntranceData = OutsideMainEntrance;
				mainEntranceData.EntranceTeleport = entranceTeleport;
				mainEntranceData.DoorViewBlocker = OutsideHelper.GetDoorViewBlocker(entranceTeleport);
				mainEntranceData.DoorObjects = OutsideHelper.GetDoorObjects(entranceTeleport);
			}
			else
			{
				if (InsideMainEntrance == null)
				{
					InsideMainEntrance = new MainEntranceData();
				}
				InsideMainEntrance.Reset();
				mainEntranceData = InsideMainEntrance;
				mainEntranceData.EntranceTeleport = entranceTeleport;
				mainEntranceData.DoorViewBlocker = InteriorHelper.GetDoorViewBlocker(entranceTeleport);
				mainEntranceData.DoorObjects = InteriorHelper.GetDoorObjects(entranceTeleport);
			}
			if (mainEntranceData.HasDoorViewBlocker)
			{
				Logger.LogInfo("[EntranceManager] Successfully found main entrance door view blocker! " + entranceTeleport.GetLogInfo());
				GameObject val = Object.Instantiate<GameObject>(Assets.DoorPortalPrefab, ((Component)entranceTeleport).transform);
				val.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity);
				Vector3 localScale = Assets.DoorPortalPrefab.transform.localScale;
				val.transform.SetLossyScale(localScale);
				DoorPortal doorPortal = (mainEntranceData.DoorPortal = val.GetComponent<DoorPortal>());
				_entranceToPortals.Add(entranceTeleport, doorPortal);
				doorPortal.SetMainEntranceData(mainEntranceData);
				Logger.LogInfo("[EntranceManager] Successfully spawned main entrance door portal! " + entranceTeleport.GetLogInfo());
			}
			else
			{
				Logger.LogWarning("[EntranceManager] Failed to spawn main entrance door portal. Could not find main entrance door view blocker. " + entranceTeleport.GetLogInfo());
				mainEntranceData?.Reset();
			}
		}

		public static void LinkMainEntrancePortals()
		{
			if (_linkedMainEntrancePortals)
			{
				return;
			}
			_linkedMainEntrancePortals = true;
			Logger.LogInfo("[EntranceManager] Attempting to link main entrance portals.");
			Logger.LogInfo(string.Format("[{0}] There are {1} entrance portals.", "EntranceManager", _entranceToPortals.Count), extended: true);
			bool flag = true;
			if (!OutsideMainEntrance.HasDoorPortal)
			{
				Logger.LogError("[EntranceManager] Failed to link main entrance portal. Outside door portal was not spawned.");
				flag = false;
			}
			if (!InsideMainEntrance.HasDoorPortal)
			{
				Logger.LogError("[EntranceManager] Failed to link main entrance portal. Inside door portal was not spawned.");
				flag = false;
			}
			if (!flag)
			{
				Logger.LogError("[EntranceManager] Failed to link main entrance portals.");
				if (OutsideMainEntrance.HasDoorPortal)
				{
					Object.Destroy((Object)(object)((Component)OutsideMainEntrance.DoorPortal).gameObject);
					Logger.LogInfo("[EntranceManager] Despawned outside door portal.");
				}
				if (InsideMainEntrance.HasDoorPortal)
				{
					Object.Destroy((Object)(object)((Component)InsideMainEntrance.DoorPortal).gameObject);
					Logger.LogInfo("[EntranceManager] Despawned inside door portal.");
				}
			}
			else
			{
				OutsideMainEntrance.DoorPortal.LinkPortal(InsideMainEntrance.DoorPortal);
				InsideMainEntrance.DoorPortal.LinkPortal(OutsideMainEntrance.DoorPortal);
			}
		}
	}
	internal static class PortalSettingsManager
	{
		private static readonly List<MoonPortalSettings> _moonEntries;

		private static readonly List<MoonPortalSettings> _predefinedMoonEntries;

		private static readonly List<InteriorPortalSettings> _interiorEntries;

		private static readonly List<InteriorPortalSettings> _predefinedInteriorEntries;

		private static bool _initialized;

		public static IReadOnlyList<MoonPortalSettings> MoonEntries => _moonEntries;

		public static IReadOnlyList<InteriorPortalSettings> InteriorEntries => _interiorEntries;

		static PortalSettingsManager()
		{
			//IL_007e: 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_0131: Unknown result type (might be due to invalid IL or missing references)
			_moonEntries = new List<MoonPortalSettings>();
			_predefinedMoonEntries = new List<MoonPortalSettings>();
			_interiorEntries = new List<InteriorPortalSettings>();
			_predefinedInteriorEntries = new List<InteriorPortalSettings>();
			List<MoonPortalSettings> predefinedMoonEntries = _predefinedMoonEntries;
			float? viewDistance = 75f;
			predefinedMoonEntries.Add(new MoonPortalSettings("85 Rend", new PortalSettings.DefaultValues(enabled: true, useDynamicPivot: true, null, null, viewDistance)));
			_predefinedInteriorEntries.Add(new InteriorPortalSettings(InteriorType.Facility, new InteriorPortalSettings.InteriorDefaultValues(), new PortalSettings.DefaultValues(enabled: true, useDynamicPivot: false, (Vector3?)new Vector3(0f, 0f, -0.133f), (Padding?)null, (float?)null)));
			_predefinedInteriorEntries.Add(new InteriorPortalSettings(InteriorType.Mansion, new InteriorPortalSettings.InteriorDefaultValues(() => Assets.MansionEntranceDoorReplacement), new PortalSettings.DefaultValues(enabled: true, useDynamicPivot: true, (Vector3?)new Vector3(-0.038f, 0f, 0f), (Padding?)new Padding(0.05f, 0.05f, 0.025f, 0f), (float?)null)));
			List<InteriorPortalSettings> predefinedInteriorEntries = _predefinedInteriorEntries;
			InteriorPortalSettings.InteriorDefaultValues interiorDefaultValues = new InteriorPortalSettings.InteriorDefaultValues();
			Vector3? pivotPositionOffset = new Vector3(-0.105f, 0f, 0f);
			viewDistance = 30f;
			predefinedInteriorEntries.Add(new InteriorPortalSettings(InteriorType.Mineshaft, interiorDefaultValues, new PortalSettings.DefaultValues(enabled: true, useDynamicPivot: true, pivotPositionOffset, null, viewDistance)));
		}

		public static void Initialize()
		{
			if (!_initialized)
			{
				_initialized = true;
				PopulateEntries();
				BindConfigs();
			}
		}

		private static void PopulateEntries()
		{
			PopulateMoonEntries();
			PopulateInteriorEntries();
		}

		private static void PopulateMoonEntries()
		{
			if ((Object)(object)StartOfRound.Instance == (Object)null)
			{
				Logger.LogError("[PortalSettingsManager] Failed to populate moon entries. StartOfRound instance is null.");
				return;
			}
			SelectableLevel[] levels = StartOfRound.Instance.levels;
			foreach (SelectableLevel level in levels)
			{
				AddMoonEntry(level);
			}
		}

		private static void PopulateInteriorEntries()
		{
			if ((Object)(object)RoundManager.Instance == (Object)null)
			{
				Logger.LogError("[PortalSettingsManager] Failed to populate interior entries. RoundManager instance is null.");
				return;
			}
			IndoorMapType[] dungeonFlowTypes = RoundManager.Instance.dungeonFlowTypes;
			foreach (IndoorMapType val in dungeonFlowTypes)
			{
				AddInteriorEntry(val.dungeonFlow);
			}
		}

		private static void AddMoonEntry(SelectableLevel level)
		{
			if (level.planetHasTime && !_moonEntries.Any((MoonPortalSettings x) => x.Matches(level)))
			{
				MoonPortalSettings moonPortalSettings = _predefinedMoonEntries.FirstOrDefault((MoonPortalSettings x) => x.Matches(level));
				if (moonPortalSettings != null)
				{
					_moonEntries.Add(moonPortalSettings);
				}
				else
				{
					_moonEntries.Add(new MoonPortalSettings(level.PlanetName, new PortalSettings.DefaultValues()));
				}
			}
		}

		private static void AddInteriorEntry(DungeonFlow dungeonFlow)
		{
			if (_interiorEntries.Any((InteriorPortalSettings x) => x.Matches(dungeonFlow)))
			{
				return;
			}
			InteriorPortalSettings interiorPortalSettings = _predefinedInteriorEntries.FirstOrDefault((InteriorPortalSettings x) => x.Matches(dungeonFlow));
			if (interiorPortalSettings != null)
			{
				_interiorEntries.Add(interiorPortalSettings);
				return;
			}
			InteriorPortalSettings.InteriorDefaultValues interiorDefaultValues = new InteriorPortalSettings.InteriorDefaultValues();
			PortalSettings.DefaultValues defaultValues = new PortalSettings.DefaultValues();
			InteriorType interiorType = InteriorHelper.GetInteriorType(dungeonFlow);
			if (interiorType == InteriorType.Unknown)
			{
				_interiorEntries.Add(new InteriorPortalSettings(((Object)dungeonFlow).name, interiorDefaultValues, defaultValues));
			}
			else
			{
				_interiorEntries.Add(new InteriorPortalSettings(interiorType, interiorDefaultValues, defaultValues));
			}
		}

		private static void BindConfigs()
		{
			BindInteriorConfigs();
			BindMoonConfigs();
		}

		private static void BindMoonConfigs()
		{
			List<MoonPortalSettings> list = _moonEntries.OrderBy((MoonPortalSettings x) => x.GetStrippedPlanetName()).ToList();
			foreach (MoonPortalSettings item in list)
			{
				item.BindConfigs();
			}
		}

		private static void BindInteriorConfigs()
		{
			List<InteriorPortalSettings> list = _interiorEntries.OrderBy((InteriorPortalSettings x) => x.GetInteriorName()).ToList();
			foreach (InteriorPortalSettings item in list)
			{
				item.BindConfigs();
			}
		}

		public static MoonPortalSettings GetCurrentMoonSettings()
		{
			return GetMoonSettings(StartOfRound.Instance?.currentLevel);
		}

		public static InteriorPortalSettings GetCurrentInteriorSettings()
		{
			return GetInteriorSettings(InteriorHelper.GetCurrentDungeonFlow());
		}

		public static MoonPortalSettings GetMoonSettings(SelectableLevel level)
		{
			return _moonEntries.FirstOrDefault((MoonPortalSettings x) => x.Matches(level));
		}

		public static InteriorPortalSettings GetInteriorSettings(DungeonFlow dungeonFlow)
		{
			return _interiorEntries.FirstOrDefault((InteriorPortalSettings x) => x.Matches(dungeonFlow));
		}
	}
}
namespace com.github.zehsteam.ImmersiveEntrance.Helpers
{
	internal static class CameraHelper
	{
		public static bool IsVisibleFromCamera(Renderer renderer, Camera camera)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)renderer == (Object)null || (Object)(object)camera == (Object)null)
			{
				return false;
			}
			Plane[] array = GeometryUtility.CalculateFrustumPlanes(camera);
			return GeometryUtility.TestPlanesAABB(array, renderer.bounds);
		}

		public static Size GetCameraScreenSize()
		{
			IngamePlayerSettings instance = IngamePlayerSettings.Instance;
			if ((Object)(object)instance != (Object)null && (Object)(object)instance.playerGameplayScreenTex != (Object)null)
			{
				return new Size(((Texture)instance.playerGameplayScreenTex).width, ((Texture)instance.playerGameplayScreenTex).height);
			}
			return new Size(860, 520);
		}
	}
	internal static class ConfigHelper
	{
		public static void SkipAutoGen()
		{
			if (LethalConfigProxy.IsInstalled)
			{
				LethalConfigProxy.SkipAutoGen();
			}
		}

		public static void AddButton(string section, string name, string buttonText, string description, Action callback)
		{
			if (LethalConfigProxy.IsInstalled)
			{
				LethalConfigProxy.AddButton(section, name, buttonText, description, callback);
			}
		}

		public static ConfigEntry<T> Bind<T>(string section, string key, T defaultValue, string description, bool requiresRestart = false, AcceptableValueBase acceptableValues = null, Action<T> settingChanged = null, ConfigFile configFile = null)
		{
			if (configFile == null)
			{
				configFile = ConfigManager.ConfigFile;
			}
			ConfigEntry<T> configEntry = configFile.Bind(section, key, defaultValue, description, acceptableValues);
			if (settingChanged != null)
			{
				configEntry.SettingChanged += delegate
				{
					settingChanged?.Invoke(configEntry.Value);
				};
			}
			if (LethalConfigProxy.IsInstalled)
			{
				LethalConfigProxy.AddConfig<T>(configEntry, requiresRestart);
			}
			return configEntry;
		}
	}
	internal static class GameObjectHelper
	{
		public static bool TryFind(string name, out GameObject gameObject)
		{
			gameObject = GameObject.Find(name);
			return (Object)(object)gameObject != (Object)null;
		}
	}
	internal static class InteriorHelper
	{
		public static void RenderInterior()
		{
			if (!((Object)(object)StartOfRound.Instance == (Object)null))
			{
				AdjacentRoomCullingModified occlusionCuller = StartOfRound.Instance.occlusionCuller;
				if (!((Object)(object)occlusionCuller == (Object)null) && ((Behaviour)occlusionCuller).enabled)
				{
					occlusionCuller.SetToStartTile();
				}
			}
		}

		public static GameObject GetDoorViewBlocker(EntranceTeleport entranceTeleport)
		{
			if ((Object)(object)entranceTeleport == (Object)null)
			{
				return null;
			}
			if (!TryGetVisualDoorsContainer(entranceTeleport, out var transform))
			{
				return null;
			}
			if (transform.TryFind("LightBehindDoor", out var result))
			{
				return ((Component)result).gameObject;
			}
			return null;
		}

		public static List<GameObject> GetDoorObjects(EntranceTeleport entranceTeleport)
		{
			if ((Object)(object)entranceTeleport == (Object)null)
			{
				return new List<GameObject>();
			}
			if (!TryGetVisualDoorsContainer(entranceTeleport, out var transform))
			{
				return new List<GameObject>();
			}
			string[] source = new string[6] { "SteelDoorFake", "SteelDoorFake (1)", "DoorFrame", "DoorMesh", "DoorMesh (1)", "WideDoorFrame (1)" };
			List<GameObject> list = new List<GameObject>();
			foreach (Transform child in transform.GetChildren())
			{
				if (source.Contains<string>(((Object)child).name, StringComparer.OrdinalIgnoreCase))
				{
					list.Add(((Component)child).gameObject);
				}
			}
			return list;
		}

		public static Transform GetVisualDoorsContainer(EntranceTeleport entranceTeleport)
		{
			if ((Object)(object)entranceTeleport.thisEntranceAnimator != (Object)null)
			{
				return ((Component)entranceTeleport.thisEntranceAnimator).transform;
			}
			GameObject obj = GameObject.FindGameObjectWithTag("InsideEntranceDoor");
			return ((obj != null) ? obj.transform : null) ?? null;
		}

		public static bool TryGetVisualDoorsContainer(EntranceTeleport entranceTeleport, out Transform transform)
		{
			transform = GetVisualDoorsContainer(entranceTeleport);
			return (Object)(object)transform != (Object)null;
		}

		public static InteriorType GetCurrentInteriorType()
		{
			return GetInteriorType(GetCurrentDungeonFlow());
		}

		public static InteriorType GetInteriorType(DungeonFlow dungeonFlow)
		{
			string name = ((Object)dungeonFlow).name;
			if (name.StartsWith("Level1Flow", StringComparison.OrdinalIgnoreCase))
			{
				return InteriorType.Facility;
			}
			if (name.StartsWith("Level2Flow", StringComparison.OrdinalIgnoreCase))
			{
				return InteriorType.Mansion;
			}
			if (name.StartsWith("Level3Flow", StringComparison.OrdinalIgnoreCase))
			{
				return InteriorType.Mineshaft;
			}
			return InteriorType.Unknown;
		}

		public static DungeonFlow GetCurrentDungeonFlow()
		{
			return RoundManager.Instance.dungeonFlowTypes[RoundManager.Instance.currentDungeonType].dungeonFlow;
		}
	}
	internal static class NetworkUtils
	{
		private static readonly FieldInfo _rpcExecStageField = AccessTools.Field(typeof(NetworkBehaviour), "__rpc_exec_stage");

		public static bool IsConnected
		{
			get
			{
				NetworkManager singleton = NetworkManager.Singleton;
				if (singleton == null)
				{
					return false;
				}
				return singleton.IsConnectedClient;
			}
		}

		public static bool IsServer
		{
			get
			{
				NetworkManager singleton = NetworkManager.Singleton;
				if (singleton == null)
				{
					return false;
				}
				return singleton.IsServer;
			}
		}

		public static ulong LocalClientId
		{
			get
			{
				NetworkManager singleton = NetworkManager.Singleton;
				if (singleton == null)
				{
					return 0uL;
				}
				return singleton.LocalClientId;
			}
		}

		public static int ConnectedPlayerCount => GameNetworkManager.Instance?.connectedPlayers ?? 0;

		public static bool IsLocalClientId(ulong clientId)
		{
			return clientId == LocalClientId;
		}

		public static bool HasClient(ulong clientId)
		{
			if ((Object)(object)NetworkManager.Singleton == (Object)null)
			{
				return false;
			}
			return NetworkManager.Singleton.ConnectedClients.ContainsKey(clientId);
		}

		public static bool IsNetworkPrefab(GameObject prefab)
		{
			if ((Object)(object)prefab == (Object)null)
			{
				return false;
			}
			if ((Object)(object)NetworkManager.Singleton == (Object)null)
			{
				return false;
			}
			IReadOnlyList<NetworkPrefab> prefabs = NetworkManager.Singleton.NetworkConfig.Prefabs.Prefabs;
			return prefabs.Any((NetworkPrefab x) => (Object)(object)x.Prefab == (Object)(object)prefab);
		}

		public static void NetcodePatcherAwake()
		{
			try
			{
				Assembly executingAssembly = Assembly.GetExecutingAssembly();
				IEnumerable<Type> loadableTypes = executingAssembly.GetLoadableTypes();
				foreach (Type item in loadableTypes)
				{
					MethodInfo[] methods = item.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
					MethodInfo[] array = methods;
					foreach (MethodInfo methodInfo in array)
					{
						try
						{
							object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
							if (customAttributes.Length != 0)
							{
								try
								{
									methodInfo.Invoke(null, null);
								}
								catch (TargetInvocationException ex)
								{
									Logger.LogWarning("[NetworkUtils] Failed to invoke method " + methodInfo.Name + ": " + ex.Message);
								}
							}
						}
						catch (Exception ex2)
						{
							Logger.LogWarning("[NetworkUtils] Error processing method " + methodInfo.Name + " in type " + item.Name + ": " + ex2.Message);
						}
					}
				}
			}
			catch (Exception ex3)
			{
				Logger.LogError("[NetworkUtils] Failed to run NetcodePatcherAwake: " + ex3.Message);
			}
		}

		public static bool IsExecutingRPCMethod(NetworkBehaviour networkBehaviour)
		{
			if ((Object)(object)networkBehaviour == (Object)null)
			{
				return false;
			}
			NetworkManager networkManager = networkBehaviour.NetworkManager;
			if ((Object)(object)networkManager == (Object)null || !networkManager.IsListening)
			{
				return false;
			}
			if (_rpcExecStageField == null)
			{
				Logger.LogError("[NetworkUtils] IsExecutingRPCMethod: Failed to find \"__rpc_exec_stage\" field.");
				return false;
			}
			object value = _rpcExecStageField.GetValue(networkBehaviour);
			int num = (int)value;
			if (num != 0)
			{
				return num == 1;
			}
			return true;
		}
	}
	internal static class OutsideHelper
	{
		public static void SetSunEnabled(bool value)
		{
			TimeOfDay instance = TimeOfDay.Instance;
			if (!((Object)(object)instance == (Object)null))
			{
				Light sunDirect = instance.sunDirect;
				if (sunDirect != null)
				{
					((Behaviour)sunDirect).enabled = value;
				}
				Light sunIndirect = instance.sunIndirect;
				if (sunIndirect != null)
				{
					((Behaviour)sunIndirect).enabled = value;
				}
				HDAdditionalLightData indirectLightData = instance.indirectLightData;
				if (indirectLightData != null)
				{
					indirectLightData.lightDimmer = (value ? 1f : 0f);
				}
			}
		}

		public static GameObject GetDoorViewBlocker(EntranceTeleport entranceTeleport)
		{
			if ((Object)(object)entranceTeleport == (Object)null)
			{
				return null;
			}
			if (TryGetVisualDoorsContainer(entranceTeleport, out var transform) && transform.TryFind("Plane", out var result))
			{
				return ((Component)result).gameObject;
			}
			if (GameObjectHelper.TryFind("Environment/Plane", out var gameObject))
			{
				return gameObject;
			}
			if (GameObjectHelper.TryFind("Environment/MainFactory/Plane", out gameObject))
			{
				return gameObject;
			}
			return null;
		}

		public static List<GameObject> GetDoorObjects(EntranceTeleport entranceTeleport)
		{
			if ((Object)(object)entranceTeleport == (Object)null)
			{
				return new List<GameObject>();
			}
			if (!TryGetVisualDoorsContainer(entranceTeleport, out var transform))
			{
				return new List<GameObject>();
			}
			string[] source = new string[3] { "SteelDoorFake", "SteelDoorFake (1)", "DoorFrame" };
			List<GameObject> list = new List<GameObject>();
			foreach (Transform child in transform.GetChildren())
			{
				if (source.Contains<string>(((Object)child).name, StringComparer.OrdinalIgnoreCase))
				{
					list.Add(((Component)child).gameObject);
				}
			}
			if (GameObjectHelper.TryFind("Environment/DoorFrame (1)", out var gameObject))
			{
				list.Add(gameObject);
			}
			if (GameObjectHelper.TryFind("Environment/MainFactory/DoorFrame (1)", out gameObject))
			{
				list.Add(gameObject);
			}
			return list;
		}

		private static Transform GetVisualDoorsContainer(EntranceTeleport entranceTeleport)
		{
			if ((Object)(object)entranceTeleport.thisEntranceAnimator != (Object)null)
			{
				return ((Component)entranceTeleport.thisEntranceAnimator).transform;
			}
			try
			{
				return GameObject.Find("Environment/OutsideEntranceVisualDoorsContainer").transform;
			}
			catch
			{
			}
			return null;
		}

		private static bool TryGetVisualDoorsContainer(EntranceTeleport entranceTeleport, out Transform transform)
		{
			transform = GetVisualDoorsContainer(entranceTeleport);
			return (Object)(object)transform != (Object)null;
		}
	}
	internal static class PlayerUtils
	{
		public static PlayerControllerB LocalPlayerScript => GameNetworkManager.Instance?.localPlayerController ?? null;

		public static PlayerControllerB[] AllPlayerScripts => StartOfRound.Instance?.allPlayerScripts ?? Array.Empty<PlayerControllerB>();

		public static PlayerControllerB[] ConnectedPlayerScripts => AllPlayerScripts.Where(IsConnected).ToArray();

		public static PlayerControllerB[] AlivePlayerScripts => ConnectedPlayerScripts.Where((PlayerControllerB x) => !x.isPlayerDead).ToArray();

		public static PlayerControllerB[] DeadPlayerScripts => ConnectedPlayerScripts.Where((PlayerControllerB x) => x.isPlayerDead).ToArray();

		public static bool TryGetLocalPlayerScript(out PlayerControllerB playerScript)
		{
			playerScript = LocalPlayerScript;
			return (Object)(object)playerScript != (Object)null;
		}

		public static bool IsLocalPlayer(PlayerControllerB playerScript)
		{
			if ((Object)(object)playerScript == (Object)null)
			{
				return false;
			}
			return (Object)(object)playerScript == (Object)(object)LocalPlayerScript;
		}

		public static bool IsConnected(PlayerControllerB playerScript)
		{
			if ((Object)(object)playerScript == (Object)null)
			{
				return false;
			}
			if (!playerScript.isPlayerControlled)
			{
				return playerScript.isPlayerDead;
			}
			return true;
		}

		public static PlayerControllerB GetPlayerScriptByClientId(ulong clientId)
		{
			return ((IEnumerable<PlayerControllerB>)ConnectedPlayerScripts).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB playerScript) => playerScript.actualClientId == clientId));
		}

		public static bool TryGetPlayerScriptByClientId(ulong clientId, out PlayerControllerB playerScript)
		{
			playerScript = GetPlayerScriptByClientId(clientId);
			return (Object)(object)playerScript != (Object)null;
		}

		public static PlayerControllerB GetPlayerScriptByPlayerId(int playerId)
		{
			if (playerId < 0 || playerId > ConnectedPlayerScripts.Length - 1)
			{
				return null;
			}
			return ConnectedPlayerScripts[playerId];
		}

		public static bool TryGetPlayerScriptByPlayerId(int playerId, out PlayerControllerB playerScript)
		{
			playerScript = GetPlayerScriptByPlayerId(playerId);
			return (Object)(object)playerScript != (Object)null;
		}

		public static PlayerControllerB GetPlayerScriptByUsername(string username)
		{
			PlayerControllerB[] source = ConnectedPlayerScripts.OrderBy((PlayerControllerB x) => x.playerUsername.Length).ToArray();
			PlayerControllerB val = ((IEnumerable<PlayerControllerB>)source).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB x) => x.playerUsername.Equals(username, StringComparison.OrdinalIgnoreCase)));
			if (val == null)
			{
				val = ((IEnumerable<PlayerControllerB>)source).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB x) => x.playerUsername.StartsWith(username, StringComparison.OrdinalIgnoreCase)));
			}
			if (val == null)
			{
				val = ((IEnumerable<PlayerControllerB>)source).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB x) => x.playerUsername.Contains(username, StringComparison.OrdinalIgnoreCase)));
			}
			return val;
		}

		public static bool TryGetPlayerScriptByUsername(string username, out PlayerControllerB playerScript)
		{
			playerScript = GetPlayerScriptByUsername(username);
			return (Object)(object)playerScript != (Object)null;
		}

		public static PlayerControllerB GetRandomPlayerScript(PlayerControllerB[] playerScripts, bool excludeLocal = false)
		{
			if (playerScripts == null || playerScripts.Length == 0)
			{
				return null;
			}
			PlayerControllerB[] array = playerScripts.Where((PlayerControllerB playerScript) => !excludeLocal || !IsLocalPlayer(playerScript)).ToArray();
			if (array.Length == 0)
			{
				return null;
			}
			return array[Random.Range(0, array.Length)];
		}

		public static bool TryGetRandomPlayerScript(PlayerControllerB[] playerScripts, out PlayerControllerB playerScript, bool excludeLocal = false)
		{
			playerScript = GetRandomPlayerScript(playerScripts, excludeLocal);
			return (Object)(object)playerScript != (Object)null;
		}

		public static Camera GetLocalPlayerCamera()
		{
			if ((Object)(object)LocalPlayerScript == (Object)null || LocalPlayerScript.isPlayerDead)
			{
				return StartOfRound.Instance.spectateCamera;
			}
			return LocalPlayerScript.gameplayCamera;
		}

		public static bool TryGetLocalPlayerCamera(out Camera camera)
		{
			camera = GetLocalPlayerCamera();
			return (Object)(object)camera != (Object)null;
		}

		public static bool IsLocalPlayerCameraInsideInterior()
		{
			if (!TryGetLocalPlayerScript(out var playerScript))
			{
				return false;
			}
			if (!playerScript.isPlayerDead)
			{
				return playerScript.isInsideFactory;
			}
			if ((Object)(object)playerScript.spectatedPlayerScript != (Object)null)
			{
				return playerScript.spectatedPlayerScript.isInsideFactory;
			}
			return false;
		}
	}
	internal static class Utils
	{
		public static string GetPluginDirectoryPath()
		{
			return Path.GetDirectoryName(((BaseUnityPlugin)Plugin.Instance).Info.Location);
		}

		public static string GetConfigDirectoryPath()
		{
			return Paths.ConfigPath;
		}

		public static string GetPluginPersistentDataPath()
		{
			return Path.Combine(Application.persistentDataPath, "ImmersiveEntrance");
		}

		public static ConfigFile CreateConfigFile(BaseUnityPlugin plugin, string path, string name = null, bool saveOnInit = false)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected O, but got Unknown
			BepInPlugin metadata = MetadataHelper.GetMetadata((object)plugin);
			if (name == null)
			{
				name = metadata.GUID;
			}
			name += ".cfg";
			return new ConfigFile(Path.Combine(path, name), saveOnInit, metadata);
		}

		public static ConfigFile CreateLocalConfigFile(BaseUnityPlugin plugin, string name = null, bool saveOnInit = false)
		{
			return CreateConfigFile(plugin, GetConfigDirectoryPath(), name, saveOnInit);
		}

		public static ConfigFile CreateGlobalConfigFile(BaseUnityPlugin plugin, string name = null, bool saveOnInit = false)
		{
			string pluginPersistentDataPath = GetPluginPersistentDataPath();
			if (name == null)
			{
				name = "global";
			}
			return CreateConfigFile(plugin, pluginPersistentDataPath, name, saveOnInit);
		}

		public static bool RollPercentChance(float percent)
		{
			if (percent <= 0f)
			{
				return false;
			}
			if (percent >= 100f)
			{
				return true;
			}
			return Random.value * 100f <= percent;
		}
	}
}
namespace com.github.zehsteam.ImmersiveEntrance.Extensions
{
	internal static class AssemblyExtensions
	{
		public static IEnumerable<Type> GetLoadableTypes(this Assembly assembly)
		{
			if (assembly == null)
			{
				return Array.Empty<Type>();
			}
			try
			{
				return assembly.GetTypes();
			}
			catch (ReflectionTypeLoadException ex)
			{
				return ex.Types.Where((Type type) => type != null);
			}
		}
	}
	internal static class ConfigFileExtensions
	{
		public static ConfigEntry<T> Bind<T>(this ConfigFile configFile, string section, string key, T defaultValue, string description, AcceptableValueBase acceptableValues)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			if (acceptableValues == null)
			{
				return configFile.Bind<T>(section, key, defaultValue, description);
			}
			return configFile.Bind<T>(section, key, defaultValue, new ConfigDescription(description, acceptableValues, Array.Empty<object>()));
		}
	}
	internal static class EntranceTeleportExtensions
	{
		public static bool IsMainEntrance(this EntranceTeleport entranceTeleport)
		{
			if ((Object)(object)entranceTeleport == (Object)null)
			{
				return false;
			}
			return entranceTeleport.entranceId == 0;
		}

		public static bool IsOutside(this EntranceTeleport entranceTeleport)
		{
			return entranceTeleport.isEntranceToBuilding;
		}

		public static string GetLogInfo(this EntranceTeleport entranceTeleport)
		{
			if ((Object)(object)entranceTeleport == (Object)null)
			{
				return "(EntranceTeleport is null)";
			}
			return $"(entranceId: {entranceTeleport.entranceId}, isEntranceToBuilding: {entranceTeleport.isEntranceToBuilding})";
		}
	}
	internal static class StringExtensions
	{
		public static bool IsHexColor(this string value)
		{
			return Regex.IsMatch(value, "^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$");
		}
	}
	internal static class TransformExtensions
	{
		public static bool TryFind(this Transform transform, string name, out Transform result)
		{
			if ((Object)(object)transform == (Object)null)
			{
				result = null;
				return false;
			}
			result = transform.Find(name);
			return (Object)(object)result != (Object)null;
		}

		public static List<Transform> GetChildren(this Transform transform)
		{
			List<Transform> list = new List<Transform>();
			for (int i = 0; i < transform.childCount; i++)
			{
				list.Add(transform.GetChild(i));
			}
			return list;
		}

		public static void SetLossyScale(this Transform transform, Vector3 scale)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: 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_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: 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_0086: 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_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)transform == (Object)null))
			{
				if ((Object)(object)transform.parent == (Object)null)
				{
					transform.localScale = scale;
					return;
				}
				Vector3 lossyScale = transform.parent.lossyScale;
				transform.localScale = new Vector3((lossyScale.x != 0f) ? (scale.x / lossyScale.x) : scale.x, (lossyScale.y != 0f) ? (scale.y / lossyScale.y) : scale.y, (lossyScale.z != 0f) ? (scale.z / lossyScale.z) : scale.z);
			}
		}
	}
}
namespace com.github.zehsteam.ImmersiveEntrance.Dependencies.LethalConfigMod
{
	internal static class LethalConfigProxy
	{
		public const string PLUGIN_GUID = "ainavt.lc.lethalconfig";

		public static bool IsInstalled => Chainloader.PluginInfos.ContainsKey("ainavt.lc.lethalconfig");

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		public static void SkipAutoGen()
		{
			LethalConfigManager.SkipAutoGen();
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		public static object AddConfig<T>(ConfigEntry<T> configEntry, bool requiresRestart = false)
		{
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Expected O, but got Unknown
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Expected O, but got Unknown
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Expected O, but got Unknown
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Expected O, but got Unknown
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_012a: Expected O, but got Unknown
			if (typeof(T).IsEnum)
			{
				MethodInfo methodInfo = AccessTools.Method(typeof(LethalConfigProxy), "AddEnumDropdown", (Type[])null, (Type[])null);
				MethodInfo methodInfo2 = methodInfo.MakeGenericMethod(typeof(T));
				object? obj = methodInfo2.Invoke(null, new object[2] { configEntry, requiresRestart });
				return (obj is BaseConfigItem) ? obj : null;
			}
			AcceptableValueBase acceptableValues = ((ConfigEntryBase)configEntry).Description.AcceptableValues;
			if (acceptableValues != null)
			{
				if (acceptableValues is AcceptableValueRange<float> || acceptableValues is AcceptableValueRange<int>)
				{
					return AddConfigSlider<T>(configEntry, requiresRestart);
				}
				if (acceptableValues is AcceptableValueList<string>)
				{
					return AddConfigDropdown<T>(configEntry, requiresRestart);
				}
			}
			if (configEntry is ConfigEntry<string> val && IsConfigEntryForHexColor(val))
			{
				return AddConfigItem((BaseConfigItem)new HexColorInputFieldConfigItem(val, requiresRestart));
			}
			if (!(configEntry is ConfigEntry<int> val2))
			{
				if (!(configEntry is ConfigEntry<float> val3))
				{
					if (!(configEntry is ConfigEntry<bool> val4))
					{
						if (configEntry is ConfigEntry<string> val5)
						{
							return AddConfigItem((BaseConfigItem)new TextInputFieldConfigItem(val5, requiresRestart));
						}
						throw new NotSupportedException($"Unsupported type: {typeof(T)}");
					}
					return AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(val4, requiresRestart));
				}
				return AddConfigItem((BaseConfigItem)new FloatInputFieldConfigItem(val3, requiresRestart));
			}
			return AddConfigItem((BaseConfigItem)new IntInputFieldConfigItem(val2, requiresRestart));
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		public static object AddButton(string section, string name, string buttonText, string description, Action callback)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			BaseConfigItem configItem = (BaseConfigItem)new GenericButtonConfigItem(section, name, description, buttonText, (GenericButtonHandler)delegate
			{
				callback?.Invoke();
			});
			return AddConfigItem(configItem);
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		private static BaseConfigItem AddConfigSlider<T>(ConfigEntry<T> configEntry, bool requiresRestart = false)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			if (!(configEntry is ConfigEntry<float> val))
			{
				if (configEntry is ConfigEntry<int> val2)
				{
					return AddConfigItem((BaseConfigItem)new IntSliderConfigItem(val2, requiresRestart));
				}
				throw new NotSupportedException($"Slider not supported for type: {typeof(T)}");
			}
			return AddConfigItem((BaseConfigItem)new FloatSliderConfigItem(val, requiresRestart));
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		private static BaseConfigItem AddConfigDropdown<T>(ConfigEntry<T> configEntry, bool requiresRestart = false)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			if (configEntry is ConfigEntry<string> val)
			{
				return AddConfigItem((BaseConfigItem)new TextDropDownConfigItem(val, requiresRestart));
			}
			throw new NotSupportedException($"Dropdown not supported for type: {typeof(T)}");
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		private static BaseConfigItem AddEnumDropdown<T>(ConfigEntry<T> configEntry, bool requiresRestart = false) where T : Enum
		{
			return AddConfigItem((BaseConfigItem)(object)new EnumDropDownConfigItem<T>(configEntry, requiresRestart));
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		private static bool IsConfigEntryForHexColor(ConfigEntry<string> configEntry)
		{
			if (!(((ConfigEntryBase)configEntry).DefaultValue is string value))
			{
				return false;
			}
			return value.IsHexColor();
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		private static BaseConfigItem AddConfigItem(BaseConfigItem configItem)
		{
			LethalConfigManager.AddConfigItem(configItem);
			return configItem;
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}