Add BreakOnDistance to DoAfterEventArgs (#8902)
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user