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;
|
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)
|
void Creature::SendAIReaction(AiReaction reactionType)
|
||||||
{
|
{
|
||||||
WorldPacket data(SMSG_AI_REACTION, 12);
|
WorldPacket data(SMSG_AI_REACTION, 12);
|
||||||
|
|||||||
@@ -584,6 +584,7 @@ class Creature : public Unit, public GridObject<Creature>
|
|||||||
|
|
||||||
Unit* SelectNearestTarget(float dist = 0) const;
|
Unit* SelectNearestTarget(float dist = 0) const;
|
||||||
Unit* SelectNearestTargetInAttackDistance(float dist = 0) const;
|
Unit* SelectNearestTargetInAttackDistance(float dist = 0) const;
|
||||||
|
Player* SelectNearestPlayer(float distance = 0) const;
|
||||||
|
|
||||||
void DoFleeToGetAssistance();
|
void DoFleeToGetAssistance();
|
||||||
void CallForHelp(float fRadius);
|
void CallForHelp(float fRadius);
|
||||||
|
|||||||
@@ -449,6 +449,22 @@ namespace Trinity
|
|||||||
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
|
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>
|
template<class Do>
|
||||||
struct PlayerWorker
|
struct PlayerWorker
|
||||||
{
|
{
|
||||||
@@ -1144,6 +1160,30 @@ namespace Trinity
|
|||||||
float i_range;
|
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
|
class AllFriendlyCreaturesInGrid
|
||||||
{
|
{
|
||||||
public:
|
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>
|
template<class Builder>
|
||||||
void Trinity::LocalizedPacketDo<Builder>::operator()(Player* p)
|
void Trinity::LocalizedPacketDo<Builder>::operator()(Player* p)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user