From a233e7b9d81329b17548188e1fe0d9708605fd53 Mon Sep 17 00:00:00 2001 From: Lopin Date: Mon, 11 Jul 2011 16:17:21 +0200 Subject: [PATCH] Core/Misc: Add new function for selection nearest player in given distance --- .../game/Entities/Creature/Creature.cpp | 11 +++++ src/server/game/Entities/Creature/Creature.h | 1 + .../game/Grids/Notifiers/GridNotifiers.h | 40 +++++++++++++++++++ .../game/Grids/Notifiers/GridNotifiersImpl.h | 13 ++++++ 4 files changed, 65 insertions(+) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 2f917465c6..318528b040 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 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 a50c499e9e..3a5b2d1c5d 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 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 426ce41077..80cebaf413 100755 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -449,6 +449,22 @@ namespace Trinity template void Visit(GridRefManager &) {} }; + template + 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 void Visit(GridRefManager &) {} + }; + template 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 67bbddacec..dcd4207e3e 100755 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -398,6 +398,19 @@ void Trinity::PlayerSearcher::Visit(PlayerMapType &m) } } +template +void Trinity::PlayerLastSearcher::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 void Trinity::LocalizedPacketDo::operator()(Player* p) {