Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of NotezDevelopmentStartup v1.0.4
NoteBoxz.DevStart.dll
Decompiled 8 months agousing 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) { } } }