// ~~~~~ Loading ~~~~~ internal static SL_CharacterSaveData[] TryLoadSaveData(CharSaveType type) { try { var savePath = GetCurrentSavePath(type); if (!File.Exists(savePath)) { return(null); } using (var file = File.OpenRead(savePath)) { var serializer = Serializer.GetXmlSerializer(typeof(SL_CharacterSaveData[])); var list = new List <SL_CharacterSaveData>(); if (serializer.Deserialize(file) is SL_CharacterSaveData[] array) { foreach (var entry in array) { if (CustomCharacters.Templates.TryGetValue(entry.TemplateUID, out SL_Character template)) { // if template was changed to temporary, ignore the save data. if (template.SaveType == CharSaveType.Temporary) { continue; } // update save data type to template current type if (entry.SaveType != template.SaveType) { entry.SaveType = template.SaveType; } list.Add(entry); } } } return(list.ToArray()); } } catch (Exception ex) { SL.Log("Exception loading SL_Characters!"); SL.Log(ex.ToString()); return(new SL_CharacterSaveData[0]); } }
internal static string GetCurrentSavePath(CharSaveType saveType) { string folder = SLSaveManager.GetSaveFolderForWorldHost(); if (string.IsNullOrEmpty(folder)) { throw new Exception("Trying to save world host SL_Characters, but couldn't get a folder!"); } var saveFolder = $@"{folder}\{SLSaveManager.CHARACTERS_FOLDER}"; return(saveType == CharSaveType.Scene ? saveFolder + $@"\{SceneManager.GetActiveScene().name}.chardata" : saveFolder + $@"\followers.chardata"); }
private static void SaveCharacterList(SL_CharacterSaveData[] list, CharSaveType type) { var savePath = GetCurrentSavePath(type); if (File.Exists(savePath)) { File.Delete(savePath); } if (list == null || list.Length < 1) { return; } using (var file = File.Create(savePath)) { var serializer = Serializer.GetXmlSerializer(typeof(SL_CharacterSaveData[])); serializer.Serialize(file, list); } }