using System; 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.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [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("")] [assembly: AssemblyCompany("NoteBoxz")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("0.0.1.0")] [assembly: AssemblyInformationalVersion("0.0.1")] [assembly: AssemblyProduct("NoDeathReset")] [assembly: AssemblyTitle("NoDeathReset")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.1.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 NoDeathReset { [HarmonyPatch(typeof(DataDirector))] internal static class DataDirectorPatch { [HarmonyPrefix] [HarmonyPatch("SaveDeleteCheck")] private static bool SaveDeleteCheckPrefix(DataDirector __instance) { try { if (SemiFunc.IsMasterClientOrSingleplayer() && !((Object)(object)RunManager.instance.levelPrevious == (Object)(object)RunManager.instance.levelTutorial) && !((Object)(object)RunManager.instance.levelPrevious == (Object)(object)RunManager.instance.levelMainMenu) && !((Object)(object)RunManager.instance.levelPrevious == (Object)(object)RunManager.instance.levelRecording) && (SemiFunc.RunIsArena() || RunManager.instance.allPlayersDead)) { NoDeathReset.Logger.LogMessage((object)"DataDirector.SaveDeleteCheck: Arena level or all players dead detected, save delete prevented."); return false; } return true; } catch (Exception arg) { NoDeathReset.Logger.LogError((object)$"Error in DataDirectorPatch.SaveDeleteCheckPrefix: {arg}"); return true; } } } [BepInPlugin("NoteBoxz.NoDeathReset", "NoDeathReset", "0.0.1")] public class NoDeathReset : BaseUnityPlugin { internal static NoDeathReset Instance { get; private set; } internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { get; set; } private void Awake() { Instance = this; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Patch(); Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!"); } internal void Patch() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0026: Expected O, but got Unknown if (Harmony == null) { Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID); Harmony val2 = val; Harmony = val; } Harmony.PatchAll(); } internal void Unpatch() { Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } } private void Update() { } } [HarmonyPatch(typeof(RoundDirector))] internal static class RoundDirectorPatch { public static int HPatStart = 1; [HarmonyPrefix] [HarmonyPatch("Start")] private static void Start_Prefix(RoundDirector __instance) { try { if ((Object)(object)RunManager.instance.levelCurrent != (Object)(object)RunManager.instance.levelArena && (Object)(object)RunManager.instance.previousRunLevel != (Object)(object)RunManager.instance.levelArena) { HPatStart = Mathf.Max(1, StatsManager.instance.GetPlayerHealth(PlayerAvatar.instance.steamID)); NoDeathReset.Logger.LogDebug((object)$"RoundDirectorPatch.Start_Prefix: HPatStart set to {HPatStart}."); } else { NoDeathReset.Logger.LogDebug((object)"RoundDirectorPatch.Start_Prefix: Arena level detected, not setting HPatStart."); } } catch (Exception arg) { NoDeathReset.Logger.LogError((object)$"Error in RoundDirectorPatch.Start_Prefix: {arg}"); } } } [HarmonyPatch(typeof(RunManager))] internal static class RunManagerPatch { [HarmonyPrefix] [HarmonyPatch("ResetProgress")] private static bool ResetProgressPrefix(RunManager __instance) { try { if ((Object)(object)__instance.levelCurrent == (Object)(object)__instance.levelArena) { NoDeathReset.Logger.LogMessage((object)"RunManager.ResetProgress: Arena level detected, progress reset prevented."); int health = Mathf.Max(1, RoundDirectorPatch.HPatStart); PlayerHealth playerHealth = PlayerAvatar.instance.playerHealth; playerHealth.health = health; StatsManager.instance.SetPlayerHealth(SemiFunc.PlayerGetSteamID(playerHealth.playerAvatar), playerHealth.health, false); NoDeathReset.Logger.LogDebug((object)$"RunManager.ResetProgress: Player health set to {playerHealth.health}."); return false; } return true; } catch (Exception arg) { NoDeathReset.Logger.LogError((object)$"Error in RunManagerPatch.ResetProgressPrefix: {arg}"); return true; } } } }