SpeakOnTriggerSystem.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using Content.Server.Explosion.EntitySystems;
  2. using Content.Shared.Timing;
  3. using Robust.Shared.Prototypes;
  4. using Robust.Shared.Random;
  5. namespace Content.Server.Chat.Systems;
  6. public sealed class SpeakOnTriggerSystem : EntitySystem
  7. {
  8. [Dependency] private readonly UseDelaySystem _useDelay = default!;
  9. [Dependency] private readonly IRobustRandom _random = default!;
  10. [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
  11. [Dependency] private readonly ChatSystem _chat = default!;
  12. public override void Initialize()
  13. {
  14. base.Initialize();
  15. SubscribeLocalEvent<SpeakOnTriggerComponent, TriggerEvent>(OnTrigger);
  16. }
  17. private void OnTrigger(Entity<SpeakOnTriggerComponent> ent, ref TriggerEvent args)
  18. {
  19. TrySpeak(ent);
  20. args.Handled = true;
  21. }
  22. private void TrySpeak(Entity<SpeakOnTriggerComponent> ent)
  23. {
  24. // If it doesn't have the use delay component, still send the message.
  25. if (TryComp<UseDelayComponent>(ent.Owner, out var useDelay) && _useDelay.IsDelayed((ent.Owner, useDelay)))
  26. return;
  27. if (!_prototypeManager.TryIndex(ent.Comp.Pack, out var messagePack))
  28. return;
  29. var message = Loc.GetString(_random.Pick(messagePack.Values));
  30. _chat.TrySendInGameICMessage(ent.Owner, message, InGameICChatType.Speak, true);
  31. if (useDelay != null)
  32. _useDelay.TryResetDelay((ent.Owner, useDelay));
  33. }
  34. }