BSEvents.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using SongLoaderPlugin;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using UnityEngine;
  9. using UnityEngine.SceneManagement;
  10. namespace SongBrowser.Internals
  11. {
  12. class BSEvents : MonoBehaviour
  13. {
  14. static BSEvents Instance;
  15. //Scene Events
  16. public static event Action menuSceneLoaded;
  17. public static event Action menuSceneLoadedFresh;
  18. public static event Action gameSceneActive;
  19. public static event Action gameSceneLoaded;
  20. public static event Action songPaused;
  21. public static event Action songUnpaused;
  22. public static event Action songRestarted; // TODO
  23. public static event Action songSelected; // TODO
  24. public static event Action difficultySelected; // TODO
  25. public static event Action gameModeSelected; // TODO
  26. const string Menu = "MenuCore";
  27. const string Game = "GameCore";
  28. const string EmptyTransition = "EmptyTransition";
  29. public static void OnLoad()
  30. {
  31. if (Instance != null) return;
  32. GameObject go = new GameObject("BSSceneManager");
  33. go.AddComponent<BSEvents>();
  34. }
  35. private void Awake()
  36. {
  37. if (Instance != null) return;
  38. Instance = this;
  39. SceneManager.activeSceneChanged += SceneManagerOnActiveSceneChanged;
  40. DontDestroyOnLoad(gameObject);
  41. }
  42. private void SceneManagerOnActiveSceneChanged(Scene arg0, Scene arg1)
  43. {
  44. try
  45. {
  46. if (arg1.name == Game)
  47. {
  48. InvokeSafe(gameSceneActive);
  49. var sceneManager = Resources.FindObjectsOfTypeAll<GameScenesManager>().FirstOrDefault();
  50. if (sceneManager != null)
  51. {
  52. sceneManager.transitionDidFinishEvent -= GameSceneSceneWasLoaded; // make sure we don't ever subscribe twice
  53. sceneManager.transitionDidFinishEvent += GameSceneSceneWasLoaded;
  54. }
  55. }
  56. else if (arg1.name == Menu)
  57. {
  58. if (arg0.name == EmptyTransition)
  59. {
  60. StartCoroutine(WaitForMenuToLoad());
  61. }
  62. else
  63. {
  64. InvokeSafe(menuSceneLoaded);
  65. }
  66. }
  67. }
  68. catch (Exception e)
  69. {
  70. Console.WriteLine("[BSEvents] " + e);
  71. }
  72. }
  73. private void GameSceneSceneWasLoaded()
  74. {
  75. // Prevent firing this event when returning to menu
  76. Resources.FindObjectsOfTypeAll<GameScenesManager>().First().transitionDidFinishEvent -= GameSceneSceneWasLoaded;
  77. var pauseManager = Resources.FindObjectsOfTypeAll<GamePauseManager>().First();
  78. pauseManager.GetPrivateField<Signal>("_gameDidResumeSignal").Subscribe(delegate () { InvokeSafe(songUnpaused); });
  79. pauseManager.GetPrivateField<Signal>("_gameDidPauseSignal").Subscribe(delegate () { InvokeSafe(songPaused); });
  80. InvokeSafe(gameSceneLoaded);
  81. }
  82. private IEnumerator WaitForMenuToLoad()
  83. {
  84. List<Scene> menuScenes = new List<Scene>() { SceneManager.GetSceneByName("MenuCore"), SceneManager.GetSceneByName("MenuViewControllers"), SceneManager.GetSceneByName("MainMenu") };
  85. yield return new WaitUntil(() => { return menuScenes.All(x => x.isLoaded); });
  86. Console.WriteLine($"[BSEvents] Loaded {menuScenes.Count(x => x.isLoaded)} scenes out of {menuScenes.Count}: {string.Join(", ", menuScenes.Where(x => x.isLoaded).Select(x => x.name))}");
  87. InvokeSafe(menuSceneLoadedFresh);
  88. }
  89. public void InvokeSafe(Action action, params object[] args)
  90. {
  91. if (action == null) return;
  92. foreach (Delegate invoc in action.GetInvocationList())
  93. {
  94. try
  95. {
  96. invoc?.DynamicInvoke(args);
  97. }
  98. catch (Exception e)
  99. {
  100. Console.WriteLine($"Caught Exception when executing event");
  101. Console.WriteLine(e);
  102. }
  103. }
  104. }
  105. }
  106. }