DamageOnHoldingSystem.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using Content.Shared.Damage.Components;
  2. using Robust.Shared.Containers;
  3. using Robust.Shared.Timing;
  4. namespace Content.Shared.Damage.Systems;
  5. public sealed class DamageOnHoldingSystem : EntitySystem
  6. {
  7. [Dependency] private readonly SharedContainerSystem _container = default!;
  8. [Dependency] private readonly DamageableSystem _damageableSystem = default!;
  9. [Dependency] private readonly IGameTiming _timing = default!;
  10. public override void Initialize()
  11. {
  12. base.Initialize();
  13. SubscribeLocalEvent<DamageOnHoldingComponent, MapInitEvent>(OnMapInit);
  14. }
  15. public void SetEnabled(EntityUid uid, bool enabled, DamageOnHoldingComponent? component = null)
  16. {
  17. if (Resolve(uid, ref component))
  18. {
  19. component.Enabled = enabled;
  20. component.NextDamage = _timing.CurTime;
  21. }
  22. }
  23. private void OnMapInit(EntityUid uid, DamageOnHoldingComponent component, MapInitEvent args)
  24. {
  25. component.NextDamage = _timing.CurTime;
  26. }
  27. public override void Update(float frameTime)
  28. {
  29. var query = EntityQueryEnumerator<DamageOnHoldingComponent>();
  30. while (query.MoveNext(out var uid, out var component))
  31. {
  32. if (!component.Enabled || component.NextDamage > _timing.CurTime)
  33. continue;
  34. if (_container.TryGetContainingContainer((uid, null, null), out var container))
  35. {
  36. _damageableSystem.TryChangeDamage(container.Owner, component.Damage, origin: uid);
  37. }
  38. component.NextDamage = _timing.CurTime + TimeSpan.FromSeconds(component.Interval);
  39. }
  40. }
  41. }