TickEmitterGrain.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using MineCase.Engine;
  7. using MineCase.Server.Components;
  8. using MineCase.Server.Game.Entities;
  9. using MineCase.Server.Persistence;
  10. using MineCase.Server.Persistence.Components;
  11. using MineCase.World;
  12. using Orleans;
  13. using Orleans.Concurrency;
  14. namespace MineCase.Server.World
  15. {
  16. [PersistTableName("tickEmitter")]
  17. [Reentrant]
  18. internal class TickEmitterGrain : PersistableDependencyObject, ITickEmitter
  19. {
  20. private AutoSaveStateComponent _autoSave;
  21. private StateHolder State => GetValue(StateComponent<StateHolder>.StateProperty);
  22. protected override async Task InitializePreLoadComponent()
  23. {
  24. await SetComponent(new StateComponent<StateHolder>());
  25. }
  26. protected override async Task InitializeComponents()
  27. {
  28. _autoSave = new AutoSaveStateComponent(AutoSaveStateComponent.PerMinute);
  29. await SetComponent(_autoSave);
  30. }
  31. public async Task OnGameTick(GameTickArgs e)
  32. {
  33. var message = new GameTick { Args = e };
  34. await Task.WhenAll(from en in State.Subscription select en.Tell(message));
  35. await _autoSave.OnGameTick(this, e);
  36. }
  37. public Task Subscribe(IDependencyObject observer)
  38. {
  39. if (State.Subscription.Add(observer))
  40. MarkDirty();
  41. return Task.CompletedTask;
  42. }
  43. public Task Unsubscribe(IDependencyObject observer)
  44. {
  45. if (State.Subscription.Remove(observer))
  46. MarkDirty();
  47. return Task.CompletedTask;
  48. }
  49. private void MarkDirty()
  50. {
  51. ValueStorage.IsDirty = true;
  52. }
  53. internal class StateHolder
  54. {
  55. public HashSet<IDependencyObject> Subscription { get; set; }
  56. public StateHolder()
  57. {
  58. }
  59. public StateHolder(InitializeStateMark mark)
  60. {
  61. Subscription = new HashSet<IDependencyObject>();
  62. }
  63. }
  64. }
  65. }