BeeperSystem.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using Content.Shared.Beeper.Components;
  2. using Content.Shared.FixedPoint;
  3. using Content.Shared.Item.ItemToggle;
  4. using Content.Shared.Item.ItemToggle.Components;
  5. using Robust.Shared.Audio.Systems;
  6. using Robust.Shared.Network;
  7. using Robust.Shared.Timing;
  8. namespace Content.Shared.Beeper.Systems;
  9. //This handles generic proximity beeper logic
  10. public sealed class BeeperSystem : EntitySystem
  11. {
  12. [Dependency] private readonly IGameTiming _timing = default!;
  13. [Dependency] private readonly INetManager _net = default!;
  14. [Dependency] private readonly ItemToggleSystem _toggle = default!;
  15. [Dependency] private readonly SharedAudioSystem _audio = default!;
  16. public override void Update(float frameTime)
  17. {
  18. var query = EntityQueryEnumerator<BeeperComponent, ItemToggleComponent>();
  19. while (query.MoveNext(out var uid, out var beeper, out var toggle))
  20. {
  21. if (toggle.Activated)
  22. RunUpdate_Internal(uid, beeper);
  23. }
  24. }
  25. public void SetIntervalScaling(EntityUid owner, BeeperComponent beeper, FixedPoint2 newScaling)
  26. {
  27. newScaling = FixedPoint2.Clamp(newScaling, 0, 1);
  28. beeper.IntervalScaling = newScaling;
  29. RunUpdate_Internal(owner, beeper);
  30. Dirty(owner, beeper);
  31. }
  32. public void SetInterval(EntityUid owner, BeeperComponent beeper, TimeSpan newInterval)
  33. {
  34. if (newInterval < beeper.MinBeepInterval)
  35. newInterval = beeper.MinBeepInterval;
  36. if (newInterval > beeper.MaxBeepInterval)
  37. newInterval = beeper.MaxBeepInterval;
  38. beeper.Interval = newInterval;
  39. RunUpdate_Internal(owner, beeper);
  40. Dirty(owner, beeper);
  41. }
  42. public void SetIntervalScaling(EntityUid owner, FixedPoint2 newScaling, BeeperComponent? beeper = null)
  43. {
  44. if (!Resolve(owner, ref beeper))
  45. return;
  46. SetIntervalScaling(owner, beeper, newScaling);
  47. }
  48. public void SetMute(EntityUid owner, bool isMuted, BeeperComponent? comp = null)
  49. {
  50. if (!Resolve(owner, ref comp))
  51. return;
  52. comp.IsMuted = isMuted;
  53. Dirty(owner, comp);
  54. }
  55. private void UpdateBeepInterval(EntityUid owner, BeeperComponent beeper)
  56. {
  57. var scalingFactor = beeper.IntervalScaling.Float();
  58. var interval = (beeper.MaxBeepInterval - beeper.MinBeepInterval) * scalingFactor + beeper.MinBeepInterval;
  59. if (beeper.Interval == interval)
  60. return;
  61. beeper.Interval = interval;
  62. Dirty(owner, beeper);
  63. }
  64. public void ForceUpdate(EntityUid owner, BeeperComponent? beeper = null)
  65. {
  66. if (!Resolve(owner, ref beeper))
  67. return;
  68. RunUpdate_Internal(owner, beeper);
  69. }
  70. private void RunUpdate_Internal(EntityUid owner, BeeperComponent beeper)
  71. {
  72. if (!_toggle.IsActivated(owner))
  73. return;
  74. UpdateBeepInterval(owner, beeper);
  75. if (beeper.NextBeep >= _timing.CurTime)
  76. return;
  77. var beepEvent = new BeepPlayedEvent(beeper.IsMuted);
  78. RaiseLocalEvent(owner, ref beepEvent);
  79. if (!beeper.IsMuted && _net.IsServer)
  80. _audio.PlayPvs(beeper.BeepSound, owner);
  81. beeper.LastBeepTime = _timing.CurTime;
  82. }
  83. }