public static void TestWeakReferencePauseLock() { AsyncUtils.RunWithExceptionHandling(async() => { object lockObject = new object(); WeakReference untypedWeakReference = new WeakReference(lockObject); LockPauseModule.PauseGame(PauseLockType.AllowMenu, untypedWeakReference); Debug.Log("Untyped lock added!"); await Task.Delay(3000); AsyncUtils.ThrowIfEditorStopped(); lockObject = null; CoreUtils.CollectGarbage(false); Debug.Log("Untyped lock released!"); await Task.Yield(); AsyncUtils.ThrowIfEditorStopped(); LockPauseModule.ForceCleanLocks(); Debug.Log("Locks cleaned!"); await Task.Delay(5000); AsyncUtils.ThrowIfEditorStopped(); IEnumerable typedLockObject = new string[] { "lol", "hi" }; WeakReference <IEnumerable> typedWeakReference = new WeakReference <IEnumerable>(typedLockObject); LockPauseModule.PauseGame(PauseLockType.AllowMenu, typedWeakReference); Debug.Log("Typed lock added!"); await Task.Delay(3000); AsyncUtils.ThrowIfEditorStopped(); typedLockObject = null; CoreUtils.CollectGarbage(false); Debug.Log("Typed lock released!"); await Task.Yield(); AsyncUtils.ThrowIfEditorStopped(); LockPauseModule.ForceCleanLocks(); Debug.Log("Locks cleaned!"); }); }
/// <summary> /// Immediately begin loading the scene /// </summary> void Start() { //the loading screen cannot be truly skipped, but it can be hidden if (!MetaState.Instance.SkipLoadingScreen) { //appear the overlay DefaultLoadingCanvas.gameObject.SetActive(true); } CoreUtils.CollectGarbage(false); Application.logMessageReceived += HandleLog; try { if (MetaState.Instance.TransitionType == SceneTransitionType.ChangeScene) { MetaState.Instance.IntentsExecuteLoading(); MetaState.Instance.IntentsRemoveInvalid(); //we are merely changing scenes, go straight to loading the next scene GameState.Instance.CurrentScene = MetaState.Instance.NextScene; ScriptingModule.CallHooked(ScriptHook.OnSceneTransition, this); StartCoroutine(LoadNextSceneAsync()); } else if (MetaState.Instance.TransitionType == SceneTransitionType.LoadGame) { //we are loading a game, so load the game data and then load the next scene (which is part of save data) GameState.DeserializeFromFile(CoreParams.SavePath + Path.DirectorySeparatorChar + MetaState.Instance.LoadSave); PersistState.Instance.LastCampaignIdentifier = GameState.Instance.CampaignIdentifier; MetaState.Instance.NextScene = GameState.Instance.CurrentScene; ScriptingModule.CallHooked(ScriptHook.OnGameLoad, this); StartCoroutine(LoadNextSceneAsync()); } else if (MetaState.Instance.TransitionType == SceneTransitionType.NewGame) { string sceneOverride = MetaState.Instance.NextScene; GameState.Recreate(); MetaState.Instance.Clear(); MetaState.Instance.NextScene = string.IsNullOrEmpty(sceneOverride) ? CoreParams.InitialScene : sceneOverride; GameState.LoadInitial(); PersistState.Instance.LastCampaignIdentifier = GameState.Instance.CampaignIdentifier; GameState.Instance.CurrentScene = MetaState.Instance.NextScene; CCBase.OnGameStart(); StartCoroutine(LoadNextSceneAsync()); } else if (MetaState.Instance.TransitionType == SceneTransitionType.EndGame) { CCBase.OnGameEnd(); GameState.Clear(); MetaState.Instance.Clear(); if (string.IsNullOrEmpty(MetaState.Instance.NextScene)) { MetaState.Instance.NextScene = CoreParams.MainMenuScene; } StartCoroutine(LoadNextSceneAsync()); } } catch (Exception e) { //pokemon exception handling Debug.LogError($"Error loading scene ({e.GetType().Name})"); if (ConfigState.Instance.UseVerboseLogging) { Debug.LogException(e); } Modal.PushConfirmModal(string.Format("{0}\n{1}", e.ToString(), e.StackTrace), "Error loading scene", "Exit", "Return", null, OnErrorConfirmed); } //clear certain metagamestate on use MetaState.Instance.SkipLoadingScreen = false; ScriptingModule.CallHooked(ScriptHook.OnLoadingSceneOpen, this); }