DamageContactsSystem.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using Content.Shared.Damage.Components;
  2. using Content.Shared.Whitelist;
  3. using Robust.Shared.Physics.Components;
  4. using Robust.Shared.Physics.Events;
  5. using Robust.Shared.Physics.Systems;
  6. using Robust.Shared.Timing;
  7. namespace Content.Shared.Damage.Systems;
  8. public sealed class DamageContactsSystem : EntitySystem
  9. {
  10. [Dependency] private readonly IGameTiming _timing = default!;
  11. [Dependency] private readonly DamageableSystem _damageable = default!;
  12. [Dependency] private readonly SharedPhysicsSystem _physics = default!;
  13. [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
  14. public override void Initialize()
  15. {
  16. base.Initialize();
  17. SubscribeLocalEvent<DamageContactsComponent, StartCollideEvent>(OnEntityEnter);
  18. SubscribeLocalEvent<DamageContactsComponent, EndCollideEvent>(OnEntityExit);
  19. }
  20. public override void Update(float frameTime)
  21. {
  22. base.Update(frameTime);
  23. var query = EntityQueryEnumerator<DamagedByContactComponent>();
  24. while (query.MoveNext(out var ent, out var damaged))
  25. {
  26. if (_timing.CurTime < damaged.NextSecond)
  27. continue;
  28. damaged.NextSecond = _timing.CurTime + TimeSpan.FromSeconds(1);
  29. if (damaged.Damage != null)
  30. _damageable.TryChangeDamage(ent, damaged.Damage, interruptsDoAfters: false);
  31. }
  32. }
  33. private void OnEntityExit(EntityUid uid, DamageContactsComponent component, ref EndCollideEvent args)
  34. {
  35. var otherUid = args.OtherEntity;
  36. if (!TryComp<PhysicsComponent>(otherUid, out var body))
  37. return;
  38. var damageQuery = GetEntityQuery<DamageContactsComponent>();
  39. foreach (var ent in _physics.GetContactingEntities(otherUid, body))
  40. {
  41. if (ent == uid)
  42. continue;
  43. if (damageQuery.HasComponent(ent))
  44. return;
  45. }
  46. RemComp<DamagedByContactComponent>(otherUid);
  47. }
  48. private void OnEntityEnter(EntityUid uid, DamageContactsComponent component, ref StartCollideEvent args)
  49. {
  50. var otherUid = args.OtherEntity;
  51. if (HasComp<DamagedByContactComponent>(otherUid))
  52. return;
  53. if (_whitelistSystem.IsWhitelistPass(component.IgnoreWhitelist, otherUid))
  54. return;
  55. var damagedByContact = EnsureComp<DamagedByContactComponent>(otherUid);
  56. damagedByContact.Damage = component.Damage;
  57. }
  58. }