Added threshold to DoAfter's user and target movement checks (#2585)

* Added threshold to DoAfter user and target movement checks

* Fixed spacing

* Update Content.Server/GameObjects/EntitySystems/DoAfter/DoAfterEventArgs.cs

Co-authored-by: Manel Navola <ManelNavola@users.noreply.github.com>
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
This commit is contained in:
Manel Navola
2020-11-22 03:58:31 +01:00
committed by GitHub
parent 86c2e989e6
commit 8c81e7c767
5 changed files with 21 additions and 9 deletions

View File

@@ -114,7 +114,7 @@ namespace Content.Client.GameObjects.EntitySystems.DoAfter
// Predictions
if (doAfter.BreakOnUserMove)
{
if (userGrid != doAfter.UserGrid)
if (!userGrid.InRange(EntityManager, doAfter.UserGrid, doAfter.MovementThreshold))
{
comp.Cancel(id, currentTime);
continue;
@@ -123,7 +123,7 @@ namespace Content.Client.GameObjects.EntitySystems.DoAfter
if (doAfter.BreakOnTargetMove)
{
if (EntityManager.TryGetEntity(doAfter.TargetUid, out var targetEntity) && targetEntity.Transform.Coordinates != doAfter.TargetGrid)
if (EntityManager.TryGetEntity(doAfter.TargetUid, out var targetEntity) && !targetEntity.Transform.Coordinates.InRange(EntityManager, doAfter.TargetGrid, doAfter.MovementThreshold))
{
comp.Cancel(id, currentTime);
continue;

View File

@@ -1,4 +1,4 @@
#nullable enable
#nullable enable
using System.Collections.Generic;
using Content.Server.GameObjects.EntitySystems.DoAfter;
using Content.Shared.GameObjects.Components;
@@ -31,6 +31,7 @@ namespace Content.Server.GameObjects.Components
doAfter.EventArgs.Delay,
doAfter.EventArgs.BreakOnUserMove,
doAfter.EventArgs.BreakOnTargetMove,
doAfter.EventArgs.MovementThreshold,
doAfter.EventArgs.Target?.Uid ?? EntityUid.Invalid);
toAdd.Add(clientDoAfter);

View File

@@ -1,4 +1,4 @@
#nullable enable
#nullable enable
using System;
using System.Threading.Tasks;
using Content.Server.GameObjects.Components.GUI;
@@ -118,12 +118,14 @@ namespace Content.Server.GameObjects.EntitySystems.DoAfter
}
// TODO :Handle inertia in space.
if (EventArgs.BreakOnUserMove && EventArgs.User.Transform.Coordinates != UserGrid)
if (EventArgs.BreakOnUserMove && !EventArgs.User.Transform.Coordinates.InRange(
EventArgs.User.EntityManager, UserGrid, EventArgs.MovementThreshold))
{
return true;
}
if (EventArgs.BreakOnTargetMove && EventArgs.Target!.Transform.Coordinates != TargetGrid)
if (EventArgs.BreakOnTargetMove && !EventArgs.Target!.Transform.Coordinates.InRange(
EventArgs.User.EntityManager, TargetGrid, EventArgs.MovementThreshold))
{
return true;
}

View File

@@ -1,4 +1,4 @@
#nullable enable
#nullable enable
using System;
using System.Threading;
using Content.Shared.Physics;
@@ -60,6 +60,11 @@ namespace Content.Server.GameObjects.EntitySystems.DoAfter
/// </summary>
public bool BreakOnTargetMove { get; set; }
/// <summary>
/// Threshold for user and target movement
/// </summary>
public float MovementThreshold { get; set; }
public bool BreakOnDamage { get; set; }
public bool BreakOnStun { get; set; }
@@ -86,6 +91,7 @@ namespace Content.Server.GameObjects.EntitySystems.DoAfter
Delay = delay;
CancelToken = cancelToken;
Target = target;
MovementThreshold = 0.1f;
if (Target == null)
{

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using Robust.Shared.GameObjects;
using Robust.Shared.Map;
@@ -59,7 +59,9 @@ namespace Content.Shared.GameObjects.Components
public bool BreakOnTargetMove { get; }
public ClientDoAfter(byte id, EntityCoordinates userGrid, EntityCoordinates targetGrid, TimeSpan startTime, float delay, bool breakOnUserMove, bool breakOnTargetMove, EntityUid targetUid = default)
public float MovementThreshold { get; }
public ClientDoAfter(byte id, EntityCoordinates userGrid, EntityCoordinates targetGrid, TimeSpan startTime, float delay, bool breakOnUserMove, bool breakOnTargetMove, float movementThreshold, EntityUid targetUid = default)
{
ID = id;
UserGrid = userGrid;
@@ -68,6 +70,7 @@ namespace Content.Shared.GameObjects.Components
Delay = delay;
BreakOnUserMove = breakOnUserMove;
BreakOnTargetMove = breakOnTargetMove;
MovementThreshold = movementThreshold;
TargetUid = targetUid;
}
}