Decompiled source of NotezDevelopmentStartup v1.0.4

NoteBoxz.DevStart.dll

Decompiled 3 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Threading;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using FastStartup;
using FastStartup.TimeSavers;
using HarmonyLib;
using LethalLevelLoader;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("AmazingAssets.TerrainToMesh")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("ClientNetworkTransform")]
[assembly: IgnoresAccessChecksTo("com.olegknyazev.softmask")]
[assembly: IgnoresAccessChecksTo("DissonanceVoip")]
[assembly: IgnoresAccessChecksTo("EasyTextEffects")]
[assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")]
[assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")]
[assembly: IgnoresAccessChecksTo("FastStartup")]
[assembly: IgnoresAccessChecksTo("LethalLevelLoader")]
[assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")]
[assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging")]
[assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging.DocCodeExamples")]
[assembly: IgnoresAccessChecksTo("Unity.Burst")]
[assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")]
[assembly: IgnoresAccessChecksTo("Unity.Collections")]
[assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")]
[assembly: IgnoresAccessChecksTo("Unity.Jobs")]
[assembly: IgnoresAccessChecksTo("Unity.Mathematics")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.Common")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.MetricTypes")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStats")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Component")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Configuration")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Implementation")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsReporting")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkProfiler.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkSolutionInterface")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Components")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.Networking.Transport")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Csg")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.KdTree")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Poly2Tri")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Stl")]
[assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Config.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Authentication")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Analytics")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Configuration")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Device")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments.Internal")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Internal")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Networking")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Registration")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Scheduler")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Telemetry")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Threading")]
[assembly: IgnoresAccessChecksTo("Unity.Services.QoS")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Relay")]
[assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")]
[assembly: IgnoresAccessChecksTo("Unity.Timeline")]
[assembly: IgnoresAccessChecksTo("Unity.VisualEffectGraph.Runtime")]
[assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.UI")]
[assembly: AssemblyCompany("NoteBoxz.DevStart")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.4.0")]
[assembly: AssemblyInformationalVersion("1.0.4+94bb2d7d548f39481b4dc944728ebd3750e6bd34")]
[assembly: AssemblyProduct("NotezDevStart")]
[assembly: AssemblyTitle("NoteBoxz.DevStart")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.4.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace NotezDevStart
{
	[BepInPlugin("NoteBoxz.DevStart", "NotezDevStart", "1.0.4")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class NotezDevStart : BaseUnityPlugin
	{
		public static ConfigEntry<bool> autoJoinLanConfig = null;

		public static ConfigEntry<bool> autoPullLeverConfig = null;

		public static ConfigEntry<bool> tpToEntranceConfig = null;

		public static ConfigEntry<bool> teleportInsideConfig = null;

		public static ConfigEntry<bool> forceLANmodeConfig = null;

		public static ConfigEntry<int> playersRequiredConfig = null;

		public static ConfigEntry<string> moonToRouteConfig = null;

		internal static bool IsHostInstance;

		public static readonly string TempFolderPath = Path.Combine(Path.GetTempPath(), "NotezDevStart");

		public static readonly string HostReadySignalPath = Path.Combine(TempFolderPath, "HostStarted");

		public static NotezDevStart Instance { get; private set; } = null;


		internal static ManualLogSource Logger { get; private set; } = null;


		internal static Harmony? Harmony { get; set; }

		private static Mutex? AppMutex { get; set; }

		public static bool autoJoinLan => autoJoinLanConfig.Value;

		public static bool autoPullLever => autoPullLeverConfig.Value;

		public static bool tpToEntrance => tpToEntranceConfig.Value;

		public static bool teleportInside => teleportInsideConfig.Value;

		public static bool forceLANmode => forceLANmodeConfig.Value;

		public static int playersRequired => playersRequiredConfig.Value;

		public static string moonToRoute => moonToRouteConfig.Value;

		private void Awake()
		{
			Logger = ((BaseUnityPlugin)this).Logger;
			Instance = this;
			Patch();
			ConfigFile();
			IsHostInstance = !autoJoinLan || !CheckMutex();
			if (IsHostInstance)
			{
				SetupTempFolder();
			}
			Logger.LogInfo((object)"NoteBoxz.DevStart v1.0.4 has loaded!");
		}

		private void ConfigFile()
		{
			forceLANmodeConfig = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "ForceLANMode", true, "Force LAN mode on startup. (even if fast startup is installed)");
			autoJoinLanConfig = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "AutoJoinLAN", true, "Automatically join LAN lobbies when game is launched more than once.");
			playersRequiredConfig = ((BaseUnityPlugin)this).Config.Bind<int>("General", "PlayersRequired", 2, "Number of players required to start the game. (including the host)");
			autoPullLeverConfig = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "AutoPullLever", false, "Automatically pull the ship's lever on startup.");
			tpToEntranceConfig = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "TeleportToEntrance", false, "Automatically teleports you to the main entrance on level load (Requires 'AutoPullLever' enabled).");
			teleportInsideConfig = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "TeleportInside", false, "Teleports you inside the facility instead (Requires 'TeleportToEntrance' enabled).");
			moonToRouteConfig = ((BaseUnityPlugin)this).Config.Bind<string>("General", "MoonToRoute", "", "Automatically sets the moon to a specific route on game start. (Example: `Rend`, `Dine`, `March`)");
		}

		private static string CensorPath(string path)
		{
			try
			{
				string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
				if (!string.IsNullOrEmpty(folderPath) && path.StartsWith(folderPath, StringComparison.OrdinalIgnoreCase))
				{
					string text = path.Substring(folderPath.Length);
					string directoryName = Path.GetDirectoryName(folderPath);
					return Path.Combine(directoryName, "(USER)", text.TrimStart(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar));
				}
				return path;
			}
			catch
			{
				return path;
			}
		}

		private void SetupTempFolder()
		{
			try
			{
				if (Directory.Exists(TempFolderPath))
				{
					string[] files = Directory.GetFiles(TempFolderPath);
					foreach (string path in files)
					{
						try
						{
							File.Delete(path);
						}
						catch
						{
						}
					}
				}
				else
				{
					Directory.CreateDirectory(TempFolderPath);
				}
				Logger.LogDebug((object)("Temp folder setup at: " + CensorPath(TempFolderPath)));
			}
			catch (Exception ex)
			{
				Logger.LogError((object)("Failed to setup temp folder: " + ex.Message));
			}
		}

		internal static bool CheckMutex()
		{
			try
			{
				if (AppMutex == null)
				{
					AppMutex = new Mutex(initiallyOwned: true, "LethalCompany-NotezDevStart");
				}
				return AppMutex != null && !AppMutex.WaitOne(TimeSpan.Zero, exitContext: true);
			}
			catch
			{
				return false;
			}
		}

		internal static void Patch()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			if (Harmony == null)
			{
				Harmony = new Harmony("NoteBoxz.DevStart");
			}
			Logger.LogDebug((object)"Patching...");
			Type[] typesWithErrorHandling = GetTypesWithErrorHandling();
			Type[] array = typesWithErrorHandling;
			foreach (Type type in array)
			{
				try
				{
					Harmony.PatchAll(type);
				}
				catch (Exception ex)
				{
					Logger.LogDebug((object)("Error patching type " + type.FullName + ": " + ex.Message));
					if (ex.InnerException != null)
					{
						Logger.LogDebug((object)("Inner exception: " + ex.InnerException.Message));
					}
				}
			}
			Logger.LogDebug((object)"Finished patching!");
		}

		private static Type[] GetTypesWithErrorHandling()
		{
			try
			{
				return Assembly.GetExecutingAssembly().GetTypes();
			}
			catch (ReflectionTypeLoadException ex)
			{
				Logger.LogWarning((object)"ReflectionTypeLoadException caught while getting types. Some types will be skipped.");
				Exception[] loaderExceptions = ex.LoaderExceptions;
				foreach (Exception ex2 in loaderExceptions)
				{
					Logger.LogWarning((object)("Loader Exception: " + ex2.Message));
					if (ex2 is FileNotFoundException ex3)
					{
						Logger.LogWarning((object)("Could not load file: " + ex3.FileName));
					}
				}
				return ex.Types.Where((Type t) => t != null).ToArray();
			}
			catch (Exception ex4)
			{
				Logger.LogError((object)("Unexpected error while getting types: " + ex4.Message));
				return new Type[0];
			}
		}

		internal static void Unpatch()
		{
			Logger.LogDebug((object)"Unpatching...");
			Harmony? harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
			Logger.LogDebug((object)"Finished unpatching!");
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "NoteBoxz.DevStart";

		public const string PLUGIN_NAME = "NotezDevStart";

		public const string PLUGIN_VERSION = "1.0.4";
	}
}
namespace NotezDevStart.Patches
{
	[HarmonyPatch(typeof(IngamePlayerSettings))]
	internal class IngamePlayerSettingsPatch
	{
		[HarmonyPostfix]
		[HarmonyPatch("Awake")]
		private static void AwakePatch(IngamePlayerSettings __instance)
		{
			NotezDevStart.Logger.LogMessage((object)"Loading settings from prefs before the game loads default settings");
			__instance.LoadSettingsFromPrefs();
			__instance.UpdateGameToMatchSettings();
		}
	}
	[HarmonyPatch(typeof(LaunchOptionsSaver))]
	internal class LaunchOptionsSaverPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("Start")]
		internal static bool Start()
		{
			if (!Plugin.Config.SkipLaunchMode.Value)
			{
				return true;
			}
			if (LaunchOptionsSaver.HasRan)
			{
				return true;
			}
			if (!NotezDevStart.forceLANmode)
			{
				return true;
			}
			SceneManager.LoadScene("InitSceneLANMode");
			return false;
		}
	}
	[HarmonyPatch(typeof(MenuManager))]
	internal class MenuManagerPatch
	{
		[CompilerGenerated]
		private sealed class <WaitForHostAndJoin>d__3 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public MenuManager __instance;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <WaitForHostAndJoin>d__3(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0050: Unknown result type (might be due to invalid IL or missing references)
				//IL_005a: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					NotezDevStart.Logger.LogInfo((object)"Waiting for host to be ready...");
					<>2__current = (object)new WaitUntil((Func<bool>)(() => File.Exists(NotezDevStart.HostReadySignalPath)));
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					NotezDevStart.Logger.LogInfo((object)"Host is ready, joining the game...");
					__instance.StartAClient();
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private static bool firstTimeLoad = true;

		[HarmonyPostfix]
		[HarmonyPatch("OnEnable")]
		public static void OnEnablePatch(MenuManager __instance)
		{
			if (firstTimeLoad)
			{
				if ((Object)(object)__instance.menuButtons != (Object)null && ((Object)__instance.menuButtons).name == "MainButtons")
				{
					NotezDevStart.Logger.LogInfo((object)"MenuManager.OnEnablePatch() called - MainButtons");
					JumpInGame(__instance);
				}
				else
				{
					NotezDevStart.Logger.LogInfo((object)"MenuManager.OnEnablePatch() called - not MainButtons");
				}
			}
		}

		private static void JumpInGame(MenuManager __instance)
		{
			if (!Chainloader.PluginInfos.ContainsKey("dev.flero.lethal.FastStartup") && (Object)(object)__instance.lanWarningContainer != (Object)null)
			{
				Object.Destroy((Object)(object)__instance.lanWarningContainer);
			}
			if (NotezDevStart.IsHostInstance)
			{
				__instance.lobbyNameInputField.text = "Placeholder";
				__instance.ConfirmHostButton();
				__instance.lobbyNameInputField.text = "";
			}
			else
			{
				((MonoBehaviour)__instance).StartCoroutine(WaitForHostAndJoin(__instance));
			}
			firstTimeLoad = false;
		}

		[IteratorStateMachine(typeof(<WaitForHostAndJoin>d__3))]
		private static IEnumerator WaitForHostAndJoin(MenuManager __instance)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <WaitForHostAndJoin>d__3(0)
			{
				__instance = __instance
			};
		}
	}
	[HarmonyPatch(typeof(PreInitSceneScript))]
	public static class PreInitSceneScriptPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("SkipToFinalSetting")]
		public static bool SkipToFinalSetting(PreInitSceneScript __instance)
		{
			if (Chainloader.PluginInfos.ContainsKey("dev.flero.lethal.FastStartup"))
			{
				NotezDevStart.Logger.LogInfo((object)"FastStartup is installed, skipping final setting patch.");
				return true;
			}
			if (!NotezDevStart.forceLANmode)
			{
				return true;
			}
			__instance.launchSettingsPanelsContainer.SetActive(false);
			SceneManager.LoadScene("InitSceneLANMode");
			return false;
		}
	}
	[HarmonyPatch(typeof(StartMatchLever))]
	internal class StartMatchLeverPatch
	{
		[CompilerGenerated]
		private sealed class <WaitForPlayersToPullLever>d__2 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public StartMatchLever __instance;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <WaitForPlayersToPullLever>d__2(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_005e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0068: Expected O, but got Unknown
				//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c6: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					NotezDevStart.Logger.LogInfo((object)"Waiting to pull Ship Lever");
					<>2__current = (object)new WaitUntil((Func<bool>)(() => StartOfRound.Instance.connectedPlayersAmount + 1 >= NotezDevStart.playersRequired));
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					if (Chainloader.PluginInfos.ContainsKey("imabatby.lethallevelloader"))
					{
						NotezDevStart.Logger.LogInfo((object)"Waiting for Lethal Level Loader to be ready...");
						<>2__current = (object)new WaitUntil((Func<bool>)(() => LLL_ISREADY()));
						<>1__state = 2;
						return true;
					}
					break;
				case 2:
					<>1__state = -1;
					break;
				}
				NotezDevStart.Logger.LogInfo((object)"Ready!");
				NotezDevStart.Logger.LogInfo((object)"Ship Lever pulled");
				hasPulledLever = true;
				__instance.leverHasBeenPulled = true;
				__instance.leverAnimatorObject.SetBool("pullLever", true);
				__instance.triggerScript.interactable = false;
				__instance.PullLever();
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private static bool hasPulledLever;

		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		public static void StartPatch(StartMatchLever __instance)
		{
			if (((NetworkBehaviour)__instance).IsServer)
			{
				SelectableLevel val = FindLevelByName(NotezDevStart.moonToRoute);
				if ((Object)(object)val != (Object)null && !string.IsNullOrWhiteSpace(NotezDevStart.moonToRoute))
				{
					NotezDevStart.Logger.LogInfo((object)("Setting moon to route: " + val.PlanetName));
					RouteToLevelFast(val);
				}
				else if (!string.IsNullOrWhiteSpace(NotezDevStart.moonToRoute))
				{
					NotezDevStart.Logger.LogWarning((object)("Could not find a level matching the name: " + NotezDevStart.moonToRoute));
				}
			}
			if (NotezDevStart.autoPullLever && !hasPulledLever)
			{
				((MonoBehaviour)__instance).StartCoroutine(WaitForPlayersToPullLever(__instance));
			}
		}

		[IteratorStateMachine(typeof(<WaitForPlayersToPullLever>d__2))]
		public static IEnumerator WaitForPlayersToPullLever(StartMatchLever __instance)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <WaitForPlayersToPullLever>d__2(0)
			{
				__instance = __instance
			};
		}

		public static bool LLL_ISREADY()
		{
			return NetworkBundleManager.Instance.allowedToLoadLevel.Value;
		}

		public static SelectableLevel? FindLevelByName(string levelName)
		{
			SelectableLevel[] levels = StartOfRound.Instance.levels;
			foreach (SelectableLevel val in levels)
			{
				if (val.PlanetName.ToLower().Contains(levelName.ToLower()))
				{
					return val;
				}
			}
			return null;
		}

		public static void RouteToLevelFast(SelectableLevel level)
		{
			StartOfRound instance = StartOfRound.Instance;
			instance.ChangeLevel(level.levelID);
			StartMatchLever val = Object.FindObjectOfType<StartMatchLever>();
			val.triggerScript.interactable = false;
			instance.shipAmbianceAudio.PlayOneShot(instance.shipDepartSFX);
			instance.currentPlanetAnimator.SetTrigger("FlyAway");
			((Component)instance.shipAnimatorObject).gameObject.GetComponent<Animator>().SetBool("FlyingToNewPlanet", true);
			HUDManager.Instance.ShakeCamera((ScreenShakeType)2);
			if ((Object)(object)instance.currentPlanetPrefab != (Object)null)
			{
				Object.Destroy((Object)(object)instance.currentPlanetPrefab);
			}
			instance.ArriveAtLevel();
			if (((NetworkBehaviour)instance).IsServer || GameNetworkManager.Instance.gameHasStarted)
			{
				val.triggerScript.interactable = true;
			}
			for (int i = 0; i < 20; i++)
			{
				AudioSource shipAmbianceAudio = instance.shipAmbianceAudio;
				shipAmbianceAudio.volume -= 0.05f;
			}
			instance.shipAmbianceAudio.Stop();
			instance.shipAmbianceAudio.volume = 1f;
			instance.shipAmbianceAudio.PlayOneShot(instance.shipArriveSFX);
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	internal class StartOfRoundPatch
	{
		private static bool attemptedTp;

		[HarmonyPatch("TeleportPlayerInShipIfOutOfRoomBounds")]
		[HarmonyPostfix]
		public static void TeleportPlayerInShipIfOutOfRoomBoundsStats(StartOfRound __instance)
		{
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Expected O, but got Unknown
			if (NotezDevStart.tpToEntrance && !attemptedTp && __instance.shipDoorsEnabled)
			{
				NotezDevStart.Logger.LogInfo((object)"Teleporting to entrance...");
				MethodInfo methodInfo = AccessTools.Method(typeof(RoundManager), "FindMainEntranceScript", (Type[])null, (Type[])null);
				EntranceTeleport val = (EntranceTeleport)methodInfo.Invoke(null, new object[1] { NotezDevStart.teleportInside });
				if ((Object)(object)val != (Object)null)
				{
					val.TeleportPlayer();
					NotezDevStart.Logger.LogInfo((object)"Player teleported to entrance");
				}
				else
				{
					NotezDevStart.Logger.LogError((object)"Failed to find entrance");
				}
				attemptedTp = true;
			}
		}

		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		public static void StartPostfix(StartOfRound __instance)
		{
			if (NotezDevStart.IsHostInstance)
			{
				NotezDevStart.Logger.LogInfo((object)"Host instance is ready, creating signal file...");
				try
				{
					File.WriteAllText(NotezDevStart.HostReadySignalPath, DateTime.Now.ToString());
					NotezDevStart.Logger.LogInfo((object)"Host signal file created successfully");
				}
				catch (Exception ex)
				{
					NotezDevStart.Logger.LogError((object)("Failed to create host signal file: " + ex.Message));
				}
			}
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}