From a32c5e543b0a1bddef72348337527dbc1b3e8eb7 Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Mon, 4 Jul 2022 02:56:31 -0400 Subject: [PATCH] Add BreakOnDistance to DoAfterEventArgs (#8902) Co-authored-by: metalgearsloth --- Content.Server/DoAfter/DoAfter.cs | 24 +++++++++++++++++++ Content.Server/DoAfter/DoAfterEventArgs.cs | 14 ++++++++++- .../Nutrition/EntitySystems/FoodSystem.cs | 3 ++- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/Content.Server/DoAfter/DoAfter.cs b/Content.Server/DoAfter/DoAfter.cs index ec166b5a45..f46965118b 100644 --- a/Content.Server/DoAfter/DoAfter.cs +++ b/Content.Server/DoAfter/DoAfter.cs @@ -162,6 +162,30 @@ namespace Content.Server.DoAfter } } + if (EventArgs.DistanceThreshold != null) + { + var xformQuery = entityManager.GetEntityQuery(); + 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; } diff --git a/Content.Server/DoAfter/DoAfterEventArgs.cs b/Content.Server/DoAfter/DoAfterEventArgs.cs index 96b1ebaaac..2d527ea3ab 100644 --- a/Content.Server/DoAfter/DoAfterEventArgs.cs +++ b/Content.Server/DoAfter/DoAfterEventArgs.cs @@ -20,6 +20,11 @@ namespace Content.Server.DoAfter /// public EntityUid? Target { get; } + /// + /// Entity used by the User on the Target. + /// + public EntityUid? Used { get; set; } + /// /// Manually cancel the do_after so it no longer runs /// @@ -55,6 +60,11 @@ namespace Content.Server.DoAfter public FixedPoint2 DamageThreshold { get; set; } public bool BreakOnStun { get; set; } + /// + /// Threshold for distance user from the used OR target entities. + /// + public float? DistanceThreshold { get; set; } + /// /// Requires a function call once at the end (like InRangeUnobstructed). /// @@ -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; diff --git a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs index ff46bf4b73..30d49a8154 100644 --- a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs @@ -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,