Core/Misc: Add new function for selection nearest player in given distance

This commit is contained in:
Lopin
2011-07-11 16:17:21 +02:00
parent e35e4d6e23
commit a233e7b9d8
4 changed files with 65 additions and 0 deletions
@@ -1817,6 +1817,17 @@ Unit* Creature::SelectNearestTargetInAttackDistance(float dist) const
return target;
}
Player* Creature::SelectNearestPlayer(float distance) const
{
Player* target = NULL;
Trinity::NearestPlayerInObjectRangeCheck checker(this, distance);
Trinity::PlayerLastSearcher<Trinity::NearestPlayerInObjectRangeCheck> searcher(this, target, checker);
VisitNearbyObject(distance, searcher);
return target;
}
void Creature::SendAIReaction(AiReaction reactionType)
{
WorldPacket data(SMSG_AI_REACTION, 12);
@@ -584,6 +584,7 @@ class Creature : public Unit, public GridObject<Creature>
Unit* SelectNearestTarget(float dist = 0) const;
Unit* SelectNearestTargetInAttackDistance(float dist = 0) const;
Player* SelectNearestPlayer(float distance = 0) const;
void DoFleeToGetAssistance();
void CallForHelp(float fRadius);
@@ -449,6 +449,22 @@ namespace Trinity
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
template<class Check>
struct PlayerLastSearcher
{
uint32 i_phaseMask;
Player* &i_object;
Check& i_check;
PlayerLastSearcher(WorldObject const* searcher, Player*& result, Check& check) : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check)
{
}
void Visit(PlayerMapType& m);
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
};
template<class Do>
struct PlayerWorker
{
@@ -1144,6 +1160,30 @@ namespace Trinity
float i_range;
};
class NearestPlayerInObjectRangeCheck
{
public:
NearestPlayerInObjectRangeCheck(WorldObject const* obj, float range) : i_obj(obj), i_range(range)
{
}
bool operator()(Player* u)
{
if (u->isAlive() && i_obj->IsWithinDistInMap(u, i_range))
{
i_range = i_obj->GetDistance(u);
return true;
}
return false;
}
private:
WorldObject const* i_obj;
float i_range;
NearestPlayerInObjectRangeCheck(NearestPlayerInObjectRangeCheck const&);
};
class AllFriendlyCreaturesInGrid
{
public:
@@ -398,6 +398,19 @@ void Trinity::PlayerSearcher<Check>::Visit(PlayerMapType &m)
}
}
template<class Check>
void Trinity::PlayerLastSearcher<Check>::Visit(PlayerMapType& m)
{
for (PlayerMapType::iterator itr = m.begin(); itr != m.end(); ++itr)
{
if (!itr->getSource()->InSamePhase(i_phaseMask))
continue;
if (i_check(itr->getSource()))
i_object = itr->getSource();
}
}
template<class Builder>
void Trinity::LocalizedPacketDo<Builder>::operator()(Player* p)
{