using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.SceneManagement; public class ES3AutoSaveMgr : MonoBehaviour { public enum LoadEvent { None = 0, Awake = 1, Start = 2 } public enum SaveEvent { None = 0, OnApplicationQuit = 1, OnApplicationPause = 2 } public static ES3AutoSaveMgr _current; public string key = Guid.NewGuid().ToString(); public SaveEvent saveEvent = SaveEvent.OnApplicationQuit; public LoadEvent loadEvent = LoadEvent.Awake; public ES3SerializableSettings settings = new ES3SerializableSettings("AutoSave.es3", ES3.Location.Cache); public HashSet autoSaves = new HashSet(); public static ES3AutoSaveMgr Current { get { if (_current == null) { GameObject[] rootGameObjects = SceneManager.GetActiveScene().GetRootGameObjects(); GameObject[] array = rootGameObjects; foreach (GameObject gameObject in array) { if (gameObject.name == "Easy Save 3 Manager") { return _current = gameObject.GetComponent(); } } array = rootGameObjects; for (int i = 0; i < array.Length; i++) { if ((_current = array[i].GetComponentInChildren()) != null) { return _current; } } } return _current; } } public static ES3AutoSaveMgr Instance => Current; public void Save() { if (autoSaves == null || autoSaves.Count == 0) { return; } if (settings.location == ES3.Location.Cache && !ES3.FileExists(settings)) { ES3.CacheFile(settings); } if (autoSaves == null || autoSaves.Count == 0) { ES3.DeleteKey(key, settings); } else { List list = new List(); foreach (ES3AutoSave autoSafe in autoSaves) { if (autoSafe != null && autoSafe.enabled) { list.Add(autoSafe.gameObject); } } ES3.Save(key, list.OrderBy((GameObject x) => GetDepth(x.transform)).ToArray(), settings); } if (settings.location == ES3.Location.Cache && ES3.FileExists(settings)) { ES3.StoreCachedFile(settings); } } public void Load() { try { if (settings.location == ES3.Location.Cache && !ES3.FileExists(settings)) { ES3.CacheFile(settings); } } catch { } ES3.Load(key, new GameObject[0], settings); } private void Start() { if (loadEvent == LoadEvent.Start) { Load(); } } public void Awake() { GetAutoSaves(); if (loadEvent == LoadEvent.Awake) { Load(); } } private void OnApplicationQuit() { if (saveEvent == SaveEvent.OnApplicationQuit) { Save(); } } private void OnApplicationPause(bool paused) { if ((saveEvent == SaveEvent.OnApplicationPause || (Application.isMobilePlatform && saveEvent == SaveEvent.OnApplicationQuit)) && paused) { Save(); } } public static void AddAutoSave(ES3AutoSave autoSave) { if (Current != null) { Current.autoSaves.Add(autoSave); } } public static void RemoveAutoSave(ES3AutoSave autoSave) { if (Current != null) { Current.autoSaves.Remove(autoSave); } } public void GetAutoSaves() { autoSaves = new HashSet(); GameObject[] rootGameObjects = base.gameObject.scene.GetRootGameObjects(); foreach (GameObject gameObject in rootGameObjects) { autoSaves.UnionWith(gameObject.GetComponentsInChildren(includeInactive: true)); } } private static int GetDepth(Transform t) { int num = 0; while (t.parent != null) { t = t.parent; num++; } return num; } }