Fix targeting logic picking the furthest away enemy in some cases
authorLiza Carvelli <liza@carvel.li>
Sat, 27 Jul 2024 21:10:08 +0000 (23:10 +0200)
committerLiza Carvelli <liza@carvel.li>
Sat, 27 Jul 2024 21:10:24 +0000 (23:10 +0200)
Questionable/Controller/CombatController.cs
Questionable/Controller/MovementController.cs

index 923b7c866a1dadb9a8cb064177f7b90b1e998620..f8c38a7d31b147964fc31c798da0c07cdaab84e8 100644 (file)
@@ -21,6 +21,7 @@ namespace Questionable.Controller;
 internal sealed class CombatController : IDisposable
 {
     private readonly List<ICombatModule> _combatModules;
+    private readonly MovementController _movementController;
     private readonly ITargetManager _targetManager;
     private readonly IObjectTable _objectTable;
     private readonly ICondition _condition;
@@ -30,11 +31,18 @@ internal sealed class CombatController : IDisposable
 
     private CurrentFight? _currentFight;
 
-    public CombatController(IEnumerable<ICombatModule> combatModules, ITargetManager targetManager,
-        IObjectTable objectTable, ICondition condition, IClientState clientState, GameFunctions gameFunctions,
+    public CombatController(
+        IEnumerable<ICombatModule> combatModules,
+        MovementController movementController,
+        ITargetManager targetManager,
+        IObjectTable objectTable,
+        ICondition condition,
+        IClientState clientState,
+        GameFunctions gameFunctions,
         ILogger<CombatController> logger)
     {
         _combatModules = combatModules.ToList();
+        _movementController = movementController;
         _targetManager = targetManager;
         _objectTable = objectTable;
         _condition = condition;
@@ -71,7 +79,7 @@ internal sealed class CombatController : IDisposable
     /// <returns>true if still in combat, false otherwise</returns>
     public bool Update()
     {
-        if (_currentFight == null)
+        if (_currentFight == null || _movementController.IsPathfinding || _movementController.IsPathRunning)
             return false;
 
         var target = _targetManager.Target;
@@ -104,7 +112,7 @@ internal sealed class CombatController : IDisposable
         else
         {
             var nextTarget = FindNextTarget();
-            if (nextTarget != null)
+            if (nextTarget is { IsDead: false })
             {
                 _logger.LogInformation("Setting next target to {TargetName} ({TargetId:X8})",
                     nextTarget.Name.ToString(), nextTarget.GameObjectId);
@@ -163,10 +171,15 @@ internal sealed class CombatController : IDisposable
             }
         }
 
-        return _objectTable.Select(x => (GameObject: x, Priority: GetKillPriority(x)))
+        return _objectTable.Select(x => new
+            {
+                GameObject = x,
+                Priority = GetKillPriority(x),
+                Distance = Vector3.Distance(x.Position, _clientState.LocalPlayer!.Position),
+            })
             .Where(x => x.Priority > 0)
             .OrderByDescending(x => x.Priority)
-            .ThenByDescending(x => Vector3.Distance(x.GameObject.Position, _clientState.LocalPlayer!.Position))
+            .ThenBy(x => x.Distance)
             .Select(x => x.GameObject)
             .FirstOrDefault();
     }
index dca221d0614a6c1d7ef5500c92c142282e95f449..5332c404a3f369a1238594f37b8a1dc48f689abb 100644 (file)
@@ -313,6 +313,7 @@ internal sealed class MovementController : IDisposable
     {
         _navmeshIpc.Stop();
         ResetPathfinding();
+        Destination = null;
 
         if (InputManager.IsAutoRunning())
         {