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.

125 lines
3.6 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using UnityEngine;
  5. using UnityEngine.SceneManagement;
  6. using IPA.Loader;
  7. using IPA.Loader.Composite;
  8. using IPA.Logging;
  9. namespace IPA.Loader
  10. {
  11. internal class PluginComponent : MonoBehaviour
  12. {
  13. private CompositeBSPlugin bsPlugins;
  14. private CompositeIPAPlugin ipaPlugins;
  15. private bool quitting = false;
  16. internal static PluginComponent Create()
  17. {
  18. Application.logMessageReceived += delegate (string condition, string stackTrace, LogType type)
  19. {
  20. var level = UnityLogInterceptor.LogTypeToLevel(type);
  21. UnityLogInterceptor.UnityLogger.Log(level, $"{condition.Trim()}");
  22. UnityLogInterceptor.UnityLogger.Log(level, $"{stackTrace.Trim()}");
  23. };
  24. return new GameObject("IPA_PluginManager").AddComponent<PluginComponent>();
  25. }
  26. void Awake()
  27. {
  28. DontDestroyOnLoad(gameObject);
  29. bsPlugins = new CompositeBSPlugin(PluginManager.BSPlugins);
  30. ipaPlugins = new CompositeIPAPlugin(PluginManager.Plugins);
  31. gameObject.AddComponent<Updating.ModsaberML.Updater>();
  32. bsPlugins.OnApplicationStart();
  33. ipaPlugins.OnApplicationStart();
  34. SceneManager.activeSceneChanged += OnActiveSceneChanged;
  35. SceneManager.sceneLoaded += OnSceneLoaded;
  36. SceneManager.sceneUnloaded += OnSceneUnloaded;
  37. foreach (var provider in PluginManager.configProviders)
  38. if (provider.Key.HasChanged) provider.Key.Save();
  39. }
  40. void Update()
  41. {
  42. bsPlugins.OnUpdate();
  43. ipaPlugins.OnUpdate();
  44. }
  45. void LateUpdate()
  46. {
  47. bsPlugins.OnLateUpdate();
  48. ipaPlugins.OnLateUpdate();
  49. foreach (var provider in PluginManager.configProviders)
  50. {
  51. if (provider.Key.HasChanged) provider.Key.Save();
  52. else if (provider.Key.LastModified > provider.Value.Value)
  53. {
  54. provider.Key.Load(); // auto reload if it changes
  55. provider.Value.Value = provider.Key.LastModified;
  56. }
  57. }
  58. }
  59. void FixedUpdate()
  60. {
  61. bsPlugins.OnFixedUpdate();
  62. ipaPlugins.OnFixedUpdate();
  63. }
  64. void OnDestroy()
  65. {
  66. if (!quitting)
  67. {
  68. Create();
  69. }
  70. }
  71. void OnApplicationQuit()
  72. {
  73. SceneManager.activeSceneChanged -= OnActiveSceneChanged;
  74. SceneManager.sceneLoaded -= OnSceneLoaded;
  75. SceneManager.sceneUnloaded -= OnSceneUnloaded;
  76. bsPlugins.OnApplicationQuit();
  77. ipaPlugins.OnApplicationQuit();
  78. foreach (var provider in PluginManager.configProviders)
  79. if (provider.Key.HasChanged) provider.Key.Save();
  80. quitting = true;
  81. }
  82. void OnLevelWasLoaded(int level)
  83. {
  84. ipaPlugins.OnLevelWasLoaded(level);
  85. }
  86. void OnLevelWasInitialized(int level)
  87. {
  88. ipaPlugins.OnLevelWasInitialized(level);
  89. }
  90. void OnSceneLoaded(Scene scene, LoadSceneMode sceneMode)
  91. {
  92. bsPlugins.OnSceneLoaded(scene, sceneMode);
  93. }
  94. private void OnSceneUnloaded(Scene scene) {
  95. bsPlugins.OnSceneUnloaded(scene);
  96. }
  97. private void OnActiveSceneChanged(Scene prevScene, Scene nextScene) {
  98. bsPlugins.OnActiveSceneChanged(prevScene, nextScene);
  99. }
  100. }
  101. }