TriggerSystem.Mobstate.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using Content.Server.Explosion.Components;
  2. using Content.Shared.Explosion.Components;
  3. using Content.Shared.Implants;
  4. using Content.Shared.Interaction.Events;
  5. using Content.Shared.Mobs;
  6. namespace Content.Server.Explosion.EntitySystems;
  7. public sealed partial class TriggerSystem
  8. {
  9. private void InitializeMobstate()
  10. {
  11. SubscribeLocalEvent<TriggerOnMobstateChangeComponent, MobStateChangedEvent>(OnMobStateChanged);
  12. SubscribeLocalEvent<TriggerOnMobstateChangeComponent, SuicideEvent>(OnSuicide);
  13. SubscribeLocalEvent<TriggerOnMobstateChangeComponent, ImplantRelayEvent<SuicideEvent>>(OnSuicideRelay);
  14. SubscribeLocalEvent<TriggerOnMobstateChangeComponent, ImplantRelayEvent<MobStateChangedEvent>>(OnMobStateRelay);
  15. }
  16. private void OnMobStateChanged(EntityUid uid, TriggerOnMobstateChangeComponent component, MobStateChangedEvent args)
  17. {
  18. if (!component.MobState.Contains(args.NewMobState))
  19. return;
  20. //This chains Mobstate Changed triggers with OnUseTimerTrigger if they have it
  21. //Very useful for things that require a mobstate change and a timer
  22. if (TryComp<OnUseTimerTriggerComponent>(uid, out var timerTrigger))
  23. {
  24. HandleTimerTrigger(
  25. uid,
  26. args.Origin,
  27. timerTrigger.Delay,
  28. timerTrigger.BeepInterval,
  29. timerTrigger.InitialBeepDelay,
  30. timerTrigger.BeepSound);
  31. }
  32. else
  33. Trigger(uid);
  34. }
  35. /// <summary>
  36. /// Checks if the user has any implants that prevent suicide to avoid some cheesy strategies
  37. /// Prevents suicide by handling the event without killing the user
  38. /// </summary>
  39. private void OnSuicide(EntityUid uid, TriggerOnMobstateChangeComponent component, SuicideEvent args)
  40. {
  41. if (args.Handled)
  42. return;
  43. if (!component.PreventSuicide)
  44. return;
  45. _popupSystem.PopupEntity(Loc.GetString("suicide-prevented"), args.Victim, args.Victim);
  46. args.Handled = true;
  47. }
  48. private void OnSuicideRelay(EntityUid uid, TriggerOnMobstateChangeComponent component, ImplantRelayEvent<SuicideEvent> args)
  49. {
  50. OnSuicide(uid, component, args.Event);
  51. }
  52. private void OnMobStateRelay(EntityUid uid, TriggerOnMobstateChangeComponent component, ImplantRelayEvent<MobStateChangedEvent> args)
  53. {
  54. OnMobStateChanged(uid, component, args.Event);
  55. }
  56. }