Core/Misc: Add new function for selection nearest player in given distance
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user