public static void Save(string SaveNameArg) { Directory SaveDir = new Directory(); if (SaveDir.DirExists($"user://Saves/{SaveNameArg}")) { System.IO.Directory.Delete($"{OS.GetUserDataDir()}/Saves/{SaveNameArg}", true); } SaveDir.MakeDirRecursive($"user://Saves/{SaveNameArg}/Chunks"); SavedMeta Meta = new SavedMeta(TimeOfDay); string SerializedMeta = Newtonsoft.Json.JsonConvert.SerializeObject(Meta, Newtonsoft.Json.Formatting.Indented); System.IO.File.WriteAllText($"{OS.GetUserDataDir()}/Saves/{SaveNameArg}/Meta.json", SerializedMeta); int SaveCount = 0; foreach (KeyValuePair <System.Tuple <int, int>, ChunkClass> Chunk in Chunks) { SaveCount += SaveChunk(Chunk.Key, SaveNameArg); } Console.Log($"Saved {SaveCount.ToString()} structures to save '{SaveNameArg}'"); }
public static bool Load(string SaveNameArg) { if (string.IsNullOrEmpty(SaveNameArg) || string.IsNullOrWhiteSpace(SaveNameArg)) { throw new Exception("Invalid save name passed to World.Load"); } if (!IsOpen) { throw new Exception("The world must be open to load a savefile"); } Directory SaveDir = new Directory(); if (SaveDir.DirExists($"user://Saves/{SaveNameArg}")) { string MetaPath = $"{OS.GetUserDataDir()}/Saves/{SaveNameArg}/Meta.json"; if (SaveDir.FileExists(MetaPath)) { string SerializedMeta = System.IO.File.ReadAllText(MetaPath); SavedMeta Meta = Newtonsoft.Json.JsonConvert.DeserializeObject <SavedMeta>(SerializedMeta); TimeOfDay = Clamp(Meta.TimeOfDay, 0, 60f * DayNightMinutes); } Clear(); Net.SteelRpc(Self, nameof(RequestClear)); DefaultPlatforms(); bool ChunksDir = false; if (SaveDir.DirExists($"user://Saves/{SaveNameArg}/Chunks")) { SaveDir.Open($"user://Saves/{SaveNameArg}/Chunks"); ChunksDir = true; } else { SaveDir.Open($"user://Saves/{SaveNameArg}"); } SaveDir.ListDirBegin(true, true); int PlaceCount = 0; while (true) { string FileName = SaveDir.GetNext(); if (FileName.Empty()) { //Iterated through all files break; } string Path; if (ChunksDir) { Path = $"{OS.GetUserDataDir()}/Saves/{SaveNameArg}/Chunks/{FileName}"; } else { Path = $"{OS.GetUserDataDir()}/Saves/{SaveNameArg}/{FileName}"; } Tuple <bool, int> Returned = LoadChunk(System.IO.File.ReadAllText(Path)); PlaceCount += Returned.Item2; if (!Returned.Item1) { Console.ThrowLog($"Invalid chunk file {FileName} loading save '{SaveNameArg}'"); } } SaveName = SaveNameArg; Console.Log($"Loaded {PlaceCount.ToString()} structures from save '{SaveNameArg}'"); return(true); } else { SaveName = null; Console.ThrowLog($"Failed to load save '{SaveNameArg}' as it does not exist"); return(false); } }
public static bool Load(string SaveNameArg) { if (string.IsNullOrEmpty(SaveNameArg) || string.IsNullOrWhiteSpace(SaveNameArg)) { throw new Exception("Invalid save name passed to World.Load"); } if (!IsOpen) { throw new Exception("The world must be open to load a savefile"); } Directory SaveDir = new Directory(); if (SaveDir.DirExists($"user://Saves/{SaveNameArg}")) { string MetaPath = $"{OS.GetUserDataDir()}/Saves/{SaveNameArg}/Meta.json"; if (SaveDir.FileExists(MetaPath)) { string SerializedMeta = System.IO.File.ReadAllText(MetaPath); SavedMeta Meta = Newtonsoft.Json.JsonConvert.DeserializeObject <SavedMeta>(SerializedMeta); TimeOfDay = Clamp(Meta.TimeOfDay, 0, 60f * DayNightMinutes); } Clear(); Net.SteelRpc(Self, nameof(RequestClear)); DefaultPlatforms(); bool ChunksDir = false; if (SaveDir.DirExists($"user://Saves/{SaveNameArg}/Chunks")) { SaveDir.Open($"user://Saves/{SaveNameArg}/Chunks"); ChunksDir = true; } else { SaveDir.Open($"user://Saves/{SaveNameArg}"); } SaveDir.ListDirBegin(true, true); int PlaceCount = 0; while (true) { string FileName = SaveDir.GetNext(); if (FileName.Empty()) { //Iterated through all files break; } string Path; if (ChunksDir) { Path = $"{OS.GetUserDataDir()}/Saves/{SaveNameArg}/Chunks/{FileName}"; } else { Path = $"{OS.GetUserDataDir()}/Saves/{SaveNameArg}/{FileName}"; } LoadChunk(System.IO.File.ReadAllText(Path)); //TODO: Try catch } SaveName = SaveNameArg; Console.Log($"Loaded {PlaceCount.ToString()} structures from save '{SaveNameArg}'"); //TODO: Save/load player data in savefile Net.Players.Add(Self.GetTree().GetNetworkUniqueId(), new Net.PlayerData()); if (Net.DedicatedServer) { Net.Nicknames[Net.ServerId] = "DedicatedServer"; } else { Net.Nicknames[Net.ServerId] = Game.Nickname; Game.SpawnPlayer(Self.GetTree().GetNetworkUniqueId(), true); } return(true); } else { SaveName = null; Console.ThrowLog($"Failed to load save '{SaveNameArg}' as it does not exist"); return(false); } }