* 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>
55 lines
1.8 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|