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.

115 lines
3.0 KiB

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