예제 #1
0
    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}'");
    }
예제 #2
0
    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);
        }
    }
예제 #3
0
    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);
        }
    }