/// <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); }
/// <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 }); }