//UnityEvent.AddListener will tie the function to the monobehaviour object, //thus we need to create the lambdas outside of the instance or they will get //removed instantly (as the host class is destroyed on death) static void CreateLevelChange(float fadeoutTime, string targetLevel, int entryPoint, Vector3 camera) { Messaging.Player.Invulnerable.Invoke(true); Messaging.System.SetTimeScale.Invoke(TimeScale.Slowmo); Messaging.CameraControl.RemoveShake.Invoke(); Messaging.CameraControl.Spectator.Invoke(true); Messaging.CameraControl.TargetPosition.Invoke(camera); //Messaging.CameraControl.TargetRotation.Invoke(Random.value > .5f ? 90 : -90); GameObject fadeout = new GameObject("fadeout levelchange"); float timer = 0; UpdateCallHook u = fadeout.AddComponent <UpdateCallHook>(); u.OnUpdateCall.AddListener(() => { timer += Time.unscaledDeltaTime; float fade = timer / fadeoutTime; Messaging.GUI.Blackout.Invoke(Mathf.Clamp01(fade)); }); DestroyAfterTime d = fadeout.AddComponent <DestroyAfterTime>(); d.LifeTime = fadeoutTime + .1f; //small addition to let screen turn to fully black d.UseUnscaledTime = true; d.OnDestroy.AddListener(() => { Messaging.System.ChangeLevel.Invoke(targetLevel, entryPoint); }); }
private void Awake() { if (FadeTime == 0) { Debug.Log("\"" + gameObject.name + "\" -> FadeIn: disabled to avoid division by zero (fadetime == 0 || slowdowntime == 0)"); return; } Messaging.System.LevelLoaded.AddListener((i) => { if (i < 0) { return; } float timer = FadeTime; UpdateCallHook u = gameObject.AddComponent <UpdateCallHook>(); u.OnUpdateCall.AddListener(() => { timer -= Time.deltaTime; float fade = timer / FadeTime; Messaging.GUI.Blackout.Invoke(Mathf.Clamp01(fade)); }); DestroyAfterTime d = gameObject.AddComponent <DestroyAfterTime>(); d.LifeTime = FadeTime; d.UseUnscaledTime = false; d.OnDestroy.AddListener(() => { Messaging.GUI.Blackout.Invoke(0f); }); }); }
private void OnDeath() { Messaging.Player.Health.Invoke(0, 1); //Messaging.Player.Charge.Invoke(0, 1); //Messaging.Player.SoftDamage.Invoke(0); Messaging.CameraControl.RemoveShake.Invoke(); Messaging.System.SetTimeScale.Invoke(TimeScale.SuperSlowmo); Messaging.CameraControl.TargetRotation.Invoke(Random.value > .5f ? 90 : -90); //handle player info change instantly to make sure designator won't go ape shit SaveLoadSystem.SaveStash(); PlayerInfo.CurrentLocal.PlayerHasBeenInitialized = false; if (Difficulty.PermanentDeath) { SaveLoadSystem.DeletePlayerInfo(); } else { PlayerInfo.CurrentLocal.CurrentMap = SoftcoreDeathScene; SaveLoadSystem.SaveGame(); } float deathTimer = 0f; GameObject deadwaker = new GameObject("Dead Waker"); UpdateCallHook u = deadwaker.AddComponent <UpdateCallHook>(); u.OnUpdateCall.AddListener(() => { deathTimer += Time.unscaledDeltaTime; Messaging.GUI.Painflash.Invoke(1f); Messaging.GUI.Blackout.Invoke(deathTimer / 7f); if (deathTimer > 7f) { Destroy(deadwaker.gameObject); if (Difficulty.PermanentDeath) { UnityEngine.SceneManagement.SceneManager.LoadScene(HardcoreDeathScene); } else { Messaging.System.ChangeLevel.Invoke(SoftcoreDeathScene, 0); } } }); Messaging.Player.Death.Invoke(); }
private void OnTriggerEnter2D(Collider2D collision) { if (!Active) { return; } MonsterCharacter m = collision.GetComponent <MonsterCharacter>(); if (m == null) { return; } if (m.GetComponent <PlayerControls>() == null) { return; } OnPlayerTouch.Invoke(); //stop the player and make him invulnerable m.physicsBody.velocity = Vector2.zero; m.impulseVector = Vector2.zero; m.Invulnerable = true; m.enabled = false; //to avoid division by zero just change level instantly if (FadeoutTime == 0) { Messaging.GUI.Blackout.Invoke(0f); Messaging.System.ChangeLevel.Invoke(TargetLevel, EntryPoint); return; } GameObject fadeout = new GameObject("fadeout levelchange"); float timer = 0; UpdateCallHook u = fadeout.AddComponent <UpdateCallHook>(); u.OnUpdateCall.AddListener(() => { timer += Time.unscaledDeltaTime; float fade = timer / FadeoutTime; Messaging.GUI.Blackout.Invoke(Mathf.Clamp01(fade)); }); DestroyAfterTime d = fadeout.AddComponent <DestroyAfterTime>(); d.LifeTime = FadeoutTime + .1f; //small addition to let screen turn to fully black d.UseUnscaledTime = true; d.OnDestroy.AddListener(() => { /*Messaging.GUI.LoadingWindow.Invoke(() => * { * Messaging.System.ChangeLevel.Invoke(TargetLevel, EntryPoint); * });*/ Messaging.System.ChangeLevel.Invoke(TargetLevel, EntryPoint); }); if (TeleportEffect != null) { Instantiate(TeleportEffect, collision.transform.position, Quaternion.identity, LevelLoader.TemporaryObjects); Destroy(collision.gameObject); } }