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