Core/AI: UnitAI::SelectTarget now applies offset BEFORE filtering by predicate (to match expected behavior).
Port From (https://github.com/TrinityCore/TrinityCore/commit/5f59be31b0dc8b8b58da06fded6ef91dc170e8b6)
This commit is contained in:
@@ -139,54 +139,7 @@ namespace Game.AI
|
|||||||
if (mgr.GetThreatListSize() <= offset)
|
if (mgr.GetThreatListSize() <= offset)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
List<Unit> targetList = new List<Unit>();
|
List<Unit> targetList = SelectTargetList((uint)mgr.GetThreatListSize(), targetType, offset, selector);
|
||||||
if (targetType == SelectAggroTarget.MaxDistance || targetType == SelectAggroTarget.MinDistance)
|
|
||||||
{
|
|
||||||
foreach (HostileReference refe in mgr.GetThreatList())
|
|
||||||
{
|
|
||||||
if (!refe.IsOnline())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
targetList.Add(refe.GetTarget());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Unit currentVictim = mgr.GetCurrentVictim();
|
|
||||||
if (currentVictim)
|
|
||||||
targetList.Add(currentVictim);
|
|
||||||
|
|
||||||
foreach (HostileReference refe in mgr.GetThreatList())
|
|
||||||
{
|
|
||||||
if (!refe.IsOnline())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
Unit thisTarget = refe.GetTarget();
|
|
||||||
if (thisTarget != currentVictim)
|
|
||||||
targetList.Add(thisTarget);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// filter by predicate
|
|
||||||
targetList.RemoveAll(target => { return !selector.Check(target); });
|
|
||||||
// shortcut: the list certainly isn't gonna get any larger after this point
|
|
||||||
if (targetList.Count <= offset)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
// right now, list is unsorted for DISTANCE types - re-sort by MAXDISTANCE
|
|
||||||
if (targetType == SelectAggroTarget.MaxDistance || targetType == SelectAggroTarget.MinDistance)
|
|
||||||
SortByDistance(targetList, targetType == SelectAggroTarget.MinDistance);
|
|
||||||
|
|
||||||
// then reverse the sorting for MIN sortings
|
|
||||||
if (targetType == SelectAggroTarget.MinThreat)
|
|
||||||
targetList.Reverse();
|
|
||||||
|
|
||||||
// now pop the first <offset> elements
|
|
||||||
while (offset != 0)
|
|
||||||
{
|
|
||||||
targetList.RemoveAt(0);
|
|
||||||
--offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
// maybe nothing fulfills the predicate
|
// maybe nothing fulfills the predicate
|
||||||
if (targetList.Empty())
|
if (targetList.Empty())
|
||||||
@@ -262,9 +215,6 @@ namespace Game.AI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// filter by predicate
|
|
||||||
targetList.RemoveAll(target => { return !selector.Check(target); });
|
|
||||||
|
|
||||||
// shortcut: the list isn't gonna get any larger
|
// shortcut: the list isn't gonna get any larger
|
||||||
if (targetList.Count <= offset)
|
if (targetList.Count <= offset)
|
||||||
{
|
{
|
||||||
@@ -287,6 +237,9 @@ namespace Game.AI
|
|||||||
--offset;
|
--offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// then finally filter by predicate
|
||||||
|
targetList.RemoveAll(target => { return !selector.Check(target); });
|
||||||
|
|
||||||
if (targetList.Count <= num)
|
if (targetList.Count <= num)
|
||||||
return targetList;
|
return targetList;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user