2022-06-22 22:42:55 -04:00
|
|
|
using Content.Shared.Damage.Components;
|
2021-11-10 03:06:27 -07:00
|
|
|
using Content.Shared.FixedPoint;
|
2022-06-24 17:44:30 +10:00
|
|
|
using Content.Shared.Movement.Systems;
|
2021-11-10 03:06:27 -07:00
|
|
|
|
2021-11-22 19:08:27 +01:00
|
|
|
namespace Content.Shared.Damage
|
2021-11-10 03:06:27 -07:00
|
|
|
{
|
2022-02-16 00:23:23 -07:00
|
|
|
public sealed class SlowOnDamageSystem : EntitySystem
|
2021-11-10 03:06:27 -07:00
|
|
|
{
|
|
|
|
|
[Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifierSystem = default!;
|
|
|
|
|
|
|
|
|
|
public override void Initialize()
|
|
|
|
|
{
|
|
|
|
|
base.Initialize();
|
|
|
|
|
|
|
|
|
|
SubscribeLocalEvent<SlowOnDamageComponent, DamageChangedEvent>(OnDamageChanged);
|
|
|
|
|
SubscribeLocalEvent<SlowOnDamageComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMovespeed);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnRefreshMovespeed(EntityUid uid, SlowOnDamageComponent component, RefreshMovementSpeedModifiersEvent args)
|
|
|
|
|
{
|
|
|
|
|
if (!EntityManager.TryGetComponent<DamageableComponent>(uid, out var damage))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (damage.TotalDamage == FixedPoint2.Zero)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Get closest threshold
|
|
|
|
|
FixedPoint2 closest = FixedPoint2.Zero;
|
|
|
|
|
var total = damage.TotalDamage;
|
|
|
|
|
foreach (var thres in component.SpeedModifierThresholds)
|
|
|
|
|
{
|
2022-06-22 22:42:55 -04:00
|
|
|
if (total >= thres.Key && thres.Key > closest)
|
2021-11-10 03:06:27 -07:00
|
|
|
closest = thres.Key;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (closest != FixedPoint2.Zero)
|
|
|
|
|
{
|
|
|
|
|
var speed = component.SpeedModifierThresholds[closest];
|
|
|
|
|
args.ModifySpeed(speed, speed);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnDamageChanged(EntityUid uid, SlowOnDamageComponent component, DamageChangedEvent args)
|
|
|
|
|
{
|
|
|
|
|
// We -could- only refresh if it crossed a threshold but that would kind of be a lot of duplicated
|
|
|
|
|
// code and this isn't a super hot path anyway since basically only humans have this
|
|
|
|
|
|
|
|
|
|
_movementSpeedModifierSystem.RefreshMovementSpeedModifiers(uid);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|