From 9d3c7c4ab0c9eb55970c12f6818c7f8e6d9ec2f2 Mon Sep 17 00:00:00 2001 From: Trazom62 Date: Sat, 10 Apr 2010 13:52:33 +0200 Subject: Fix Crash in FoS. Fixes issue #1566. + add support of minimum distance criteria in SelectTarget. --HG-- branch : trunk --- src/game/UnitAI.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'src/game/UnitAI.cpp') 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 { +struct DefaultTargetSelector : public std::unary_function +{ 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) -- cgit v1.2.3