diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Creature/Creature.cpp | 11 | ||||
-rwxr-xr-x | src/server/game/Entities/Creature/Creature.h | 1 | ||||
-rwxr-xr-x | src/server/game/Grids/Notifiers/GridNotifiers.h | 40 | ||||
-rwxr-xr-x | src/server/game/Grids/Notifiers/GridNotifiersImpl.h | 13 |
4 files changed, 65 insertions, 0 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 2f917465c6c..318528b0406 100755 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -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); diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index a50c499e9e8..3a5b2d1c5d1 100755 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -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); diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 426ce41077d..80cebaf413f 100755 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -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: diff --git a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h index 67bbddacec1..dcd4207e3e1 100755 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -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) { |