using IPA.Config; using IPA.Loader.Composite; using System.Diagnostics.CodeAnalysis; using UnityEngine; using UnityEngine.SceneManagement; // ReSharper disable UnusedMember.Local namespace IPA.Loader { [SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")] internal class PluginComponent : MonoBehaviour { private CompositeBSPlugin bsPlugins; private CompositeIPAPlugin ipaPlugins; private bool quitting; internal static PluginComponent Create() { return new GameObject("IPA_PluginManager").AddComponent(); } void Awake() { DontDestroyOnLoad(gameObject); PluginManager.Load(); bsPlugins = new CompositeBSPlugin(PluginManager.BSMetas); #pragma warning disable 618 ipaPlugins = new CompositeIPAPlugin(PluginManager.Plugins); #pragma warning restore 618 #if NET4 gameObject.AddComponent(); #endif #pragma warning disable CS0612 // Type or member is obsolete bsPlugins.OnApplicationStart(); #pragma warning restore CS0612 // Type or member is obsolete ipaPlugins.OnApplicationStart(); SceneManager.activeSceneChanged += OnActiveSceneChanged; SceneManager.sceneLoaded += OnSceneLoaded; SceneManager.sceneUnloaded += OnSceneUnloaded; Config.Config.Save(); } void Update() { bsPlugins.OnUpdate(); ipaPlugins.OnUpdate(); Config.Config.Update(); } void LateUpdate() { bsPlugins.OnLateUpdate(); ipaPlugins.OnLateUpdate(); //Config.Config.Update(); } void FixedUpdate() { bsPlugins.OnFixedUpdate(); ipaPlugins.OnFixedUpdate(); } void OnDestroy() { if (!quitting) { Create(); } } void OnApplicationQuit() { SceneManager.activeSceneChanged -= OnActiveSceneChanged; SceneManager.sceneLoaded -= OnSceneLoaded; SceneManager.sceneUnloaded -= OnSceneUnloaded; bsPlugins.OnApplicationQuit(); ipaPlugins.OnApplicationQuit(); Config.Config.Save(); quitting = true; } void OnLevelWasLoaded(int level) { ipaPlugins.OnLevelWasLoaded(level); } void OnLevelWasInitialized(int level) { ipaPlugins.OnLevelWasInitialized(level); } void OnSceneLoaded(Scene scene, LoadSceneMode sceneMode) { bsPlugins.OnSceneLoaded(scene, sceneMode); } private void OnSceneUnloaded(Scene scene) { bsPlugins.OnSceneUnloaded(scene); } private void OnActiveSceneChanged(Scene prevScene, Scene nextScene) { bsPlugins.OnActiveSceneChanged(prevScene, nextScene); } } }