aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Entities/Creature/Creature.cpp11
-rwxr-xr-xsrc/server/game/Entities/Creature/Creature.h1
-rwxr-xr-xsrc/server/game/Grids/Notifiers/GridNotifiers.h40
-rwxr-xr-xsrc/server/game/Grids/Notifiers/GridNotifiersImpl.h13
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)
{