1
0

HolidaySystem.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. using System.Linq;
  2. using Content.Server.Chat.Managers;
  3. using Content.Server.GameTicking;
  4. using Content.Shared.CCVar;
  5. using Content.Shared.Holiday;
  6. using Robust.Shared.Configuration;
  7. using Robust.Shared.Prototypes;
  8. namespace Content.Server.Holiday
  9. {
  10. public sealed class HolidaySystem : EntitySystem
  11. {
  12. [Dependency] private readonly IConfigurationManager _configManager = default!;
  13. [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
  14. [Dependency] private readonly IChatManager _chatManager = default!;
  15. [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
  16. [ViewVariables]
  17. private readonly List<HolidayPrototype> _currentHolidays = new();
  18. [ViewVariables]
  19. private bool _enabled = true;
  20. public override void Initialize()
  21. {
  22. Subs.CVar(_configManager, CCVars.HolidaysEnabled, OnHolidaysEnableChange);
  23. SubscribeLocalEvent<GameRunLevelChangedEvent>(OnRunLevelChanged);
  24. SubscribeLocalEvent<HolidayVisualsComponent, ComponentInit>(OnVisualsInit);
  25. }
  26. public void RefreshCurrentHolidays()
  27. {
  28. _currentHolidays.Clear();
  29. if (!_enabled)
  30. {
  31. RaiseLocalEvent(new HolidaysRefreshedEvent(Enumerable.Empty<HolidayPrototype>()));
  32. return;
  33. }
  34. var now = DateTime.Now;
  35. foreach (var holiday in _prototypeManager.EnumeratePrototypes<HolidayPrototype>())
  36. {
  37. if (holiday.ShouldCelebrate(now))
  38. {
  39. _currentHolidays.Add(holiday);
  40. }
  41. }
  42. RaiseLocalEvent(new HolidaysRefreshedEvent(_currentHolidays));
  43. }
  44. public void DoGreet()
  45. {
  46. foreach (var holiday in _currentHolidays)
  47. {
  48. _chatManager.DispatchServerAnnouncement(holiday.Greet());
  49. }
  50. }
  51. public void DoCelebrate()
  52. {
  53. foreach (var holiday in _currentHolidays)
  54. {
  55. holiday.Celebrate();
  56. }
  57. }
  58. public IEnumerable<HolidayPrototype> GetCurrentHolidays()
  59. {
  60. return _currentHolidays;
  61. }
  62. public bool IsCurrentlyHoliday(string holiday)
  63. {
  64. if (!_prototypeManager.TryIndex(holiday, out HolidayPrototype? prototype))
  65. return false;
  66. return _currentHolidays.Contains(prototype);
  67. }
  68. private void OnHolidaysEnableChange(bool enabled)
  69. {
  70. _enabled = enabled;
  71. RefreshCurrentHolidays();
  72. }
  73. private void OnRunLevelChanged(GameRunLevelChangedEvent eventArgs)
  74. {
  75. if (!_enabled) return;
  76. switch (eventArgs.New)
  77. {
  78. case GameRunLevel.PreRoundLobby:
  79. RefreshCurrentHolidays();
  80. break;
  81. case GameRunLevel.InRound:
  82. DoGreet();
  83. DoCelebrate();
  84. break;
  85. case GameRunLevel.PostRound:
  86. break;
  87. }
  88. }
  89. private void OnVisualsInit(Entity<HolidayVisualsComponent> ent, ref ComponentInit args)
  90. {
  91. foreach (var (key, holidays) in ent.Comp.Holidays)
  92. {
  93. if (!holidays.Any(h => IsCurrentlyHoliday(h)))
  94. continue;
  95. _appearance.SetData(ent, HolidayVisuals.Holiday, key);
  96. break;
  97. }
  98. }
  99. }
  100. /// <summary>
  101. /// Event for when the list of currently active holidays has been refreshed.
  102. /// </summary>
  103. public sealed class HolidaysRefreshedEvent : EntityEventArgs
  104. {
  105. public readonly IEnumerable<HolidayPrototype> Holidays;
  106. public HolidaysRefreshedEvent(IEnumerable<HolidayPrototype> holidays)
  107. {
  108. Holidays = holidays;
  109. }
  110. }
  111. }