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 FastStartup v0.2.0
FastStartup.dll
Decompiled a year agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using Microsoft.CodeAnalysis; using On; using REPOLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("FastStartup")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+ebfef4e9507f27d1811b694c3194d362c95466be")] [assembly: AssemblyProduct("FastStartup")] [assembly: AssemblyTitle("FastStartup")] [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 FastStartup { internal class Config { public readonly bool Multiplayer; public readonly SaveMode SaveMode; public readonly string SaveFileName; public readonly bool OverrideLevel; public readonly string LevelName; public Config(ConfigFile file) { Multiplayer = file.Bind<bool>("General", "Multiplayer", true, "Whether to start a multiplayer or singleplayer lobby").Value; SaveMode = file.Bind<SaveMode>("General", "SaveMode", SaveMode.ResetOnStartup, "ResetOnStartup: Create a new save and reset it on each startup.CreateOnStartup: Create a brand new save on each startup.Reuse: Use an existing save, without resetting.").Value; SaveFileName = file.Bind<string>("General", "SaveFileName", "REPO_FASTSTARTUP_SAVE", "The name of the save file to use.").Value; OverrideLevel = file.Bind<bool>("General", "OverrideLevel", false, "Whether to always start in the same level. Requires the LevelName option to be set.").Value; LevelName = file.Bind<string>("General", "LevelName", string.Empty, "The name of the level to start at. The 'Level - ' prefix is optional. Only applicable when OverrideLevel is true.").Value; } } internal static class Patches { [CompilerGenerated] private static class <>O { public static Action <0>__SkipMainMenu; public static hook_CreateLobby <1>__CreateLobbyPatch; } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_Awake <>9__0_0; public static hook_LevelAnimationStart <>9__0_1; public static hook_SetRunLevel <>9__0_2; internal void <Init>b__0_0(orig_Awake orig, RunManager self) { orig.Invoke(self); ((MonoBehaviour)self).StartCoroutine(YieldThen(Plugin.SkipMainMenu)); } internal void <Init>b__0_1(orig_LevelAnimationStart _, LoadingUI self) { self.levelAnimationStarted = true; self.levelAnimationCompleted = true; } internal void <Init>b__0_2(orig_SetRunLevel orig, RunManager self) { if (!Plugin.OverrideLevel()) { orig.Invoke(self); } } } [CompilerGenerated] private sealed class <CreateLobbyPatch>d__2 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public orig_CreateLobby orig; public NetworkConnect self; private IEnumerator <enumerator>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CreateLobbyPatch>d__2(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <enumerator>5__2 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <enumerator>5__2 = orig.Invoke(self); break; case 1: <>1__state = -1; break; } if (<enumerator>5__2.MoveNext()) { <>2__current = <enumerator>5__2.Current; <>1__state = 1; return true; } Plugin.Log.LogInfo((object)"Lobby creation finished!"); 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(); } } [CompilerGenerated] private sealed class <YieldThen>d__1 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public Action action; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <YieldThen>d__1(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; action(); 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(); } } internal static void Init() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //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_005b: Expected O, but got Unknown //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Expected O, but got Unknown //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Expected O, but got Unknown if (Chainloader.PluginInfos.ContainsKey("REPOLib")) { RepoLibCompat.Init(); } else { object obj = <>c.<>9__0_0; if (obj == null) { hook_Awake val = delegate(orig_Awake orig, RunManager self) { orig.Invoke(self); ((MonoBehaviour)self).StartCoroutine(YieldThen(Plugin.SkipMainMenu)); }; <>c.<>9__0_0 = val; obj = (object)val; } RunManager.Awake += (hook_Awake)obj; } object obj2 = <>c.<>9__0_1; if (obj2 == null) { hook_LevelAnimationStart val2 = delegate(orig_LevelAnimationStart _, LoadingUI self) { self.levelAnimationStarted = true; self.levelAnimationCompleted = true; }; <>c.<>9__0_1 = val2; obj2 = (object)val2; } LoadingUI.LevelAnimationStart += (hook_LevelAnimationStart)obj2; object obj3 = <>c.<>9__0_2; if (obj3 == null) { hook_SetRunLevel val3 = delegate(orig_SetRunLevel orig, RunManager self) { if (!Plugin.OverrideLevel()) { orig.Invoke(self); } }; <>c.<>9__0_2 = val3; obj3 = (object)val3; } RunManager.SetRunLevel += (hook_SetRunLevel)obj3; object obj4 = <>O.<1>__CreateLobbyPatch; if (obj4 == null) { hook_CreateLobby val4 = CreateLobbyPatch; <>O.<1>__CreateLobbyPatch = val4; obj4 = (object)val4; } NetworkConnect.CreateLobby += (hook_CreateLobby)obj4; } [IteratorStateMachine(typeof(<YieldThen>d__1))] private static IEnumerator YieldThen(Action action) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <YieldThen>d__1(0) { action = action }; } [IteratorStateMachine(typeof(<CreateLobbyPatch>d__2))] private static IEnumerator CreateLobbyPatch(orig_CreateLobby orig, NetworkConnect self) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CreateLobbyPatch>d__2(0) { orig = orig, self = self }; } } [BepInPlugin("com.kesomannen.FastStartup", "FastStartup", "0.1.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { private static bool _overrideLevelTrigger; internal static ManualLogSource Log; private static Config _config; private void Awake() { Log = ((BaseUnityPlugin)this).Logger; _config = new Config(((BaseUnityPlugin)this).Config); Patches.Init(); } internal static void SkipMainMenu() { Log.LogInfo((object)"Skipping main menu."); RunManager.instance.ResetProgress(); List<string> list = SemiFunc.SaveFileGetAll(); if (_config.SaveMode == SaveMode.CreateOnStartup) { Log.LogDebug((object)"Creating new save file."); SemiFunc.SaveFileCreate(); } else { bool flag = list.Contains(_config.SaveFileName); if (_config.SaveMode == SaveMode.ResetOnStartup) { if (flag) { Log.LogDebug((object)"Deleting existing save file."); SemiFunc.SaveFileDelete(_config.SaveFileName); } else { Log.LogDebug((object)"Creating new save file."); } } else if (!flag) { Log.LogWarning((object)("Could not find save file " + _config.SaveFileName + "! Creating new file...")); } StatsManager.instance.saveFileCurrent = _config.SaveFileName; StatsManager.instance.SaveGame(_config.SaveFileName); SemiFunc.SaveFileLoad(_config.SaveFileName); } if (_config.OverrideLevel) { _overrideLevelTrigger = true; } if (_config.Multiplayer) { Log.LogDebug((object)"Starting multiplayer game."); Object.Instantiate<GameObject>(SteamManager.instance.networkConnectPrefab); } else { Log.LogDebug((object)"Starting singleplayer game."); } Log.LogDebug((object)"Changing level."); RunManager.instance.ChangeLevel(true, false, (ChangeLevelType)1); } internal static bool OverrideLevel() { if (!_overrideLevelTrigger) { return false; } _overrideLevelTrigger = false; Level val = Utils.FindLevel(_config.LevelName); if ((Object)(object)val == (Object)null) { Log.LogWarning((object)("Level " + _config.LevelName + " not found! Defaulting to random...")); return false; } Log.LogDebug((object)("Overriding level to " + ((Object)val).name + ".")); RunManager.instance.levelCurrent = val; return true; } } internal static class RepoLibCompat { public static void Init() { Plugin.Log.LogDebug((object)"REPOLib detected."); BundleLoader.OnAllBundlesLoaded += Plugin.SkipMainMenu; } } internal enum SaveMode { ResetOnStartup, CreateOnStartup, Reuse } internal static class Utils { public static Level FindLevel(string name) { return RunManager.instance.levels.Find(delegate(Level level) { if (((Object)level).name == name) { return true; } if (((Object)level).name.StartsWith("Level - ")) { string name2 = ((Object)level).name; int length = "Level - ".Length; return name2.Substring(length, name2.Length - length) == name; } return false; }); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }