static void Prefix(ObjectMovementController __instance) { byte[] payload = new byte[] { }; payload.AddToArray((byte)OpCode.ObjectDeleted); var spawnable = __instance.HighlightedObject.GetSpawnableFromSpawned(); var objectSaveData = new GameObjectSaveData { Id = spawnable.Prefab.name, bundleName = spawnable.BundleName, position = new SerializableVector3(__instance.SelectedObject.transform.position), rotation = new SerializableQuaternion(__instance.SelectedObject.transform.rotation), localScale = new SerializableVector3(__instance.SelectedObject.transform.localScale) }; foreach (var settings in spawnable.Settings) { var settingsSaveData = settings.ConvertToSaveSettings(); if (settingsSaveData != null) { objectSaveData.settings.Add(settingsSaveData); } } payload.AddRangeToArray(objectSaveData.SerializeToBytes()); Main.pluginInfo.SendMessage(Main.pluginInfo, payload, true); }
public void SaveCurrentSpawnables(string fileName) { var levelConfigToSave = new LevelSaveData { levelHash = LevelManager.Instance.currentLevel.hash, levelName = LevelManager.Instance.currentLevel.name, dateModified = DateTime.Now, }; var spawnedItems = SpawnableManager.SpawnedObjects; if (spawnedItems == null || !spawnedItems.Any()) { return; } foreach (var spawnable in spawnedItems) { var instance = spawnable.SpawnedInstance; var objectSaveData = new GameObjectSaveData { Id = instance.name, bundleName = spawnable.BundleName, position = new SerializableVector3(instance.transform.position), rotation = new SerializableQuaternion(instance.transform.rotation), localScale = new SerializableVector3(instance.transform.localScale) }; foreach (var settings in spawnable.Settings) { var settingsSaveData = settings.ConvertToSaveSettings(); if (settingsSaveData != null) { objectSaveData.settings.Add(settingsSaveData); } } levelConfigToSave.gameObjects.Add(objectSaveData); } string json = JsonConvert.SerializeObject(levelConfigToSave, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }); var currentSaveDir = Path.Combine(SaveDir, levelConfigToSave.levelName); if (!Directory.Exists(currentSaveDir)) { Directory.CreateDirectory(currentSaveDir); } File.WriteAllText(Path.Combine(currentSaveDir, $"{fileName}.json"), json); }
public void LoadAllSaves() { if (!Directory.Exists(SaveDir)) { Directory.CreateDirectory(SaveDir); return; } if (LoadedSaves == null) { LoadedSaves = new List <LevelSaveData>(); } else { LoadedSaves.Clear(); } var saveFiles = Directory.GetFiles(SaveDir, "*.json", SearchOption.AllDirectories); if (saveFiles.Any()) { foreach (var saveFile in saveFiles) { var content = File.ReadAllText(saveFile); if (string.IsNullOrEmpty(content)) { continue; } try { var loadedLevelSave = JsonConvert.DeserializeObject <LevelSaveData>(content, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }); loadedLevelSave.filePath = saveFile; loadedLevelSave.fileName = Path.GetFileNameWithoutExtension(saveFile); LoadedSaves.Add(loadedLevelSave); continue; } catch (Exception ex) { UnityModManager.Logger.Log($"XLObjectDropper: Unable to deserialize {saveFile}. Will attempt legacy deserialization."); } try { var loadedLegacySave = JsonConvert.DeserializeObject <List <LegacyGameObjectSaveData> >(content); var loadedLevelSave = new LevelSaveData(); loadedLevelSave.isLegacy = true; loadedLevelSave.filePath = saveFile; loadedLevelSave.fileName = Path.GetFileNameWithoutExtension(saveFile); foreach (var gameObject in loadedLegacySave) { var saveData = new GameObjectSaveData { Id = gameObject.objectName, position = new SerializableVector3(gameObject.posX, gameObject.posY, gameObject.posZ), localScale = new SerializableVector3(gameObject.scaleX, gameObject.scaleY, gameObject.scaleZ) }; var tmpQuat = Quaternion.Euler(gameObject.rotX, gameObject.rotY, gameObject.rotZ); saveData.rotation = new SerializableQuaternion(tmpQuat.x, tmpQuat.y, tmpQuat.z, tmpQuat.w); loadedLevelSave.gameObjects.Add(saveData); } LoadedSaves.Add(loadedLevelSave); } catch (Exception ex) { UnityModManager.Logger.Log($"XLObjectDropper: Unable to deserialize {saveFile} using legacy deserialization."); } } } }