TriggerSystem.TimedCollide.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using System.Linq;
  2. using Content.Server.Explosion.Components;
  3. using Content.Server.Explosion.EntitySystems;
  4. using Robust.Shared.Physics.Dynamics;
  5. using Robust.Shared.Physics.Events;
  6. namespace Content.Server.Explosion.EntitySystems;
  7. public sealed partial class TriggerSystem
  8. {
  9. private void InitializeTimedCollide()
  10. {
  11. SubscribeLocalEvent<TriggerOnTimedCollideComponent, StartCollideEvent>(OnTimerCollide);
  12. SubscribeLocalEvent<TriggerOnTimedCollideComponent, EndCollideEvent>(OnTimerEndCollide);
  13. SubscribeLocalEvent<TriggerOnTimedCollideComponent, ComponentRemove>(OnComponentRemove);
  14. }
  15. private void OnTimerCollide(EntityUid uid, TriggerOnTimedCollideComponent component, ref StartCollideEvent args)
  16. {
  17. //Ensures the entity trigger will have an active component
  18. EnsureComp<ActiveTriggerOnTimedCollideComponent>(uid);
  19. var otherUID = args.OtherEntity;
  20. if (component.Colliding.ContainsKey(otherUID))
  21. return;
  22. component.Colliding.Add(otherUID, 0);
  23. }
  24. private void OnTimerEndCollide(EntityUid uid, TriggerOnTimedCollideComponent component, ref EndCollideEvent args)
  25. {
  26. var otherUID = args.OtherEntity;
  27. component.Colliding.Remove(otherUID);
  28. if (component.Colliding.Count == 0 && HasComp<ActiveTriggerOnTimedCollideComponent>(uid))
  29. RemComp<ActiveTriggerOnTimedCollideComponent>(uid);
  30. }
  31. private void OnComponentRemove(EntityUid uid, TriggerOnTimedCollideComponent component, ComponentRemove args)
  32. {
  33. if (HasComp<ActiveTriggerOnTimedCollideComponent>(uid))
  34. RemComp<ActiveTriggerOnTimedCollideComponent>(uid);
  35. }
  36. private void UpdateTimedCollide(float frameTime)
  37. {
  38. var query = EntityQueryEnumerator<ActiveTriggerOnTimedCollideComponent, TriggerOnTimedCollideComponent>();
  39. while (query.MoveNext(out var uid, out _, out var triggerOnTimedCollide))
  40. {
  41. foreach (var (collidingEntity, collidingTimer) in triggerOnTimedCollide.Colliding)
  42. {
  43. triggerOnTimedCollide.Colliding[collidingEntity] += frameTime;
  44. if (collidingTimer > triggerOnTimedCollide.Threshold)
  45. {
  46. RaiseLocalEvent(uid, new TriggerEvent(uid, collidingEntity), true);
  47. triggerOnTimedCollide.Colliding[collidingEntity] -= triggerOnTimedCollide.Threshold;
  48. }
  49. }
  50. }
  51. }
  52. }