PassiveDamageSystem.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using Content.Shared.Damage.Components;
  2. using Content.Shared.Mobs.Systems;
  3. using Content.Shared.Mobs.Components;
  4. using Content.Shared.FixedPoint;
  5. using Robust.Shared.Timing;
  6. namespace Content.Shared.Damage;
  7. public sealed class PassiveDamageSystem : EntitySystem
  8. {
  9. [Dependency] private readonly DamageableSystem _damageable = default!;
  10. [Dependency] private readonly IGameTiming _timing = default!;
  11. public override void Initialize()
  12. {
  13. base.Initialize();
  14. SubscribeLocalEvent<PassiveDamageComponent, MapInitEvent>(OnPendingMapInit);
  15. }
  16. private void OnPendingMapInit(EntityUid uid, PassiveDamageComponent component, MapInitEvent args)
  17. {
  18. component.NextDamage = _timing.CurTime + TimeSpan.FromSeconds(1f);
  19. }
  20. // Every tick, attempt to damage entities
  21. public override void Update(float frameTime)
  22. {
  23. base.Update(frameTime);
  24. var curTime = _timing.CurTime;
  25. // Go through every entity with the component
  26. var query = EntityQueryEnumerator<PassiveDamageComponent, DamageableComponent, MobStateComponent>();
  27. while (query.MoveNext(out var uid, out var comp, out var damage, out var mobState))
  28. {
  29. // Make sure they're up for a damage tick
  30. if (comp.NextDamage > curTime)
  31. continue;
  32. if (comp.DamageCap != 0 && damage.TotalDamage >= comp.DamageCap)
  33. continue;
  34. // Set the next time they can take damage
  35. comp.NextDamage = curTime + TimeSpan.FromSeconds(1f);
  36. // Damage them
  37. foreach (var allowedState in comp.AllowedStates)
  38. {
  39. if(allowedState == mobState.CurrentState)
  40. _damageable.TryChangeDamage(uid, comp.Damage, true, false, damage);
  41. }
  42. }
  43. }
  44. }