diff options
-rw-r--r-- | src/game/Object.cpp | 8 | ||||
-rw-r--r-- | src/game/Object.h | 1 | ||||
-rw-r--r-- | src/game/Spell.cpp | 7 | ||||
-rw-r--r-- | src/game/Spell.h | 10 |
4 files changed, 20 insertions, 6 deletions
diff --git a/src/game/Object.cpp b/src/game/Object.cpp index d114d1e82ca..7599245eaac 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -1159,6 +1159,14 @@ float WorldObject::GetDistance(const float x, const float y, const float z) cons return ( dist > 0 ? dist : 0); } +float WorldObject::GetDistanceSq(const float &x, const float &y, const float &z) const +{ + float dx = GetPositionX() - x; + float dy = GetPositionY() - y; + float dz = GetPositionZ() - z; + return dx*dx + dy*dy + dz*dz; +} + float WorldObject::GetDistance2d(const WorldObject* obj) const { float dx = GetPositionX() - obj->GetPositionX(); diff --git a/src/game/Object.h b/src/game/Object.h index 187092d5779..d4d9759ed1b 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -435,6 +435,7 @@ class TRINITY_DLL_SPEC WorldObject : public Object float GetDistance( const WorldObject* obj ) const; float GetDistance(const float x, const float y, const float z) const; + float GetDistanceSq(const float &x, const float &y, const float &z) const; float GetDistance2d(const WorldObject* obj) const; float GetDistance2d(const float x, const float y) const; float GetDistanceZ(const WorldObject* obj) const; diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index e17a360f90f..6f3f60a817a 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1386,7 +1386,7 @@ void Spell::SearchChainTarget(std::list<Unit*> &TagUnitMap, float max_range, uin void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, const uint32 &type, SpellTargets TargetType, uint32 entry) { - float x, y; + float x, y, z; if(type == PUSH_DEST_CENTER) { if(!m_targets.HasDest()) @@ -1396,6 +1396,7 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, const u } x = m_targets.m_destX; y = m_targets.m_destY; + z = m_targets.m_destZ; } else if(type == PUSH_TARGET_CENTER) { @@ -1407,14 +1408,16 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, const u } x = target->GetPositionX(); y = target->GetPositionY(); + z = target->GetPositionZ(); } else { x = m_caster->GetPositionX(); y = m_caster->GetPositionY(); + z = m_caster->GetPositionZ(); } - Trinity::SpellNotifierCreatureAndPlayer notifier(*this, TagUnitMap, radius, type, TargetType, entry); + Trinity::SpellNotifierCreatureAndPlayer notifier(*this, TagUnitMap, radius, type, TargetType, entry, x, y, z); if((m_spellInfo->AttributesEx3 & SPELL_ATTR_EX3_PLAYERS_ONLY) || TargetType == SPELL_TARGETS_ENTRY && !entry) m_caster->GetMap()->VisitWorld(x, y, radius, notifier); diff --git a/src/game/Spell.h b/src/game/Spell.h index 7faa75a8cd8..d7ca8cdd2b6 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -580,14 +580,16 @@ namespace Trinity std::list<Unit*> *i_data; Spell &i_spell; const uint32& i_push_type; - float i_radius; + float i_radius, i_radiusSq; SpellTargets i_TargetType; Unit* i_caster; uint32 i_entry; + float i_x, i_y, i_z; SpellNotifierCreatureAndPlayer(Spell &spell, std::list<Unit*> &data, float radius, const uint32 &type, - SpellTargets TargetType = SPELL_TARGETS_ENEMY, uint32 entry = 0) - : i_data(&data), i_spell(spell), i_push_type(type), i_radius(radius), i_TargetType(TargetType), i_entry(entry) + SpellTargets TargetType = SPELL_TARGETS_ENEMY, uint32 entry = 0, float x = 0, float y = 0, float z = 0) + : i_data(&data), i_spell(spell), i_push_type(type), i_radius(radius), i_radiusSq(radius*radius) + , i_TargetType(TargetType), i_entry(entry), i_x(x), i_y(y), i_z(z) { i_caster = spell.GetCaster(); } @@ -653,7 +655,7 @@ namespace Trinity i_data->push_back(itr->getSource()); break; default: - if((itr->getSource()->GetDistance(i_spell.m_targets.m_destX, i_spell.m_targets.m_destY, i_spell.m_targets.m_destZ) < i_radius )) + if((itr->getSource()->GetDistanceSq(i_x, i_y, i_z) < i_radiusSq)) i_data->push_back(itr->getSource()); break; } |