using System; using System.Collections; using System.Collections.Generic; //using OccaSoftware.Altos; using PixelCrushers; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.Events; using UnityEngine.Video; namespace Beyond { [RequireComponent(typeof(BoxCollider))] public class VideoCutsceneTrigger : Saver { [SerializeField] private VideoCutsceneController m_videoCutsceneController; [SerializeField] private VideoClip m_cutsceneVideoClip; [SerializeField] private bool m_DisableTriggerOnFinish; [SerializeField] private UnityEvent m_onCutSceneEnd; [SerializeField] private CutsceneLevelLoader m_cutsceneLevelLoader = new CutsceneLevelLoader(); [SerializeField] private bool m_playOnStart = false; public TeleportObject m_teleportAfterCutScene; public bool m_skipFadeIn; public bool m_skipFadeOut = false; private bool m_wasPlayed; public bool m_dontEnableUI = false; private bool m_appliedData = false; public bool WasPlayed { set => m_wasPlayed = value; get => m_wasPlayed; } private Collider m_collider; public override void OnEnable() { base.OnEnable(); m_collider = GetComponent(); if (m_videoCutsceneController == null) m_videoCutsceneController = VideoCutsceneController.Instance; m_videoCutsceneController.OnVideoEnd.AddListener(Teleport); m_videoCutsceneController.OnVideoEnd.AddListener(OnCutSceneEnd); m_videoCutsceneController.OnVideoEnd.AddListener(DisableTrigger); if (m_cutsceneLevelLoader.Enabled) { m_videoCutsceneController.OnVideoEnd.AddListener(m_cutsceneLevelLoader.LoadLevel); } } public override void Start() { base.Start(); //if (m_playOnStart && !m_wasPlayed) //{ // Debug.LogError("s playing " + m_wasPlayed); // if (MusicManager.instance) // { // MusicManager.instance.MuteMusic(); // } // m_collider.enabled = false; // m_videoCutsceneController.m_dontEnableUI = m_dontEnableUI; // m_videoCutsceneController.PlayVideo(m_cutsceneVideoClip); // m_wasPlayed = true; //} StartCoroutine(TryToStartVideoCoroutine()); } private IEnumerator TryToStartVideoCoroutine() { yield return new WaitUntil(() => m_appliedData || Time.timeSinceLevelLoad > 1f); //yield return new WaitForSecondsRealtime(1f); // yield return new WaitForEndOfFrame(); // yield return new WaitForEndOfFrame(); if (m_playOnStart && !m_wasPlayed) { if (MusicManager.instance) { MusicManager.instance.MuteMusic(); } m_collider.enabled = false; m_videoCutsceneController.m_dontEnableUI = m_dontEnableUI; m_videoCutsceneController.PlayVideo(m_cutsceneVideoClip); m_wasPlayed = true; } else if (m_wasPlayed) { m_collider.enabled = false; } } public override void OnDisable() { base.OnDisable(); m_videoCutsceneController.OnVideoEnd.RemoveListener(Teleport); m_videoCutsceneController.OnVideoEnd.RemoveListener(DisableTrigger); if (m_cutsceneLevelLoader.Enabled) { m_videoCutsceneController.OnVideoEnd.RemoveListener(m_cutsceneLevelLoader.LoadLevel); } } private void OnTriggerEnter(Collider other) { m_videoCutsceneController.m_skipFadeIn = m_skipFadeIn; m_videoCutsceneController.m_skipFadeOut = m_skipFadeOut; if (other.tag == "Player" && !m_wasPlayed) { if (MusicManager.instance) { MusicManager.instance.MuteMusic(); } m_collider.enabled = false; m_videoCutsceneController.PlayVideo(m_cutsceneVideoClip); m_wasPlayed = true; } } private void DisableTrigger() { if (m_DisableTriggerOnFinish) { gameObject.SetActive((false)); } } private void Teleport() { m_teleportAfterCutScene.Teleport(); } private void OnCutSceneEnd() { if (MusicManager.instance != null) MusicManager.instance.UnmuteMusic(); m_videoCutsceneController.OnVideoEnd.RemoveListener(OnCutSceneEnd); m_onCutSceneEnd?.Invoke(); } public override string RecordData() { CutsceneSaveData data = new(); data.wasPlayed = WasPlayed; return SaveSystem.Serialize(data); } public override void ApplyData(string s) { m_appliedData = true; var sd = SaveSystem.Deserialize(s); if (sd != null) { WasPlayed = sd.wasPlayed; } } } [Serializable, Toggle("Enabled")] public class CutsceneLevelLoader { public bool Enabled; public string LevelName; public string SpawnPointName; public void LoadLevel() { if (String.IsNullOrEmpty(LevelName)) { Debug.LogError("There is no scene name to load"); return; } if (String.IsNullOrEmpty(SpawnPointName)) { //SaveSystem.LoadScene(LevelName); ProxySceneLoader.LoadScene(LevelName); return; } //SaveSystem.LoadScene($"{LevelName}@{SpawnPointName}"); ProxySceneLoader.LoadScene($"{LevelName}@{SpawnPointName}"); } } }