aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDiscover- <amort11@hotmail.com>2013-09-30 10:11:02 +0200
committerDiscover- <amort11@hotmail.com>2013-09-30 10:11:02 +0200
commit80ce30ac7d5bd8bb9e3f79f5b157077722669f07 (patch)
treecc9cbed58448f4b571c9b6fa1a2529b41827c7f0 /src
parent15e7f7ab2141d2f4dcf313974bea06843b578591 (diff)
Core/SAI: Add 'playerOnly' parameters to SMART_TARGET_CLOSEST_ENEMY and SMART_TARGET_CLOSEST_FRIENDLY. Wiki is updated accordingly.
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp8
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h6
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp4
-rw-r--r--src/server/game/Entities/Creature/Creature.h2
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h11
6 files changed, 20 insertions, 13 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index ba1e59e0cc9..c9e1bed6aed 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -2551,7 +2551,7 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder const& e, Unit* invoker /*
case SMART_TARGET_CLOSEST_ENEMY:
{
if (me)
- if (Unit* target = me->SelectNearestTarget(e.target.closestAttackable.maxDist))
+ if (Unit* target = me->SelectNearestTarget(e.target.closestAttackable.maxDist, e.target.closestAttackable.playerOnly))
l->push_back(target);
break;
@@ -2559,7 +2559,7 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder const& e, Unit* invoker /*
case SMART_TARGET_CLOSEST_FRIENDLY:
{
if (me)
- if (Unit* target = DoFindClosestFriendlyInRange(e.target.closestFriendly.maxDist))
+ if (Unit* target = DoFindClosestFriendlyInRange(e.target.closestFriendly.maxDist, e.target.closestFriendly.playerOnly))
l->push_back(target);
break;
@@ -3443,13 +3443,13 @@ void SmartScript::DoFindFriendlyMissingBuff(std::list<Creature*>& list, float ra
cell.Visit(p, grid_creature_searcher, *me->GetMap(), *me, range);
}
-Unit* SmartScript::DoFindClosestFriendlyInRange(float range)
+Unit* SmartScript::DoFindClosestFriendlyInRange(float range, bool playerOnly)
{
if (!me)
return NULL;
Unit* unit = NULL;
- Trinity::AnyFriendlyUnitInObjectRangeCheck u_check(me, me, range);
+ Trinity::AnyFriendlyUnitInObjectRangeCheck u_check(me, me, range, playerOnly);
Trinity::UnitLastSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(me, unit, u_check);
me->VisitNearbyObject(range, searcher);
return unit;
diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h
index b22f2d81b26..b1b9f4d6725 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.h
+++ b/src/server/game/AI/SmartScripts/SmartScript.h
@@ -89,7 +89,7 @@ class SmartScript
Unit* DoSelectLowestHpFriendly(float range, uint32 MinHPDiff);
void DoFindFriendlyCC(std::list<Creature*>& _list, float range);
void DoFindFriendlyMissingBuff(std::list<Creature*>& list, float range, uint32 spellid);
- Unit* DoFindClosestFriendlyInRange(float range);
+ Unit* DoFindClosestFriendlyInRange(float range, bool playerOnly);
void StoreTargetList(ObjectList* targets, uint32 id)
{
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index 90819e7a2c3..56fa7ed1275 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -1021,8 +1021,8 @@ enum SMARTAI_TARGETS
SMART_TARGET_ACTION_INVOKER_VEHICLE = 22, // Unit's vehicle who caused this Event to occur
SMART_TARGET_OWNER_OR_SUMMONER = 23, // Unit's owner or summoner
SMART_TARGET_THREAT_LIST = 24, // All units on creature's threat list
- SMART_TARGET_CLOSEST_ENEMY = 25, // maxDist
- SMART_TARGET_CLOSEST_FRIENDLY = 26, // maxDist
+ SMART_TARGET_CLOSEST_ENEMY = 25, // maxDist, playerOnly
+ SMART_TARGET_CLOSEST_FRIENDLY = 26, // maxDist, playerOnly
SMART_TARGET_END = 27
};
@@ -1109,11 +1109,13 @@ struct SmartTarget
struct
{
uint32 maxDist;
+ uint32 playerOnly;
} closestAttackable;
struct
{
uint32 maxDist;
+ uint32 playerOnly;
} closestFriendly;
struct
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 169d5feae03..06f88f0f37f 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -1709,7 +1709,7 @@ SpellInfo const* Creature::reachWithSpellCure(Unit* victim)
}
// select nearest hostile unit within the given distance (regardless of threat list).
-Unit* Creature::SelectNearestTarget(float dist) const
+Unit* Creature::SelectNearestTarget(float dist, bool playerOnly /* = false */) const
{
CellCoord p(Trinity::ComputeCellCoord(GetPositionX(), GetPositionY()));
Cell cell(p);
@@ -1721,7 +1721,7 @@ Unit* Creature::SelectNearestTarget(float dist) const
if (dist == 0.0f)
dist = MAX_VISIBILITY_DISTANCE;
- Trinity::NearestHostileUnitCheck u_check(this, dist);
+ Trinity::NearestHostileUnitCheck u_check(this, dist, playerOnly);
Trinity::UnitLastSearcher<Trinity::NearestHostileUnitCheck> searcher(this, target, u_check);
TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::NearestHostileUnitCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index b720a063f2d..bb9cc40ace1 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -609,7 +609,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapCreature
void SendAIReaction(AiReaction reactionType);
- Unit* SelectNearestTarget(float dist = 0) const;
+ Unit* SelectNearestTarget(float dist = 0, bool playerOnly = false) const;
Unit* SelectNearestTargetInAttackDistance(float dist = 0) const;
Player* SelectNearestPlayer(float distance = 0) const;
Unit* SelectNearestHostileUnitInAggroRange(bool useLOS = false) const;
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h
index 637e0792a74..d0df63155b2 100644
--- a/src/server/game/Grids/Notifiers/GridNotifiers.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h
@@ -871,10 +871,10 @@ namespace Trinity
class AnyFriendlyUnitInObjectRangeCheck
{
public:
- AnyFriendlyUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) : i_obj(obj), i_funit(funit), i_range(range) {}
+ AnyFriendlyUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range, bool playerOnly = false) : i_obj(obj), i_funit(funit), i_range(range), i_playerOnly(playerOnly) {}
bool operator()(Unit* u)
{
- if (u->IsAlive() && i_obj->IsWithinDistInMap(u, i_range) && i_funit->IsFriendlyTo(u))
+ if (u->IsAlive() && i_obj->IsWithinDistInMap(u, i_range) && i_funit->IsFriendlyTo(u) && (!i_playerOnly || u->GetTypeId() == TYPEID_PLAYER))
return true;
else
return false;
@@ -883,6 +883,7 @@ namespace Trinity
WorldObject const* i_obj;
Unit const* i_funit;
float i_range;
+ bool i_playerOnly;
};
class AnyGroupedUnitInObjectRangeCheck
@@ -1035,7 +1036,7 @@ namespace Trinity
class NearestHostileUnitCheck
{
public:
- explicit NearestHostileUnitCheck(Creature const* creature, float dist = 0) : me(creature)
+ explicit NearestHostileUnitCheck(Creature const* creature, float dist = 0, bool playerOnly = false) : me(creature), i_playerOnly(playerOnly)
{
m_range = (dist == 0 ? 9999 : dist);
}
@@ -1047,6 +1048,9 @@ namespace Trinity
if (!me->IsValidAttackTarget(u))
return false;
+ if (i_playerOnly && u->GetTypeId() != TYPEID_PLAYER)
+ return false;
+
m_range = me->GetDistance(u); // use found unit range as new range limit for next check
return true;
}
@@ -1054,6 +1058,7 @@ namespace Trinity
private:
Creature const* me;
float m_range;
+ bool i_playerOnly;
NearestHostileUnitCheck(NearestHostileUnitCheck const&);
};