private static void PopulateSavesMetadata() { if (!Directory.Exists(SavesDirectory)) { Directory.CreateDirectory(SavesDirectory); return; } var path = $"{SavesDirectory}\\SavesMetadata.json"; if (!File.Exists(path)) { return; } try { var json = File.ReadAllText(path); var metadata = JSONParser.FromJson <SaveFileMeta[]>(json); SavesMetadata.AddRange(metadata); } catch (Exception e) { Debug.LogWarning("[ProperSave] SavesMetadata file corrupted."); } }
private static void SaveGame() { Save = new SaveData(); var metadata = SaveFileMeta.CreateCurrentMetadata(); var foundMetadata = GetLobbySaveMetadata(); Save.SaveFileMeta = foundMetadata ?? metadata; if (string.IsNullOrEmpty(Save.SaveFileMeta.FileName)) { do { Save.SaveFileMeta.FileName = Guid.NewGuid().ToString(); }while (File.Exists(Save.SaveFileMeta.FilePath)); } try { var json = JSONWriter.ToJson(Save); File.WriteAllText(Save.SaveFileMeta.FilePath, json); if (ReferenceEquals(Save.SaveFileMeta, metadata)) { SavesMetadata.Add(metadata); UpdateSavesMetadata(); } Chat.AddMessage(Language.GetString(LanguageConsts.PS_CHAT_SAVE)); } catch (Exception e) { Debug.LogWarning("[ProperSave] Couldn't save game"); } }
private static SaveFileMeta GetLobbySaveMetadata(NetworkUser exceptUser = null) { var users = NetworkUser.readOnlyInstancesList.Select(el => el.Network_id.steamId.value).ToList(); if (exceptUser != null) { users.Remove(exceptUser.Network_id.steamId.value); } var usersCount = users.Count(); if (usersCount == 0) { return(null); } var gameMode = PreGameController.instance ? PreGameController.instance.gameModeIndex : Run.instance ? Run.instance.gameModeIndex : GameModeIndex.Invalid; if (gameMode == GameModeIndex.Invalid) { return(null); } if (usersCount == 1) { var profile = LocalUserManager.readOnlyLocalUsersList[0].userProfile.fileName.Replace(".xml", ""); return(SavesMetadata.FirstOrDefault(el => el.UserProfileId == profile && el.SteamIds.Length == 1 && el.GameMode == gameMode)); } return(SavesMetadata.FirstOrDefault(el => el.SteamIds.DifferenceCount(users) == 0 && el.GameMode == gameMode)); }
private void RegisterGameSaving() { //Save game after stage is loaded On.RoR2.Stage.Start += (orig, self) => { orig(self); if (FirstRunStage) { FirstRunStage = false; return; } SaveGame(); }; //Delete save file when run is over On.RoR2.GameOverController.Awake += (orig, self) => { orig(self); try { var metadata = Save?.SaveFileMeta; if (metadata != null) { File.Delete(metadata.FilePath); SavesMetadata.Remove(metadata); UpdateSavesMetadata(); Save = null; } } catch (Exception e) { Debug.LogError(e); } }; //Save stage RNG before it changed On.RoR2.Run.GenerateStageRNG += (orig, self) => { PreStageRng = new RunRngData(Run.instance); orig(self); }; }