Adds a damage threshold property for DoAfters (#7712)

This commit is contained in:
keronshb
2022-04-23 20:41:48 -04:00
committed by GitHub
parent 64a9919c5d
commit 7896620224
3 changed files with 23 additions and 3 deletions

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Threading; using System.Threading;
using Content.Shared.FixedPoint;
using Robust.Shared.GameObjects; using Robust.Shared.GameObjects;
namespace Content.Server.DoAfter namespace Content.Server.DoAfter
@@ -49,6 +50,11 @@ namespace Content.Server.DoAfter
public float MovementThreshold { get; set; } public float MovementThreshold { get; set; }
public bool BreakOnDamage { get; set; } public bool BreakOnDamage { get; set; }
/// <summary>
/// Threshold for user damage
/// </summary>
public FixedPoint2 DamageThreshold { get; set; }
public bool BreakOnStun { get; set; } public bool BreakOnStun { get; set; }
/// <summary> /// <summary>
@@ -105,6 +111,7 @@ namespace Content.Server.DoAfter
CancelToken = cancelToken; CancelToken = cancelToken;
Target = target; Target = target;
MovementThreshold = 0.1f; MovementThreshold = 0.1f;
DamageThreshold = 0;
if (Target == null) if (Target == null)
{ {

View File

@@ -79,6 +79,7 @@ namespace Content.Server.DoAfter
doAfter.EventArgs.BreakOnUserMove, doAfter.EventArgs.BreakOnUserMove,
doAfter.EventArgs.BreakOnTargetMove, doAfter.EventArgs.BreakOnTargetMove,
doAfter.EventArgs.MovementThreshold, doAfter.EventArgs.MovementThreshold,
doAfter.EventArgs.DamageThreshold,
doAfter.EventArgs.Target); doAfter.EventArgs.Target);
toAdd.Add(clientDoAfter); toAdd.Add(clientDoAfter);
@@ -98,14 +99,22 @@ namespace Content.Server.DoAfter
} }
} }
/// <summary>
/// Cancels DoAfter if it breaks on damage and it meets the threshold
/// </summary>
/// <param name="_">
/// The EntityUID of the user
/// </param>
/// <param name="component"></param>
/// <param name="args"></param>
public void OnDamage(EntityUid _, DoAfterComponent component, DamageChangedEvent args) public void OnDamage(EntityUid _, DoAfterComponent component, DamageChangedEvent args)
{ {
if (!args.InterruptsDoAfters || !args.DamageIncreased) if (!args.InterruptsDoAfters || !args.DamageIncreased || args.DamageDelta == null)
return; return;
foreach (var (doAfter, _) in component.DoAfters) foreach (var (doAfter, _) in component.DoAfters)
{ {
if (doAfter.EventArgs.BreakOnDamage) if (doAfter.EventArgs.BreakOnDamage && args.DamageDelta?.Total.Float() > doAfter.EventArgs.DamageThreshold)
{ {
doAfter.Cancel(); doAfter.Cancel();
} }

View File

@@ -1,3 +1,4 @@
using Content.Shared.FixedPoint;
using Robust.Shared.GameStates; using Robust.Shared.GameStates;
using Robust.Shared.Map; using Robust.Shared.Map;
using Robust.Shared.Serialization; using Robust.Shared.Serialization;
@@ -59,8 +60,10 @@ namespace Content.Shared.DoAfter
public float MovementThreshold { get; } public float MovementThreshold { get; }
public FixedPoint2 DamageThreshold { get; }
public ClientDoAfter(byte id, EntityCoordinates userGrid, EntityCoordinates targetGrid, TimeSpan startTime, 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; ID = id;
UserGrid = userGrid; UserGrid = userGrid;
@@ -70,6 +73,7 @@ namespace Content.Shared.DoAfter
BreakOnUserMove = breakOnUserMove; BreakOnUserMove = breakOnUserMove;
BreakOnTargetMove = breakOnTargetMove; BreakOnTargetMove = breakOnTargetMove;
MovementThreshold = movementThreshold; MovementThreshold = movementThreshold;
DamageThreshold = damageThreshold;
Target = target; Target = target;
} }
} }