using System.Collections.Generic; using System.IO; using MSCLoader; using UnityEngine; namespace MSCO { /// /// Liest den Spielstand des Hosts und ersetzt beim Client den eigenen Spielstand /// vorübergehend. Der Spielstand des Clients wird vorher gesichert und beim /// nächsten Hauptmenü automatisch wiederhergestellt. /// public static class SaveSync { // Nur diese Dateien werden übertragen (options.txt etc. bleiben beim Spieler) public static readonly string[] Files = { "defaultES2File.txt", "items.txt", "meshsave.txt", "graveyard.txt", "notepad.txt" }; static string SaveDir { get { return Application.persistentDataPath; } } static string BackupDir { get { return Path.Combine(SaveDir, "MSCO_Backup"); } } static string Marker { get { return Path.Combine(BackupDir, "backup_active"); } } public static bool HasBackup { get { return File.Exists(Marker); } } public static List> ReadLocalSave() { var result = new List>(); foreach (string name in Files) { string path = Path.Combine(SaveDir, name); if (File.Exists(path)) result.Add(new KeyValuePair(name, File.ReadAllBytes(path))); } return result; } /// Eigenen Spielstand sichern (nur einmal) und die Spielstand-Dateien leeren. public static void BeginReceive() { if (!HasBackup) { Directory.CreateDirectory(BackupDir); foreach (string name in Files) { string path = Path.Combine(SaveDir, name); if (File.Exists(path)) File.Copy(path, Path.Combine(BackupDir, name), true); } File.WriteAllText(Marker, "MSCO backup of the client's own save. Restored automatically."); ModConsole.Print("[MSCO] Own save backed up to " + BackupDir); } DeleteSaveFiles(); } public static void WriteFile(string name, byte[] data) { // Nur bekannte Dateinamen erlauben, damit der Host nichts anderes überschreiben kann if (System.Array.IndexOf(Files, name) < 0) { ModConsole.Warning("[MSCO] Ignored unexpected save file: " + name); return; } File.WriteAllBytes(Path.Combine(SaveDir, name), data); } public static void RestoreBackup() { if (!HasBackup) return; DeleteSaveFiles(); foreach (string name in Files) { string backup = Path.Combine(BackupDir, name); if (File.Exists(backup)) File.Copy(backup, Path.Combine(SaveDir, name), true); } Directory.Delete(BackupDir, true); ModConsole.Print("[MSCO] Own save restored."); } static void DeleteSaveFiles() { foreach (string name in Files) { string path = Path.Combine(SaveDir, name); if (File.Exists(path)) File.Delete(path); } } } }