You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
3.9 KiB

  1. using IPA.Config;
  2. using IPA.Loader.Composite;
  3. using IPA.Utilities;
  4. using IPA.Utilities.Async;
  5. using System.Diagnostics.CodeAnalysis;
  6. using UnityEngine;
  7. using UnityEngine.SceneManagement;
  8. // ReSharper disable UnusedMember.Local
  9. namespace IPA.Loader
  10. {
  11. [SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")]
  12. internal class PluginComponent : MonoBehaviour
  13. {
  14. private CompositeBSPlugin bsPlugins;
  15. private CompositeIPAPlugin ipaPlugins;
  16. private bool quitting;
  17. public static PluginComponent Instance;
  18. private static bool initialized = false;
  19. internal static PluginComponent Create()
  20. {
  21. return Instance = new GameObject("IPA_PluginManager").AddComponent<PluginComponent>();
  22. }
  23. internal void Awake()
  24. {
  25. DontDestroyOnLoad(gameObject);
  26. if (!initialized)
  27. {
  28. UnityGame.SetMainThread();
  29. UnityGame.EnsureRuntimeGameVersion();
  30. PluginManager.Load();
  31. bsPlugins = new CompositeBSPlugin(PluginManager.BSMetas);
  32. #pragma warning disable 618
  33. ipaPlugins = new CompositeIPAPlugin(PluginManager.Plugins);
  34. #pragma warning restore 618
  35. /*
  36. #if BeatSaber // TODO: remove this
  37. gameObject.AddComponent<Updating.BeatMods.Updater>();
  38. #endif
  39. */
  40. bsPlugins.OnEnable();
  41. ipaPlugins.OnApplicationStart();
  42. SceneManager.activeSceneChanged += OnActiveSceneChanged;
  43. SceneManager.sceneLoaded += OnSceneLoaded;
  44. SceneManager.sceneUnloaded += OnSceneUnloaded;
  45. var unitySched = UnityMainThreadTaskScheduler.Default as UnityMainThreadTaskScheduler;
  46. if (!unitySched.IsRunning)
  47. StartCoroutine(unitySched.Coroutine());
  48. initialized = true;
  49. #if DEBUG
  50. Config.Stores.GeneratedStoreImpl.DebugSaveAssembly("GeneratedAssembly.dll");
  51. #endif
  52. }
  53. }
  54. internal void Update()
  55. {
  56. bsPlugins.OnUpdate();
  57. ipaPlugins.OnUpdate();
  58. var unitySched = UnityMainThreadTaskScheduler.Default as UnityMainThreadTaskScheduler;
  59. if (!unitySched.IsRunning)
  60. StartCoroutine(unitySched.Coroutine());
  61. }
  62. internal void LateUpdate()
  63. {
  64. bsPlugins.OnLateUpdate();
  65. ipaPlugins.OnLateUpdate();
  66. }
  67. internal void FixedUpdate()
  68. {
  69. bsPlugins.OnFixedUpdate();
  70. ipaPlugins.OnFixedUpdate();
  71. }
  72. internal void OnDestroy()
  73. {
  74. if (!quitting)
  75. {
  76. Create();
  77. }
  78. }
  79. internal void OnApplicationQuit()
  80. {
  81. SceneManager.activeSceneChanged -= OnActiveSceneChanged;
  82. SceneManager.sceneLoaded -= OnSceneLoaded;
  83. SceneManager.sceneUnloaded -= OnSceneUnloaded;
  84. bsPlugins.OnApplicationQuit();
  85. ipaPlugins.OnApplicationQuit();
  86. ConfigRuntime.ShutdownRuntime(); // this seems to be needed
  87. quitting = true;
  88. }
  89. internal void OnLevelWasLoaded(int level)
  90. {
  91. ipaPlugins.OnLevelWasLoaded(level);
  92. }
  93. internal void OnLevelWasInitialized(int level)
  94. {
  95. ipaPlugins.OnLevelWasInitialized(level);
  96. }
  97. private void OnSceneLoaded(Scene scene, LoadSceneMode sceneMode)
  98. {
  99. bsPlugins.OnSceneLoaded(scene, sceneMode);
  100. }
  101. private void OnSceneUnloaded(Scene scene) {
  102. bsPlugins.OnSceneUnloaded(scene);
  103. }
  104. private void OnActiveSceneChanged(Scene prevScene, Scene nextScene) {
  105. bsPlugins.OnActiveSceneChanged(prevScene, nextScene);
  106. }
  107. }
  108. }