ObjectEvents.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System.Collections.Generic;
  2. namespace Hotfix
  3. {
  4. public sealed class ObjectEvents
  5. {
  6. private static ObjectEvents instance;
  7. private Queue<Disposer> loads = new Queue<Disposer>();
  8. private Queue<Disposer> loads2 = new Queue<Disposer>();
  9. private Queue<Disposer> updates = new Queue<Disposer>();
  10. private Queue<Disposer> updates2 = new Queue<Disposer>();
  11. private Queue<Disposer> lateUpdates = new Queue<Disposer>();
  12. private Queue<Disposer> lateUpdates2 = new Queue<Disposer>();
  13. private Queue<Disposer> frameUpdates = new Queue<Disposer>();
  14. private Queue<Disposer> frameUpdates2 = new Queue<Disposer>();
  15. public static ObjectEvents Instance
  16. {
  17. get
  18. {
  19. return instance ?? (instance = new ObjectEvents());
  20. }
  21. }
  22. public void Add(Disposer disposer)
  23. {
  24. if (disposer is ILoad)
  25. {
  26. loads.Enqueue(disposer);
  27. }
  28. if (disposer is IUpdate)
  29. {
  30. updates.Enqueue(disposer);
  31. }
  32. if (disposer is ILateUpdate)
  33. {
  34. lateUpdates.Enqueue(disposer);
  35. }
  36. }
  37. public void Load()
  38. {
  39. while (this.loads.Count > 0)
  40. {
  41. Disposer disposer = this.loads.Dequeue();
  42. if (disposer.Id == 0)
  43. {
  44. continue;
  45. }
  46. this.loads2.Enqueue(disposer);
  47. ((ILoad)disposer).Load();
  48. }
  49. ObjectHelper.Swap(ref this.loads, ref this.loads2);
  50. }
  51. public void Update()
  52. {
  53. while (this.updates.Count > 0)
  54. {
  55. Disposer disposer = this.updates.Dequeue();
  56. if (disposer.Id == 0)
  57. {
  58. continue;
  59. }
  60. this.updates2.Enqueue(disposer);
  61. ((IUpdate)disposer).Update();
  62. }
  63. ObjectHelper.Swap(ref this.updates, ref this.updates2);
  64. }
  65. public void LateUpdate()
  66. {
  67. while (this.lateUpdates.Count > 0)
  68. {
  69. Disposer disposer = this.lateUpdates.Dequeue();
  70. if (disposer.Id == 0)
  71. {
  72. continue;
  73. }
  74. this.lateUpdates2.Enqueue(disposer);
  75. ((ILateUpdate)disposer).LateUpdate();
  76. }
  77. ObjectHelper.Swap(ref this.lateUpdates, ref this.lateUpdates2);
  78. }
  79. }
  80. }