ParacusiaSystem.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System.Numerics;
  2. using Content.Shared.Traits.Assorted;
  3. using Robust.Shared.Random;
  4. using Robust.Client.Player;
  5. using Robust.Shared.Player;
  6. using Robust.Shared.Audio;
  7. using Robust.Shared.Audio.Systems;
  8. using Robust.Shared.Timing;
  9. namespace Content.Client.Traits;
  10. public sealed class ParacusiaSystem : SharedParacusiaSystem
  11. {
  12. [Dependency] private readonly IGameTiming _timing = default!;
  13. [Dependency] private readonly IPlayerManager _player = default!;
  14. [Dependency] private readonly IRobustRandom _random = default!;
  15. [Dependency] private readonly SharedAudioSystem _audio = default!;
  16. public override void Initialize()
  17. {
  18. base.Initialize();
  19. SubscribeLocalEvent<ParacusiaComponent, ComponentStartup>(OnComponentStartup);
  20. SubscribeLocalEvent<ParacusiaComponent, LocalPlayerDetachedEvent>(OnPlayerDetach);
  21. }
  22. public override void Update(float frameTime)
  23. {
  24. base.Update(frameTime);
  25. if (!_timing.IsFirstTimePredicted)
  26. return;
  27. if (_player.LocalEntity is not EntityUid localPlayer)
  28. return;
  29. PlayParacusiaSounds(localPlayer);
  30. }
  31. private void OnComponentStartup(EntityUid uid, ParacusiaComponent component, ComponentStartup args)
  32. {
  33. component.NextIncidentTime = _timing.CurTime + TimeSpan.FromSeconds(_random.NextFloat(component.MinTimeBetweenIncidents, component.MaxTimeBetweenIncidents));
  34. }
  35. private void OnPlayerDetach(EntityUid uid, ParacusiaComponent component, LocalPlayerDetachedEvent args)
  36. {
  37. component.Stream = _audio.Stop(component.Stream);
  38. }
  39. private void PlayParacusiaSounds(EntityUid uid)
  40. {
  41. if (!TryComp<ParacusiaComponent>(uid, out var paracusia))
  42. return;
  43. if (_timing.CurTime <= paracusia.NextIncidentTime)
  44. return;
  45. // Set the new time.
  46. var timeInterval = _random.NextFloat(paracusia.MinTimeBetweenIncidents, paracusia.MaxTimeBetweenIncidents);
  47. paracusia.NextIncidentTime += TimeSpan.FromSeconds(timeInterval);
  48. // Offset position where the sound is played
  49. var randomOffset =
  50. new Vector2
  51. (
  52. _random.NextFloat(-paracusia.MaxSoundDistance, paracusia.MaxSoundDistance),
  53. _random.NextFloat(-paracusia.MaxSoundDistance, paracusia.MaxSoundDistance)
  54. );
  55. var newCoords = Transform(uid).Coordinates.Offset(randomOffset);
  56. // Play the sound
  57. paracusia.Stream = _audio.PlayStatic(paracusia.Sounds, uid, newCoords)?.Entity;
  58. }
  59. }