aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrazom62 <none@none>2010-04-10 13:52:33 +0200
committerTrazom62 <none@none>2010-04-10 13:52:33 +0200
commit9d3c7c4ab0c9eb55970c12f6818c7f8e6d9ec2f2 (patch)
tree77d74e3ae2ee35540e6663688c86d6382a506bc0
parent4a8bf5900dbd3fa9b7d9d71989d46dad8112fd7f (diff)
Fix Crash in FoS.
Fixes issue #1566. + add support of minimum distance criteria in SelectTarget. --HG-- branch : trunk
-rw-r--r--src/game/UnitAI.cpp21
-rw-r--r--src/scripts/northrend/frozen_halls/forge_of_souls/boss_bronjahm.cpp12
2 files changed, 23 insertions, 10 deletions
diff --git a/src/game/UnitAI.cpp b/src/game/UnitAI.cpp
index 0404a284b29..7ff4a74b522 100644
--- a/src/game/UnitAI.cpp
+++ b/src/game/UnitAI.cpp
@@ -83,23 +83,34 @@ bool UnitAI::DoSpellAttackIfReady(uint32 spell)
}
// default predicate function to select target based on distance, player and/or aura criteria
-struct DefaultTargetSelector : public std::unary_function<Unit *, bool> {
+struct DefaultTargetSelector : public std::unary_function<Unit *, bool>
+{
const Unit *me;
float m_dist;
bool m_playerOnly;
int32 m_aura;
// pUnit: the reference unit
- // dist: if 0: ignored, if not 0: maximum distance to the reference unit
+ // dist: if 0: ignored, if > 0: maximum distance to the reference unit, if < 0: minimum distance to the reference unit
// playerOnly: self explaining
// aura: if 0: ignored, if > 0: the target shall have the aura, if < 0, the target shall NOT have the aura
DefaultTargetSelector(const Unit *pUnit, float dist, bool playerOnly, int32 aura) : me(pUnit), m_dist(dist), m_playerOnly(playerOnly), m_aura(aura) {}
- bool operator() (const Unit *pTarget) {
- if (m_playerOnly && (!pTarget || pTarget->GetTypeId() != TYPEID_PLAYER))
+ bool operator() (const Unit *pTarget)
+ {
+ if (!me)
+ return false;
+
+ if (!pTarget)
+ return false;
+
+ if (m_playerOnly && (pTarget->GetTypeId() != TYPEID_PLAYER))
+ return false;
+
+ if (m_dist > 0.0f && !me->IsWithinCombatRange(pTarget, m_dist))
return false;
- if (m_dist && (!me || !pTarget || !me->IsWithinCombatRange(pTarget, m_dist)))
+ if (m_dist < 0.0f && me->IsWithinCombatRange(pTarget, -m_dist))
return false;
if (m_aura)
diff --git a/src/scripts/northrend/frozen_halls/forge_of_souls/boss_bronjahm.cpp b/src/scripts/northrend/frozen_halls/forge_of_souls/boss_bronjahm.cpp
index 5af3582e0a3..f9764885404 100644
--- a/src/scripts/northrend/frozen_halls/forge_of_souls/boss_bronjahm.cpp
+++ b/src/scripts/northrend/frozen_halls/forge_of_souls/boss_bronjahm.cpp
@@ -114,14 +114,16 @@ struct boss_bronjahmAI : public ScriptedAI
// Cast aura spell on all players farther than 10y
void ApplySoulStorm()
{
- const std::list<HostileReference*>& threatlist = m_creature->getThreatManager().getThreatList();
- if (threatlist.empty())
+ std::list<Unit*> targetList;
+
+ SelectTargetList(targetList, 100, SELECT_TARGET_TOPAGGRO, -10.0f);
+ if (targetList.empty())
return;
- for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
+ for (std::list<Unit *>::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr)
{
- Unit* pUnit = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
- if (pUnit && pUnit->isAlive() && pUnit->GetDistance(m_creature) > 10.0f)
+ Unit* pUnit = (*itr);
+ if (pUnit && pUnit->isAlive())
m_creature->CastSpell(pUnit, DUNGEON_MODE(SPELL_SOULSTORM_AURA,H_SPELL_SOULSTORM_AURA), true);
}
}