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 ResetFailedSave v1.0.0
ResetFailedSave.dll
Decompiled a year agousing System; using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using HarmonyLib; using ResetFailedSave.Patches; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("ResetFailedSave")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ResetFailedSave")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("82615b87-dec4-4e89-8dd2-dad35a8e319c")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] public class ChangeLevelStateData { public Level LevelCurrent { get; set; } public int LevelsCompleted { get; set; } public bool Gg { get; set; } public ChangeLevelStateData() { } public ChangeLevelStateData(Level levelCurrent, int levelsCompleted, bool gg) { LevelCurrent = levelCurrent; LevelsCompleted = levelsCompleted; Gg = gg; } } public static class Utils { public static void CompressFolder(string sourceFolder, string compressedFile) { string text = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); try { if (File.Exists(compressedFile)) { File.Delete(compressedFile); } CopyFolder(sourceFolder, text); ZipFile.CreateFromDirectory(text, compressedFile); } catch (Exception ex) { Console.WriteLine("压缩文件夹时发生错误: " + ex.Message); throw; } finally { if (Directory.Exists(text)) { Directory.Delete(text, recursive: true); } } } public static void CopyFolder(string sourceFolder, string destFolder) { if (!Directory.Exists(destFolder)) { Directory.CreateDirectory(destFolder); } string[] files = Directory.GetFiles(sourceFolder); foreach (string text in files) { string destFileName = Path.Combine(destFolder, Path.GetFileName(text)); File.Copy(text, destFileName); } string[] directories = Directory.GetDirectories(sourceFolder); foreach (string text2 in directories) { string destFolder2 = Path.Combine(destFolder, Path.GetFileName(text2)); CopyFolder(text2, destFolder2); } } public static void DecompressFolder(string compressedFile, string targetFolder) { try { if (Directory.Exists(targetFolder)) { Directory.Delete(targetFolder, recursive: true); } Directory.CreateDirectory(targetFolder); ZipFile.ExtractToDirectory(compressedFile, targetFolder); } catch (Exception ex) { Log.LogInfo("解压文件夹时发生错误: " + ex.Message); } } } public static class Log { public static ManualLogSource _logSource; static Log() { _logSource = Logger.CreateLogSource("Reset Failed Save"); } public static void LogInfo(object data) { _logSource.LogInfo(data); } public static void LogWarning(object data) { _logSource.LogWarning(data); } public static void LogError(object data) { _logSource.LogError(data); } public static void LogDebug(object data) { _logSource.LogDebug(data); } public static void LogFatal(object data) { _logSource.LogFatal(data); } public static void LogMessage(object data) { _logSource.LogMessage(data); } } namespace ResetFailedSave { [BepInPlugin("arpen.REPO.ResetFailedSave", "Reset Failed Save", "1.0.0")] public class PluginBase : BaseUnityPlugin { public const string PluginGUID = "arpen.REPO.ResetFailedSave"; public const string PluginName = "Reset Failed Save"; public const string PluginVersion = "1.0.0"; private readonly Harmony _harmony = new Harmony("arpen.REPO.ResetFailedSave"); private static PluginBase Instance; private void Awake() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown if ((Object)Instance == (Object)null) { Instance = this; } Log.LogInfo("<失败存档保留>加载成功! Successfully loaded plugin: arpen.REPO.ResetFailedSave!"); _harmony.PatchAll(typeof(PluginBase)); _harmony.PatchAll(typeof(StatsManager_SaveFileSave_Patch)); _harmony.PatchAll(typeof(MenuPageSaves_OnDeleteGame_Patch)); _harmony.PatchAll(typeof(DataDirector_SaveDeleteCheck_Patch)); _harmony.PatchAll(typeof(RunManager_ChangeLevel_Patch)); } private void Start() { Debug.Log((object)"Start 方法执行!"); } } } namespace ResetFailedSave.Patches { [HarmonyPatch(typeof(StatsManager), "SaveFileSave")] internal class StatsManager_SaveFileSave_Patch { private static void Prefix(ref string ___saveFileCurrent) { string text = Application.persistentDataPath + "/saves"; Utils.CompressFolder(text + "/" + ___saveFileCurrent, text + "/" + ___saveFileCurrent + ".zip"); } private static void Postfix() { } } [HarmonyPatch(typeof(MenuPageSaves), "OnDeleteGame")] internal class MenuPageSaves_OnDeleteGame_Patch { public static void Postfix(ref string ___currentSaveFileName) { string text = Application.persistentDataPath + "/saves/" + ___currentSaveFileName; if (Directory.Exists(text)) { Directory.Delete(text, recursive: true); } if (File.Exists(text + ".zip")) { File.Delete(text + ".zip"); } } } [HarmonyPatch(typeof(DataDirector), "SaveDeleteCheck")] internal class DataDirector_SaveDeleteCheck_Patch { private static readonly FieldRef<StatsManager, string> _getSaveFileCurrent; static DataDirector_SaveDeleteCheck_Patch() { FieldInfo field = typeof(StatsManager).GetField("saveFileCurrent", BindingFlags.Instance | BindingFlags.NonPublic); _getSaveFileCurrent = AccessTools.FieldRefAccess<StatsManager, string>(field); } private static void Prefix(bool _leaveGame, out string __state) { StatsManager val = Object.FindObjectOfType<StatsManager>(); __state = _getSaveFileCurrent.Invoke(val); } private static void Postfix(string __state) { if (SemiFunc.RunIsArena()) { string text = Application.persistentDataPath + "/saves"; Utils.DecompressFolder(text + "/" + __state + ".zip", text + "/" + __state); } } } [HarmonyPatch(typeof(RunManager), "ChangeLevel")] internal class RunManager_ChangeLevel_Patch { private static readonly FieldRef<StatsManager, string> _getSaveFileCurrent; static RunManager_ChangeLevel_Patch() { FieldInfo field = typeof(StatsManager).GetField("saveFileCurrent", BindingFlags.Instance | BindingFlags.NonPublic); _getSaveFileCurrent = AccessTools.FieldRefAccess<StatsManager, string>(field); } private static bool Prefix(out ChangeLevelStateData __state, bool _completedLevel, bool _levelFailed, ChangeLevelType _changeLevelType, bool ___gameOver, Level ___levelPrevious) { if (SemiFunc.DebugDev()) { __state = new ChangeLevelStateData(); return true; } if (!_completedLevel && _levelFailed && !___gameOver) { Level levelCurrent = ((!SemiFunc.IsMultiplayer()) ? RunManager.instance.levelMainMenu : RunManager.instance.levelLobbyMenu); string name = ((Object)RunManager.instance.levelCurrent).name; string text = name; if (text == "Level - Arena") { __state = new ChangeLevelStateData(levelCurrent, RunManager.instance.levelsCompleted, gg: true); return false; } levelCurrent = ___levelPrevious; __state = new ChangeLevelStateData(levelCurrent, RunManager.instance.levelsCompleted, gg: false); return true; } __state = new ChangeLevelStateData(); return true; } private static void Postfix(ChangeLevelStateData __state, bool _completedLevel, bool _levelFailed, ChangeLevelType _changeLevelType, ref Level ___previousRunLevel, ref bool ___gameOver) { //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) if (__state.Gg) { ___previousRunLevel = __state.LevelCurrent; RunManager.instance.levelCurrent = __state.LevelCurrent; RunManager.instance.levelsCompleted = __state.LevelsCompleted; ___gameOver = false; SemiFunc.SaveFileLoad(_getSaveFileCurrent.Invoke(StatsManager.instance)); ChangeLevelType val = ((!SemiFunc.IsMultiplayer()) ? ((ChangeLevelType)1) : ((ChangeLevelType)3)); RunManager.instance.ChangeLevel(true, false, val); } } } }