Core/GameObjects: Fixed Frozen Trap target selection

Closes #14238
Closes #17517
This commit is contained in:
Shauren
2016-10-30 11:12:57 +01:00
parent fb634478c4
commit f0ab95f19c
2 changed files with 10 additions and 8 deletions

View File

@@ -511,11 +511,9 @@ void GameObject::Update(uint32 diff)
if (Unit* owner = GetOwner())
{
// Hunter trap: Search units which are unfriendly to the trap's owner
Trinity::AnyUnfriendlyNoTotemUnitInObjectRangeCheck checker(this, owner, radius);
Trinity::UnitSearcher<Trinity::AnyUnfriendlyNoTotemUnitInObjectRangeCheck> searcher(this, target, checker);
VisitNearbyGridObject(radius, searcher);
if (!target)
VisitNearbyWorldObject(radius, searcher);
Trinity::NearestUnfriendlyNoTotemUnitInObjectRangeCheck checker(this, owner, radius);
Trinity::UnitLastSearcher<Trinity::NearestUnfriendlyNoTotemUnitInObjectRangeCheck> searcher(this, target, checker);
VisitNearbyObject(radius, searcher);
}
else
{

View File

@@ -830,10 +830,10 @@ namespace Trinity
float i_range;
};
class AnyUnfriendlyNoTotemUnitInObjectRangeCheck
class NearestUnfriendlyNoTotemUnitInObjectRangeCheck
{
public:
AnyUnfriendlyNoTotemUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) : i_obj(obj), i_funit(funit), i_range(range) { }
NearestUnfriendlyNoTotemUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) : i_obj(obj), i_funit(funit), i_range(range) { }
bool operator()(Unit* u)
{
if (!u->IsAlive())
@@ -848,7 +848,11 @@ namespace Trinity
if (!u->isTargetableForAttack(false))
return false;
return i_obj->IsWithinDistInMap(u, i_range) && !i_funit->IsFriendlyTo(u);
if (!i_obj->IsWithinDistInMap(u, i_range) || i_funit->IsFriendlyTo(u))
return false;
i_range = i_obj->GetDistance(*u);
return true;
}
private:
WorldObject const* i_obj;