From 792ffa0ef9b821db6254bb7c17bf26c6b3e342ae Mon Sep 17 00:00:00 2001 From: Hubert Gendron Date: Tue, 27 Apr 2021 22:01:34 -0400 Subject: [PATCH] Fix save game loading issues --- NebulaHost/SaveManager.cs | 38 ++++++++++++--- .../Patches/Dynamic/GameSave_Patch.cs | 11 +---- .../Patches/Dynamic/UIEscMenu_Patch.cs | 46 ------------------- .../Patches/Dynamic/UILoadGameWindow_Patch.cs | 6 +-- 4 files changed, 36 insertions(+), 65 deletions(-) diff --git a/NebulaHost/SaveManager.cs b/NebulaHost/SaveManager.cs index 4c8214246..09eca60ef 100644 --- a/NebulaHost/SaveManager.cs +++ b/NebulaHost/SaveManager.cs @@ -1,4 +1,5 @@ -using NebulaModel.DataStructures; +using HarmonyLib; +using NebulaModel.DataStructures; using NebulaModel.Networking.Serialization; using NebulaModel.Utils; using NebulaWorld; @@ -10,9 +11,7 @@ namespace NebulaHost public class SaveManager { private const string FILE_EXTENSION = ".server"; - private static string lastFileName = ""; - public static bool SaveOnExit = false; public static void SaveServerData(string saveName) { string path = GameConfig.gameSaveFolder + saveName + FILE_EXTENSION; @@ -32,25 +31,50 @@ public static void SaveServerData(string saveName) } //Add host's data - netDataWriter.Put(CryptoUtils.GetCurrentUserPublicKeyHash()); + netDataWriter.Put(CryptoUtils.GetCurrentUserPublicKeyHash()); LocalPlayer.Data.Serialize(netDataWriter); File.WriteAllBytes(path, netDataWriter.Data); + + // If the saveName is the autoSave, we need to rotate the server autosave file. + if (saveName == GameSave.AutoSaveTmp) + { + HandleAutoSave(); + } } - public static void SetLastSave(string fileName) + static void HandleAutoSave() { - lastFileName = fileName; + string str1 = GameConfig.gameSaveFolder + GameSave.AutoSaveTmp + FILE_EXTENSION; + string str2 = GameConfig.gameSaveFolder + GameSave.AutoSave0 + FILE_EXTENSION; + string str3 = GameConfig.gameSaveFolder + AccessTools.Field(typeof(GameSave), "AutoSave1").GetValue(null) + FILE_EXTENSION; + string str4 = GameConfig.gameSaveFolder + AccessTools.Field(typeof(GameSave), "AutoSave2").GetValue(null) + FILE_EXTENSION; + string str5 = GameConfig.gameSaveFolder + AccessTools.Field(typeof(GameSave), "AutoSave3").GetValue(null) + FILE_EXTENSION; + + if (File.Exists(str1)) + { + if (File.Exists(str5)) + File.Delete(str5); + if (File.Exists(str4)) + File.Move(str4, str5); + if (File.Exists(str3)) + File.Move(str3, str4); + if (File.Exists(str2)) + File.Move(str2, str3); + File.Move(str1, str2); + } } public static void LoadServerData() { - string path = GameConfig.gameSaveFolder + lastFileName + FILE_EXTENSION; + string path = GameConfig.gameSaveFolder + DSPGame.LoadFile + FILE_EXTENSION; + PlayerManager playerManager = MultiplayerHostSession.Instance.PlayerManager; if (!File.Exists(path) || playerManager == null) { return; } + byte[] source = File.ReadAllBytes(path); NetDataReader netDataReader = new NetDataReader(source); int playerNum = netDataReader.GetInt(); diff --git a/NebulaPatcher/Patches/Dynamic/GameSave_Patch.cs b/NebulaPatcher/Patches/Dynamic/GameSave_Patch.cs index 0ed19b0b4..676d6ebc0 100644 --- a/NebulaPatcher/Patches/Dynamic/GameSave_Patch.cs +++ b/NebulaPatcher/Patches/Dynamic/GameSave_Patch.cs @@ -20,13 +20,6 @@ public static bool SaveCurrentGame_Prefix(string saveName) return (!SimulatedWorld.Initialized && !SimulatedWorld.ExitingMultiplayerSession) || LocalPlayer.IsMasterClient; } - [HarmonyPrefix] - [HarmonyPatch("LoadCurrentGame")] - public static void LoadCurrentGame_Prefix(string saveName) - { - SaveManager.SetLastSave(saveName); - } - [HarmonyPrefix] [HarmonyPatch("AutoSave")] public static bool AutoSave_Prefix() @@ -39,8 +32,8 @@ public static bool AutoSave_Prefix() [HarmonyPatch("SaveAsLastExit")] public static bool SaveAsLastExit_Prefix() { - // Only save if in single player or if you are the host - return (!SimulatedWorld.Initialized && !SimulatedWorld.ExitingMultiplayerSession) || LocalPlayer.IsMasterClient; + // Only save if in single player, since multiplayer requires to load from the Load Save Window + return (!SimulatedWorld.Initialized && !SimulatedWorld.ExitingMultiplayerSession); } } } diff --git a/NebulaPatcher/Patches/Dynamic/UIEscMenu_Patch.cs b/NebulaPatcher/Patches/Dynamic/UIEscMenu_Patch.cs index 54bdcfba3..0d876df40 100644 --- a/NebulaPatcher/Patches/Dynamic/UIEscMenu_Patch.cs +++ b/NebulaPatcher/Patches/Dynamic/UIEscMenu_Patch.cs @@ -1,10 +1,6 @@ using HarmonyLib; -using NebulaModel; -using NebulaModel.Logger; -using NebulaPatcher.MonoBehaviours; using NebulaWorld; using UnityEngine; -using UnityEngine.Events; using UnityEngine.UI; namespace NebulaPatcher.Patches.Dynamic @@ -12,8 +8,6 @@ namespace NebulaPatcher.Patches.Dynamic [HarmonyPatch(typeof(UIEscMenu))] class UIEscMenu_Patch { - private static RectTransform hostGameButton; - [HarmonyPrefix] [HarmonyPatch("_OnOpen")] public static void _OnOpen_Prefix(UIEscMenu __instance) @@ -25,29 +19,6 @@ public static void _OnOpen_Prefix(UIEscMenu __instance) // Disable load game button if in a multiplayer session Button loadGameWindowButton = AccessTools.Field(typeof(UIEscMenu), "button3").GetValue(__instance) as Button; SetButtonEnableState(loadGameWindowButton, !SimulatedWorld.Initialized); - - // If we are in a multiplayer game already make sure to hide the host game button - if (SimulatedWorld.Initialized) - { - hostGameButton?.gameObject.SetActive(false); - return; - } - - if (hostGameButton != null) - { - hostGameButton.gameObject.SetActive(true); - hostGameButton.GetComponentInChildren().text = "Host Game"; - return; - } - - RectTransform buttonTemplate = GameObject.Find("Esc Menu/button (6)").GetComponent(); - hostGameButton = Object.Instantiate(buttonTemplate, buttonTemplate.parent, false); - hostGameButton.name = "button-host-game"; - hostGameButton.anchoredPosition = new Vector2(buttonTemplate.anchoredPosition.x, buttonTemplate.anchoredPosition.y - buttonTemplate.sizeDelta.y * 2); - hostGameButton.GetComponentInChildren().text = "Host Game"; - - hostGameButton.GetComponent