/// <summary>
        /// Generates a snapshot of the world
        /// </summary>
        private SaveData CreateRuntimeSaveData()
        {
            var entities = generator.SpawnedEntities;
            var saveList = new EntitySaveData[entities.Length];

            for (var i = 0; i < entities.Length; ++i)
            {
                var entity    = entities[i];
                var transform = entity.Transform;

                var saveData = new EntitySaveData {
                    id       = entity.AssetId.ToUInt(),
                    uniqueId = entity.UniqueId,
                    scale    = new Vector3Double(transform.localScale),
                    position = new Vector3Double(transform.position),
                    rotation = new QuaternionDouble(transform.rotation),
                    script   = entity.Script
                };
                saveList[i] = saveData;
            }

            var save = settingsData.CreateCopy();

            save.playerPosition = new Vector3Double(Player.Instance.position.ToVector3());
            save.entities       = saveList;

            SaveExtensions.SetStringValue(ref save, "game-manager-script", engine.Script.code);

            return(save);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Creates a new save data from the current json save string
        /// </summary>
        /// <param name="jsonString">The json-style save string</param>
        private SaveData CreateFromSaveString(string jsonString)
        {
            var saveList       = new EntitySaveData[0];
            var playerPosition = new Vector3Double();
            var stringNames    = new string[0];
            var stringValues   = new string[0];
            var numberNames    = new string[0];
            var numberValues   = new double[0];
            var boolNames      = new string[0];
            var boolValues     = new bool[0];

            if (!string.IsNullOrEmpty(jsonString))
            {
                var json       = LitJson.JsonMapper.ToObject(jsonString);
                var entityData = json["entities"];
                saveList = new EntitySaveData[entityData.Count];

                for (var i = 0; i < entityData.Count; ++i)
                {
                    var datum = entityData[i];

                    // Fetch the scripts from the save data
                    var scriptJson = datum["script"];
                    var scriptData = new LuaScript {
                        id         = (uint)scriptJson["id"],
                        code       = scriptJson["code"].GetString(),
                        properties = scriptJson.Keys.Contains("properties") ?
                                     ExtractScriptProperties(scriptJson["properties"]) : new ScriptProperty[0]
                    };

                    var saveData = new EntitySaveData {
                        id       = (uint)datum["id"],
                        uniqueId = datum["uniqueId"].GetString(),
                        type     = (int)datum["type"],
                        scale    = new Vector3Double((float)datum["scale"]["x"], (float)datum["scale"]["y"], (float)datum["scale"]["z"]),
                        position = new Vector3Double((float)datum["position"]["x"], (float)datum["position"]["y"], (float)datum["position"]["z"]),
                        rotation = new QuaternionDouble((float)datum["rotation"]["x"], (float)datum["rotation"]["y"], (float)datum["rotation"]["z"], (float)datum["rotation"]["w"]),
                        script   = scriptData
                    };

                    saveList[i] = saveData;
                }

                var keys = json.Keys;

                // Load the platyer position, if possible
                if (keys.Contains("playerPosition"))
                {
                    playerPosition.x = (double)json["playerPosition"]["x"];
                    playerPosition.y = (double)json["playerPosition"]["y"];
                    playerPosition.z = (double)json["playerPosition"]["z"];
                }

                // Load the metadata, if possible
                if (keys.Contains("stringNames"))
                {
                    stringNames = ExtractStrings(json["stringNames"]);
                }
                if (keys.Contains("numberNames"))
                {
                    numberNames = ExtractStrings(json["numberNames"]);
                }
                if (keys.Contains("boolNames"))
                {
                    boolNames = ExtractStrings(json["boolNames"]);
                }
                if (keys.Contains("stringValues"))
                {
                    stringValues = ExtractStrings(json["stringValues"]);
                }
                if (keys.Contains("numberValues"))
                {
                    numberValues = ExtractNumbers(json["numberValues"]);
                }
                if (keys.Contains("boolValues"))
                {
                    boolValues = ExtractBooleans(json["boolValues"]);
                }
            }

            return(new SaveData {
                entities = saveList,
                playerPosition = playerPosition,
                stringNames = stringNames,
                stringValues = stringValues,
                numberNames = numberNames,
                numberValues = numberValues,
                boolNames = boolNames,
                boolValues = boolValues
            });
        }