From 7aed01087bfed55421497cf166cab55145ba477c Mon Sep 17 00:00:00 2001 From: Rutherther Date: Fri, 30 Dec 2022 19:59:17 +0100 Subject: [PATCH] fix(combat): adjust walk in range behavior to not sit idle too much --- .../Operations/WalkInRangeOperation.cs | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/Extensions/NosSmooth.Extensions.Combat/Operations/WalkInRangeOperation.cs b/Extensions/NosSmooth.Extensions.Combat/Operations/WalkInRangeOperation.cs index ddcf81aacd470f76045636d96b686a9979115deb..16bd57d4016e5f82d04f0b7b813585c667a5efb5 100644 --- a/Extensions/NosSmooth.Extensions.Combat/Operations/WalkInRangeOperation.cs +++ b/Extensions/NosSmooth.Extensions.Combat/Operations/WalkInRangeOperation.cs @@ -61,7 +61,17 @@ public record WalkInRangeOperation return new CharacterNotInitializedError("Position"); } + if (Entity.Position?.DistanceSquared(currentPosition.Value) <= Distance * Distance) + { + return Result.FromSuccess(); + } + var closePosition = GetClosePosition(currentPosition.Value, position.Value, distance); + if (closePosition == position) + { + return Result.FromSuccess(); + } + using var goToCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(ct); var walkResultTask = WalkManager.GoToAsync(closePosition.X, closePosition.Y, goToCancellationTokenSource.Token); @@ -71,6 +81,7 @@ public record WalkInRangeOperation if (Entity.Position != position) { goToCancellationTokenSource.Cancel(); + await walkResultTask; } } @@ -80,9 +91,22 @@ public record WalkInRangeOperation } var walkResult = await walkResultTask; + if ((character.Position - Entity.Position)?.DistanceSquared(Position.Zero) <= Distance * Distance) + { + return Result.FromSuccess(); + } + if (!walkResult.IsSuccess && walkResult.Error is NotFoundError) { - distance--; + if (distance - 1 > 0) + { + distance--; + } + else + { + distance = 0; + } + continue; } @@ -95,6 +119,11 @@ public record WalkInRangeOperation private Position GetClosePosition(Position start, Position target, double distance) { var diff = start - target; + if (diff.DistanceSquared(Position.Zero) < distance * distance) + { + return start; + } + var diffLength = Math.Sqrt(diff.DistanceSquared(Position.Zero)); return target + ((distance / diffLength) * diff); }