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.

121 lines
3.5 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.Item1.HasChanged) provider.Item1.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.Item1.HasChanged) provider.Item1.Save();
  52. else if (provider.Item1.LastModified > provider.Item2) provider.Item1.Load(); // auto reload if it changes
  53. }
  54. }
  55. void FixedUpdate()
  56. {
  57. bsPlugins.OnFixedUpdate();
  58. ipaPlugins.OnFixedUpdate();
  59. }
  60. void OnDestroy()
  61. {
  62. if (!quitting)
  63. {
  64. Create();
  65. }
  66. }
  67. void OnApplicationQuit()
  68. {
  69. SceneManager.activeSceneChanged -= OnActiveSceneChanged;
  70. SceneManager.sceneLoaded -= OnSceneLoaded;
  71. SceneManager.sceneUnloaded -= OnSceneUnloaded;
  72. bsPlugins.OnApplicationQuit();
  73. ipaPlugins.OnApplicationQuit();
  74. foreach (var provider in PluginManager.configProviders)
  75. if (provider.Item1.HasChanged) provider.Item1.Save();
  76. quitting = true;
  77. }
  78. void OnLevelWasLoaded(int level)
  79. {
  80. ipaPlugins.OnLevelWasLoaded(level);
  81. }
  82. void OnLevelWasInitialized(int level)
  83. {
  84. ipaPlugins.OnLevelWasInitialized(level);
  85. }
  86. void OnSceneLoaded(Scene scene, LoadSceneMode sceneMode)
  87. {
  88. bsPlugins.OnSceneLoaded(scene, sceneMode);
  89. }
  90. private void OnSceneUnloaded(Scene scene) {
  91. bsPlugins.OnSceneUnloaded(scene);
  92. }
  93. private void OnActiveSceneChanged(Scene prevScene, Scene nextScene) {
  94. bsPlugins.OnActiveSceneChanged(prevScene, nextScene);
  95. }
  96. }
  97. }