using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using GameNetcodeStuff;
using HarmonyLib;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("FastRestart")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("FastRestart")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("e0c053f7-48a2-40e4-88fc-37f7fce55f2e")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace FastRestart
{
[BepInPlugin("kos.fastRestart", "Fast Restart", "1.0.0")]
public class FastRestartBase : BaseUnityPlugin
{
private const string modGUID = "kos.fastRestart";
private const string modName = "Fast Restart";
private const string modVersion = "1.0.0";
public static bool verifying;
private ConfigEntry<bool> overrideConfirmation;
public static bool bypassConfirm;
private Harmony harmony;
private static MethodInfo chat;
private void Awake()
{
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Expected O, but got Unknown
overrideConfirmation = ((BaseUnityPlugin)this).Config.Bind<bool>("Config", "Override Confirmation", false, "Ignore the confirmation step of restarting.");
bypassConfirm = overrideConfirmation.Value;
harmony = new Harmony("kos.fastRestart");
harmony.PatchAll();
chat = AccessTools.Method(typeof(HUDManager), "AddChatMessage", (Type[])null, (Type[])null);
((BaseUnityPlugin)this).Logger.LogInfo((object)"kos.fastRestart loaded!");
}
public static void SendChatMessage(string message)
{
chat?.Invoke(HUDManager.Instance, new object[2] { message, "" });
HUDManager.Instance.lastChatMessage = "";
}
public static void ConfirmRestart()
{
verifying = true;
SendChatMessage("Are you sure? Y/N.");
}
public static void AcceptRestart(StartOfRound manager)
{
SendChatMessage("Restart confirmed.");
verifying = false;
int[] array = new int[4]
{
manager.gameStats.daysSpent,
manager.gameStats.scrapValueCollected,
manager.gameStats.deaths,
manager.gameStats.allStepsTaken
};
manager.FirePlayersAfterDeadlineClientRpc(array, false);
}
public static void DeclineRestart()
{
SendChatMessage("Restart aborted.");
verifying = false;
}
}
}
namespace FastRestart.Patches
{
[HarmonyPatch(typeof(HUDManager), "SubmitChat_performed")]
internal class SubmitChatPatch
{
private static bool Prefix(ref CallbackContext context)
{
if (!((CallbackContext)(ref context)).performed)
{
return true;
}
HUDManager instance = HUDManager.Instance;
if (string.IsNullOrEmpty(instance.chatTextField.text))
{
return true;
}
PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
if ((Object)(object)localPlayerController == (Object)null)
{
return true;
}
StartOfRound playersManager = localPlayerController.playersManager;
if ((Object)(object)playersManager == (Object)null)
{
return true;
}
string text = instance.chatTextField.text;
if (FastRestartBase.verifying)
{
if (text.ToLower() == "y" || text.ToLower() == "yes")
{
ResetTextbox(instance, localPlayerController);
if (!localPlayerController.isInHangarShipRoom || !playersManager.inShipPhase || playersManager.travellingToNewLevel)
{
FastRestartBase.SendChatMessage("Cannot restart, ship must be in orbit.");
return false;
}
FastRestartBase.AcceptRestart(playersManager);
return false;
}
if (text.ToLower() == "n" || text.ToLower() == "no")
{
ResetTextbox(instance, localPlayerController);
FastRestartBase.DeclineRestart();
return false;
}
return true;
}
if (text.ToLower() == "/restart" || text.ToLower() == "/reset")
{
ResetTextbox(instance, localPlayerController);
if (!GameNetworkManager.Instance.isHostingGame)
{
FastRestartBase.SendChatMessage("Must be lobby host to reset game.");
return false;
}
if (FastRestartBase.bypassConfirm)
{
FastRestartBase.AcceptRestart(playersManager);
}
else
{
FastRestartBase.ConfirmRestart();
}
return false;
}
return true;
}
private static void ResetTextbox(HUDManager manager, PlayerControllerB local)
{
local.isTypingChat = false;
manager.chatTextField.text = "";
EventSystem.current.SetSelectedGameObject((GameObject)null);
manager.PingHUDElement(manager.Chat, 2f, 1f, 0.2f);
((Behaviour)manager.typingIndicator).enabled = false;
}
}
}