Files
tbd-station-14/Content.Shared/Damage/Systems/PassiveDamageSystem.cs
Pieter-Jan Briers 68ce53ae17 Random spontaneous cleanup PR (#25131)
* Use new Subs.CVar helper

Removes manual config OnValueChanged calls, removes need to remember to manually unsubscribe.

This both reduces boilerplate and fixes many issues where subscriptions weren't removed on entity system shutdown.

* Fix a bunch of warnings

* More warning fixes

* Use new DateTime serializer to get rid of ISerializationHooks in changelog code.

* Get rid of some more ISerializationHooks for enums

* And a little more

* Apply suggestions from code review

Co-authored-by: 0x6273 <0x40@keemail.me>

---------

Co-authored-by: 0x6273 <0x40@keemail.me>
2024-02-13 16:48:39 -05:00

55 lines
1.8 KiB
C#

using Content.Shared.Damage.Components;
using Content.Shared.Mobs.Systems;
using Content.Shared.Mobs.Components;
using Content.Shared.FixedPoint;
using Robust.Shared.Timing;
namespace Content.Shared.Damage;
public sealed class PassiveDamageSystem : EntitySystem
{
[Dependency] private readonly DamageableSystem _damageable = default!;
[Dependency] private readonly IGameTiming _timing = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PassiveDamageComponent, MapInitEvent>(OnPendingMapInit);
}
private void OnPendingMapInit(EntityUid uid, PassiveDamageComponent component, MapInitEvent args)
{
component.NextDamage = _timing.CurTime + TimeSpan.FromSeconds(1f);
}
// Every tick, attempt to damage entities
public override void Update(float frameTime)
{
base.Update(frameTime);
var curTime = _timing.CurTime;
// Go through every entity with the component
var query = EntityQueryEnumerator<PassiveDamageComponent, DamageableComponent, MobStateComponent>();
while (query.MoveNext(out var uid, out var comp, out var damage, out var mobState))
{
// Make sure they're up for a damage tick
if (comp.NextDamage > curTime)
continue;
if (comp.DamageCap != 0 && damage.TotalDamage >= comp.DamageCap)
continue;
// Set the next time they can take damage
comp.NextDamage = curTime + TimeSpan.FromSeconds(1f);
// Damage them
foreach (var allowedState in comp.AllowedStates)
{
if(allowedState == mobState.CurrentState)
_damageable.TryChangeDamage(uid, comp.Damage, true, false, damage);
}
}
}
}