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.

75 lines
2.7 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.CompilerServices;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. using UnityEngine.SceneManagement;
  7. using Logger = IPA.Logging.Logger;
  8. namespace IPA.Loader.Composite
  9. {
  10. internal class CompositeBSPlugin
  11. {
  12. private readonly IEnumerable<PluginExecutor> plugins;
  13. private delegate Task CompositeCall(PluginExecutor plugin);
  14. public CompositeBSPlugin(IEnumerable<PluginExecutor> plugins)
  15. {
  16. this.plugins = plugins;
  17. }
  18. private void Invoke(CompositeCall callback, [CallerMemberName] string method = "")
  19. {
  20. foreach (var plugin in plugins)
  21. {
  22. try
  23. {
  24. if (plugin != null)
  25. {
  26. callback(plugin).ContinueWith(t =>
  27. {
  28. Logger.Default.Error($"{plugin.Metadata.Name} {method}: {t.Exception!.InnerException}");
  29. }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.Default);
  30. }
  31. }
  32. catch (Exception ex)
  33. {
  34. Logger.Default.Error($"{plugin.Metadata.Name} {method}: {ex}");
  35. }
  36. }
  37. }
  38. public void OnEnable()
  39. => Invoke(plugin => plugin.Enable());
  40. public void OnApplicationQuit() // do something useful with the Task that Disable gives us
  41. => Invoke(plugin => plugin.Disable());
  42. public void OnSceneLoaded(Scene scene, LoadSceneMode sceneMode)
  43. { }//=> Invoke(plugin => plugin.Plugin.OnSceneLoaded(scene, sceneMode));
  44. public void OnSceneUnloaded(Scene scene)
  45. { }//=> Invoke(plugin => plugin.Plugin.OnSceneUnloaded(scene));
  46. public void OnActiveSceneChanged(Scene prevScene, Scene nextScene)
  47. { }//=> Invoke(plugin => plugin.Plugin.OnActiveSceneChanged(prevScene, nextScene));
  48. public void OnUpdate()
  49. { }/*=> Invoke(plugin =>
  50. {
  51. if (plugin.Plugin is IEnhancedPlugin saberPlugin)
  52. saberPlugin.OnUpdate();
  53. });*/
  54. public void OnFixedUpdate()
  55. { }/*=> Invoke(plugin => {
  56. if (plugin.Plugin is IEnhancedPlugin saberPlugin)
  57. saberPlugin.OnFixedUpdate();
  58. });*/
  59. public void OnLateUpdate()
  60. { }/*=> Invoke(plugin => {
  61. if (plugin.Plugin is IEnhancedPlugin saberPlugin)
  62. saberPlugin.OnLateUpdate();
  63. });*/
  64. }
  65. }