diff --git a/Content.Server/DoAfter/DoAfterEventArgs.cs b/Content.Server/DoAfter/DoAfterEventArgs.cs index b53d2237a9..26e24c8806 100644 --- a/Content.Server/DoAfter/DoAfterEventArgs.cs +++ b/Content.Server/DoAfter/DoAfterEventArgs.cs @@ -1,5 +1,6 @@ using System; using System.Threading; +using Content.Shared.FixedPoint; using Robust.Shared.GameObjects; namespace Content.Server.DoAfter @@ -49,6 +50,11 @@ namespace Content.Server.DoAfter public float MovementThreshold { get; set; } public bool BreakOnDamage { get; set; } + + /// + /// Threshold for user damage + /// + public FixedPoint2 DamageThreshold { get; set; } public bool BreakOnStun { get; set; } /// @@ -105,6 +111,7 @@ namespace Content.Server.DoAfter CancelToken = cancelToken; Target = target; MovementThreshold = 0.1f; + DamageThreshold = 0; if (Target == null) { diff --git a/Content.Server/DoAfter/DoAfterSystem.cs b/Content.Server/DoAfter/DoAfterSystem.cs index 3c250a7dec..b6587dee17 100644 --- a/Content.Server/DoAfter/DoAfterSystem.cs +++ b/Content.Server/DoAfter/DoAfterSystem.cs @@ -79,6 +79,7 @@ namespace Content.Server.DoAfter doAfter.EventArgs.BreakOnUserMove, doAfter.EventArgs.BreakOnTargetMove, doAfter.EventArgs.MovementThreshold, + doAfter.EventArgs.DamageThreshold, doAfter.EventArgs.Target); toAdd.Add(clientDoAfter); @@ -98,14 +99,22 @@ namespace Content.Server.DoAfter } } + /// + /// Cancels DoAfter if it breaks on damage and it meets the threshold + /// + /// + /// The EntityUID of the user + /// + /// + /// public void OnDamage(EntityUid _, DoAfterComponent component, DamageChangedEvent args) { - if (!args.InterruptsDoAfters || !args.DamageIncreased) + if (!args.InterruptsDoAfters || !args.DamageIncreased || args.DamageDelta == null) return; foreach (var (doAfter, _) in component.DoAfters) { - if (doAfter.EventArgs.BreakOnDamage) + if (doAfter.EventArgs.BreakOnDamage && args.DamageDelta?.Total.Float() > doAfter.EventArgs.DamageThreshold) { doAfter.Cancel(); } diff --git a/Content.Shared/DoAfter/SharedDoAfterComponent.cs b/Content.Shared/DoAfter/SharedDoAfterComponent.cs index 6c761f61e7..29c6079b95 100644 --- a/Content.Shared/DoAfter/SharedDoAfterComponent.cs +++ b/Content.Shared/DoAfter/SharedDoAfterComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.FixedPoint; using Robust.Shared.GameStates; using Robust.Shared.Map; using Robust.Shared.Serialization; @@ -59,8 +60,10 @@ namespace Content.Shared.DoAfter public float MovementThreshold { get; } + public FixedPoint2 DamageThreshold { get; } + public ClientDoAfter(byte id, EntityCoordinates userGrid, EntityCoordinates targetGrid, TimeSpan startTime, - float delay, bool breakOnUserMove, bool breakOnTargetMove, float movementThreshold, EntityUid? target = null) + float delay, bool breakOnUserMove, bool breakOnTargetMove, float movementThreshold, FixedPoint2 damageThreshold, EntityUid? target = null) { ID = id; UserGrid = userGrid; @@ -70,6 +73,7 @@ namespace Content.Shared.DoAfter BreakOnUserMove = breakOnUserMove; BreakOnTargetMove = breakOnTargetMove; MovementThreshold = movementThreshold; + DamageThreshold = damageThreshold; Target = target; } }