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 QuickRestart v1.6.1
QuickRestart.dll
Decompiled 5 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using Booth; using On.RoR2.UI; using QuickRestart; using R2API.Utils; using RoR2; using RoR2.UI; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.UI; [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: AssemblyCompany("QuickRestart")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+ec06c63734b0b4badde6f8f7d5812726cbcdbd64")] [assembly: AssemblyProduct("QuickRestart")] [assembly: AssemblyTitle("QuickRestart")] [assembly: AssemblyVersion("1.0.0.0")] namespace Booth { internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } [NetworkCompatibility(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.IkalaGaming.QuickRestart", "QuickRestart", "1.6.1")] public class QuickRestart : BaseUnityPlugin { private static KeyCode ResetKeyCode = (KeyCode)116; private float TimeSpentHoldingKey = 0f; private float ResetKeyThreshold = 1f; private bool ResetAlready = false; private bool IsInChatBox = false; public static ConfigEntry<string> ConfigRestartButtonPosition { get; set; } public static ConfigEntry<string> ConfigCharacterButtonPosition { get; set; } public static ConfigEntry<bool> ConfigResetKeyEnabled { get; set; } public static ConfigEntry<string> ConfigResetKeyBind { get; set; } public static ConfigEntry<float> ConfigResetKeyHoldTime { get; set; } public static ConfigEntry<bool> ConfigConfirmationDialog { get; set; } public static ConfigEntry<bool> ConfigConfirmationDialogSkippedOnFirstStage { get; set; } public static ConfigEntry<bool> ConfigDisableCharacterSelectButton { get; set; } public void SetupConfig() { //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) ConfigRestartButtonPosition = ((BaseUnityPlugin)this).Config.Bind<string>("Graphics", "RestartPosition", "bottom", "The position of the restart button in the pause menu. Options are 'top', 'bottom', or the number of positions away from the top, so '1' would be 1 below the top item and thus second in the list. Falls back to default if you give weird values."); ConfigCharacterButtonPosition = ((BaseUnityPlugin)this).Config.Bind<string>("Graphics", "CharacterPosition", "bottom", "The position of the character select button in the pause menu. Options are 'top', 'bottom', or the number of positions away from the top, so '1' would be 1 below the top item and thus second in the list. Falls back to default if you give weird values. Evaluated after the restart button is placed."); ConfigConfirmationDialog = ((BaseUnityPlugin)this).Config.Bind<bool>("Graphics", "ConfirmationDialogEnabled", false, "Enables a confirmation dialog when trying to reset so it is not done accidentally"); ConfigConfirmationDialogSkippedOnFirstStage = ((BaseUnityPlugin)this).Config.Bind<bool>("Graphics", "ConfirmationDialogSkippedOnFirstStage", false, "Skips the confirmation dialog on the first stage"); ConfigDisableCharacterSelectButton = ((BaseUnityPlugin)this).Config.Bind<bool>("Graphics", "DisableCharacterSelectButton", false, "Disables (does not show) the character select button"); ConfigResetKeyEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Keybind", "ResetKeyEnabled", false, "Allows a key press to be used to reset runs in addition to the menu"); ConfigResetKeyBind = ((BaseUnityPlugin)this).Config.Bind<string>("Keybind", "ResetKeyBind", "T", "The key that has to be pressed to reset. Falls back to default if you give weird values."); try { ResetKeyCode = (KeyCode)Enum.Parse(typeof(KeyCode), ConfigResetKeyBind.Value); } catch (Exception) { ResetKeyCode = (KeyCode)116; } ConfigResetKeyHoldTime = ((BaseUnityPlugin)this).Config.Bind<float>("Keybind", "ResetKeyHoldTime", 1f, "The number of seconds that the reset key has to be held in order to reset. Falls back to default if you give weird values."); if (ConfigResetKeyHoldTime.Value >= 0f) { ResetKeyThreshold = ConfigResetKeyHoldTime.Value; } } private void HandleResetKey() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) if (Input.GetKey(ResetKeyCode)) { TimeSpentHoldingKey += Time.deltaTime; if (TimeSpentHoldingKey > ResetKeyThreshold && !ResetAlready) { PauseScreenController pauseScreen = null; if (PauseScreenController.instancesList.Count > 0) { pauseScreen = PauseScreenController.instancesList[0]; } TimeSpentHoldingKey = 0f; ResetAlready = true; Log.Debug("Restarting from keybind"); BoothUtil.ResetGame(pauseScreen, ConfigConfirmationDialog.Value, ConfigConfirmationDialogSkippedOnFirstStage.Value, this, startNewGame: true); } } if (Input.GetKeyUp(ResetKeyCode)) { TimeSpentHoldingKey = 0f; ResetAlready = false; } } private void Update() { if (ConfigResetKeyEnabled.Value) { bool flag = Run.instance != null; bool flag2 = PlayerCharacterMasterController.instances.Count > 1 && !BoothUtil.IsMultiplayerHost(); if (flag && !flag2 && !IsInChatBox) { HandleResetKey(); } } } public void Awake() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Expected O, but got Unknown Log.Init(((BaseUnityPlugin)this).Logger); SetupConfig(); ChatBox.FocusInputField += (hook_FocusInputField)delegate(orig_FocusInputField orig, ChatBox self) { orig.Invoke(self); IsInChatBox = true; }; ChatBox.UnfocusInputField += (hook_UnfocusInputField)delegate(orig_UnfocusInputField orig, ChatBox self) { orig.Invoke(self); IsInChatBox = false; }; PauseScreenController.Awake += (hook_Awake)delegate(orig_Awake orig, PauseScreenController self) { orig.Invoke(self); if (Run.instance != null && !Object.op_Implicit((Object)(object)PreGameController.instance)) { Transform child = ((Transform)self.mainPanel).GetChild(0).GetChild(1); AddRestartButton(self, child); if (!ConfigDisableCharacterSelectButton.Value) { AddCharacterSelectButton(self, child); } } }; } private void AddRestartButton(PauseScreenController self, Transform firstButton) { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Expected O, but got Unknown Transform val = Object.Instantiate<Transform>(firstButton, ((Transform)self.mainPanel).GetChild(0)); TextMeshProUGUI componentInChildren = (TextMeshProUGUI)(object)((Component)val).GetComponentInChildren<HGTextMeshProUGUI>(); ((TMP_Text)componentInChildren).text = "Restart"; Transform parent = ((TMP_Text)componentInChildren).transform.parent; TextMeshProUGUI val2 = Object.Instantiate<TextMeshProUGUI>(componentInChildren, parent); Object.Destroy((Object)(object)componentInChildren); HGButton component = ((Component)val).GetComponent<HGButton>(); ((Button)component).onClick = new ButtonClickedEvent(); ((UnityEvent)((Button)component).onClick).AddListener((UnityAction)delegate { Log.Debug("Restarting from button"); BoothUtil.ResetGame(self, ConfigConfirmationDialog.Value, ConfigConfirmationDialogSkippedOnFirstStage.Value, this, startNewGame: true); }); if ("top".Equals(ConfigRestartButtonPosition.Value, StringComparison.InvariantCultureIgnoreCase)) { ((Component)val).transform.SetAsFirstSibling(); } else if ("bottom".Equals(ConfigRestartButtonPosition.Value, StringComparison.InvariantCultureIgnoreCase)) { ((Component)val).transform.SetAsLastSibling(); } else { try { int num = Convert.ToInt32(ConfigRestartButtonPosition.Value); if (num < 0) { num = 0; } else if (num >= ((Component)val).transform.parent.childCount) { num = ((Component)val).transform.parent.childCount - 1; } ((Component)val).transform.SetSiblingIndex(num); } catch (FormatException) { ((Component)val).transform.SetAsLastSibling(); } } if (PlayerCharacterMasterController.instances.Count > 1 && !BoothUtil.IsMultiplayerHost()) { ((Component)val).gameObject.SetActive(false); } } private void AddCharacterSelectButton(PauseScreenController self, Transform firstButton) { //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Expected O, but got Unknown //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Expected O, but got Unknown Transform val = Object.Instantiate<Transform>(firstButton, ((Transform)self.mainPanel).GetChild(0)); TextMeshProUGUI componentInChildren = (TextMeshProUGUI)(object)((Component)val).GetComponentInChildren<HGTextMeshProUGUI>(); ((TMP_Text)componentInChildren).text = "Character Select"; Transform parent = ((TMP_Text)componentInChildren).transform.parent; TextMeshProUGUI val2 = Object.Instantiate<TextMeshProUGUI>(componentInChildren, parent); Object.Destroy((Object)(object)componentInChildren); if ("top".Equals(ConfigCharacterButtonPosition.Value, StringComparison.InvariantCultureIgnoreCase)) { ((Component)val).transform.SetAsFirstSibling(); } else if ("bottom".Equals(ConfigCharacterButtonPosition.Value, StringComparison.InvariantCultureIgnoreCase)) { ((Component)val).transform.SetAsLastSibling(); } else { try { int num = Convert.ToInt32(ConfigCharacterButtonPosition.Value); if (num < 0) { num = 0; } else if (num >= ((Component)val).transform.parent.childCount) { num = ((Component)val).transform.parent.childCount - 1; } ((Component)val).transform.SetSiblingIndex(num); } catch (FormatException) { ((Component)val).transform.SetAsLastSibling(); } } if (PlayerCharacterMasterController.instances.Count > 1 && !BoothUtil.IsMultiplayerHost()) { ((Component)val).gameObject.SetActive(false); } HGButton component = ((Component)val).GetComponent<HGButton>(); ((Button)component).onClick = new ButtonClickedEvent(); ((UnityEvent)((Button)component).onClick).AddListener((UnityAction)delegate { Log.Debug("Returning to Character Select from button"); BoothUtil.ResetGame(self, ConfigConfirmationDialog.Value, ConfigConfirmationDialogSkippedOnFirstStage.Value, this, startNewGame: false); }); } } } namespace QuickRestart { internal class BoothUtil { [CompilerGenerated] private sealed class <StartNewGame>d__3 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <StartNewGame>d__3(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; break; } if (!Object.op_Implicit((Object)(object)PreGameController.instance)) { <>2__current = (object)new WaitForSeconds(0.1f); <>1__state = 1; return true; } Reflection.InvokeMethod((object)PreGameController.instance, "StartRun"); 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(); } } public static void ResetGame(PauseScreenController pauseScreen, bool AskConfirmation, bool skipConfirmationOnFirstLevel, Booth.QuickRestart parent, bool startNewGame) { //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Expected O, but got Unknown bool flag = AskConfirmation; if (AskConfirmation && (!skipConfirmationOnFirstLevel || Run.instance.stageClearCount != 0)) { if (SimpleDialogBox.instancesList.Count <= 0) { SimpleDialogBox val = SimpleDialogBox.Create((MPEventSystem)null); val.headerToken = new TokenParamsPair("Are you sure?", Array.Empty<object>()); string text = "Are you sure you want to reset this run?"; if (pauseScreen == null) { text += " Use info screen button (usually tab/select) to move cursor."; } val.descriptionToken = new TokenParamsPair(text, Array.Empty<object>()); val.AddActionButton((UnityAction)delegate { ActuallyResetGame(pauseScreen, parent, startNewGame); }, "Yes", true, Array.Empty<object>()); val.AddCancelButton("Cancel", Array.Empty<object>()); } } else { ActuallyResetGame(pauseScreen, parent, startNewGame); } } public static bool IsMultiplayerHost() { return Object.op_Implicit((Object)(object)NetworkSession.instance) && NetworkServer.active; } private static void ActuallyResetGame(PauseScreenController pauseScreen, Booth.QuickRestart parent, bool startNewGame) { if (pauseScreen != null) { pauseScreen.DestroyPauseScreen(true); } if (Run.instance != null && ((Component)Run.instance).gameObject != null) { Object.Destroy((Object)(object)((Component)Run.instance).gameObject); Object.Destroy((Object)(object)Run.instance); } if (startNewGame) { ((MonoBehaviour)parent).StartCoroutine(StartNewGame()); } } [IteratorStateMachine(typeof(<StartNewGame>d__3))] private static IEnumerator StartNewGame() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <StartNewGame>d__3(0); } } }