IgniteOnTriggerSystem.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using Content.Server.Explosion.EntitySystems;
  2. using Content.Shared.Timing;
  3. using Robust.Shared.Audio.Systems;
  4. using Robust.Shared.Timing;
  5. namespace Content.Server.IgnitionSource;
  6. /// <summary>
  7. /// Handles igniting when triggered and stopping ignition after the delay.
  8. /// </summary>
  9. public sealed class IgniteOnTriggerSystem : EntitySystem
  10. {
  11. [Dependency] private readonly IGameTiming _timing = default!;
  12. [Dependency] private readonly IgnitionSourceSystem _source = default!;
  13. [Dependency] private readonly SharedAudioSystem _audio = default!;
  14. [Dependency] private readonly UseDelaySystem _useDelay = default!;
  15. public override void Initialize()
  16. {
  17. base.Initialize();
  18. SubscribeLocalEvent<IgniteOnTriggerComponent, TriggerEvent>(OnTrigger);
  19. }
  20. public override void Update(float deltaTime)
  21. {
  22. base.Update(deltaTime);
  23. var query = EntityQueryEnumerator<IgniteOnTriggerComponent, IgnitionSourceComponent>();
  24. while (query.MoveNext(out var uid, out var comp, out var source))
  25. {
  26. if (!source.Ignited)
  27. continue;
  28. if (_timing.CurTime < comp.IgnitedUntil)
  29. continue;
  30. _source.SetIgnited((uid, source), false);
  31. }
  32. }
  33. private void OnTrigger(Entity<IgniteOnTriggerComponent> ent, ref TriggerEvent args)
  34. {
  35. // prevent spamming sound and ignition
  36. if (!TryComp(ent.Owner, out UseDelayComponent? useDelay) || _useDelay.IsDelayed((ent.Owner, useDelay)))
  37. return;
  38. _source.SetIgnited(ent.Owner);
  39. _audio.PlayPvs(ent.Comp.IgniteSound, ent);
  40. _useDelay.TryResetDelay((ent.Owner, useDelay));
  41. ent.Comp.IgnitedUntil = _timing.CurTime + ent.Comp.IgnitedTime;
  42. }
  43. }