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;
}
}