Add BreakOnDistance to DoAfterEventArgs (#8902)

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
This commit is contained in:
themias
2022-07-04 02:56:31 -04:00
committed by GitHub
parent a12245c50e
commit a32c5e543b
3 changed files with 39 additions and 2 deletions

View File

@@ -162,6 +162,30 @@ namespace Content.Server.DoAfter
}
}
if (EventArgs.DistanceThreshold != null)
{
var xformQuery = entityManager.GetEntityQuery<TransformComponent>();
TransformComponent? userXform = null;
// Check user distance to target AND used entities.
if (EventArgs.Target != null && !EventArgs.User.Equals(EventArgs.Target))
{
//recalculate Target location in case Target has also moved
var targetCoordinates = xformQuery.GetComponent(EventArgs.Target.Value).Coordinates;
userXform ??= xformQuery.GetComponent(EventArgs.User);
if (userXform.Coordinates.InRange(entityManager, targetCoordinates, EventArgs.DistanceThreshold.Value))
return true;
}
if (EventArgs.Used != null)
{
var targetCoordinates = xformQuery.GetComponent(EventArgs.Used.Value).Coordinates;
userXform ??= xformQuery.GetComponent(EventArgs.User);
if (!userXform.Coordinates.InRange(entityManager, targetCoordinates, EventArgs.DistanceThreshold.Value))
return true;
}
}
return false;
}

View File

@@ -20,6 +20,11 @@ namespace Content.Server.DoAfter
/// </summary>
public EntityUid? Target { get; }
/// <summary>
/// Entity used by the User on the Target.
/// </summary>
public EntityUid? Used { get; set; }
/// <summary>
/// Manually cancel the do_after so it no longer runs
/// </summary>
@@ -55,6 +60,11 @@ namespace Content.Server.DoAfter
public FixedPoint2 DamageThreshold { get; set; }
public bool BreakOnStun { get; set; }
/// <summary>
/// Threshold for distance user from the used OR target entities.
/// </summary>
public float? DistanceThreshold { get; set; }
/// <summary>
/// Requires a function call once at the end (like InRangeUnobstructed).
/// </summary>
@@ -102,12 +112,14 @@ namespace Content.Server.DoAfter
EntityUid user,
float delay,
CancellationToken cancelToken = default,
EntityUid? target = null)
EntityUid? target = null,
EntityUid? used = null)
{
User = user;
Delay = delay;
CancelToken = cancelToken;
Target = target;
Used = used;
MovementThreshold = 0.1f;
DamageThreshold = 1.0;

View File

@@ -126,13 +126,14 @@ namespace Content.Server.Nutrition.EntitySystems
var moveBreak = user != target;
_doAfterSystem.DoAfter(new DoAfterEventArgs(user, forceFeed ? food.ForceFeedDelay : food.Delay, food.CancelToken.Token, target)
_doAfterSystem.DoAfter(new DoAfterEventArgs(user, forceFeed ? food.ForceFeedDelay : food.Delay, food.CancelToken.Token, target, food.Owner)
{
BreakOnUserMove = moveBreak,
BreakOnDamage = true,
BreakOnStun = true,
BreakOnTargetMove = moveBreak,
MovementThreshold = 0.01f,
DistanceThreshold = 2.0f,
TargetFinishedEvent = new FeedEvent(user, food, foodSolution, utensils),
BroadcastCancelledEvent = new ForceFeedCancelledEvent(food),
NeedHand = true,