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.

154 lines
4.6 KiB

  1. using IPA.Loader.Composite;
  2. using System;
  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. internal static PluginComponent Create()
  16. {
  17. return new GameObject("IPA_PluginManager").AddComponent<PluginComponent>();
  18. }
  19. void Awake()
  20. {
  21. DontDestroyOnLoad(gameObject);
  22. bsPlugins = new CompositeBSPlugin(PluginManager.BSPlugins);
  23. #pragma warning disable CS0618 // Type or member is obsolete
  24. ipaPlugins = new CompositeIPAPlugin(PluginManager.Plugins);
  25. #pragma warning restore CS0618 // Type or member is obsolete
  26. gameObject.AddComponent<Updating.ModSaber.Updater>();
  27. bsPlugins.OnApplicationStart();
  28. ipaPlugins.OnApplicationStart();
  29. SceneManager.activeSceneChanged += OnActiveSceneChanged;
  30. SceneManager.sceneLoaded += OnSceneLoaded;
  31. SceneManager.sceneUnloaded += OnSceneUnloaded;
  32. foreach (var provider in PluginManager.configProviders)
  33. if (provider.Key.HasChanged)
  34. try
  35. {
  36. provider.Key.Save();
  37. }
  38. catch (Exception e)
  39. {
  40. Logging.Logger.log.Error("Error when trying to save config");
  41. Logging.Logger.log.Error(e);
  42. }
  43. }
  44. void Update()
  45. {
  46. bsPlugins.OnUpdate();
  47. ipaPlugins.OnUpdate();
  48. }
  49. void LateUpdate()
  50. {
  51. bsPlugins.OnLateUpdate();
  52. ipaPlugins.OnLateUpdate();
  53. foreach (var provider in PluginManager.configProviders)
  54. {
  55. if (provider.Key.HasChanged)
  56. try
  57. {
  58. provider.Key.Save();
  59. }
  60. catch (Exception e)
  61. {
  62. Logging.Logger.log.Error("Error when trying to save config");
  63. Logging.Logger.log.Error(e);
  64. }
  65. else if (provider.Key.LastModified > provider.Value.Value)
  66. {
  67. try
  68. {
  69. provider.Key.Load(); // auto reload if it changes
  70. provider.Value.Value = provider.Key.LastModified;
  71. }
  72. catch (Exception e)
  73. {
  74. Logging.Logger.log.Error("Error when trying to load config");
  75. Logging.Logger.log.Error(e);
  76. }
  77. }
  78. }
  79. }
  80. void FixedUpdate()
  81. {
  82. bsPlugins.OnFixedUpdate();
  83. ipaPlugins.OnFixedUpdate();
  84. }
  85. void OnDestroy()
  86. {
  87. if (!quitting)
  88. {
  89. Create();
  90. }
  91. }
  92. void OnApplicationQuit()
  93. {
  94. SceneManager.activeSceneChanged -= OnActiveSceneChanged;
  95. SceneManager.sceneLoaded -= OnSceneLoaded;
  96. SceneManager.sceneUnloaded -= OnSceneUnloaded;
  97. bsPlugins.OnApplicationQuit();
  98. ipaPlugins.OnApplicationQuit();
  99. foreach (var provider in PluginManager.configProviders)
  100. if (provider.Key.HasChanged)
  101. try
  102. {
  103. provider.Key.Save();
  104. }
  105. catch (Exception e)
  106. {
  107. Logging.Logger.log.Error("Error when trying to save config");
  108. Logging.Logger.log.Error(e);
  109. }
  110. quitting = true;
  111. }
  112. void OnLevelWasLoaded(int level)
  113. {
  114. ipaPlugins.OnLevelWasLoaded(level);
  115. }
  116. void OnLevelWasInitialized(int level)
  117. {
  118. ipaPlugins.OnLevelWasInitialized(level);
  119. }
  120. void OnSceneLoaded(Scene scene, LoadSceneMode sceneMode)
  121. {
  122. bsPlugins.OnSceneLoaded(scene, sceneMode);
  123. }
  124. private void OnSceneUnloaded(Scene scene) {
  125. bsPlugins.OnSceneUnloaded(scene);
  126. }
  127. private void OnActiveSceneChanged(Scene prevScene, Scene nextScene) {
  128. bsPlugins.OnActiveSceneChanged(prevScene, nextScene);
  129. }
  130. }
  131. }