diff options
| author | megamage <none@none> | 2008-12-04 23:00:35 -0600 |
|---|---|---|
| committer | megamage <none@none> | 2008-12-04 23:00:35 -0600 |
| commit | d36672cd7e4ae3d328f30c020c5421668ad4cb5e (patch) | |
| tree | 572ff4758483da0d2d723ab33e028d48670de76e /src/game/Spell.cpp | |
| parent | 450c0a45b87fb043f39298cf94c7f7254ade2fc5 (diff) | |
*Update spell range calculation. Original patch by QAston.
--HG--
branch : trunk
Diffstat (limited to 'src/game/Spell.cpp')
| -rw-r--r-- | src/game/Spell.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 35e5dbd815f..56247e1bcbe 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4670,19 +4670,35 @@ bool Spell::CanAutoCast(Unit* target) uint8 Spell::CheckRange(bool strict) { - float range_mod; + //float range_mod; // self cast doesn't need range checking -- also for Starshards fix if (m_spellInfo->rangeIndex == 1) return 0; - if (strict) //add radius of caster + // i do not know why we need this + /*if (strict) //add radius of caster range_mod = 1.25; else //add radius of caster and ~5 yds "give" - range_mod = 6.25; + range_mod = 6.25;*/ SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex); - float max_range = GetSpellMaxRange(srange) + range_mod; - float min_range = GetSpellMinRange(srange); + float max_range, min_range; + float range_type = GetSpellRangeType(srange); + if(range_type == SPELL_RANGE_DEFAULT) + { + max_range = GetSpellMaxRange(srange);// + range_mod; + min_range = GetSpellMinRange(srange); + } + else if(range_type == SPELL_RANGE_MELEE) + { + max_range = ATTACK_DISTANCE; + min_range = GetSpellMinRange(srange); + } + else + { + max_range = GetSpellMaxRange(srange);// + range_mod; + min_range = ATTACK_DISTANCE; + } if(Player* modOwner = m_caster->GetSpellModOwner()) modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RANGE, max_range, this); @@ -4694,8 +4710,10 @@ uint8 Spell::CheckRange(bool strict) // distance from target center in checks if(!m_caster->IsWithinCombatDist(target, max_range)) return SPELL_FAILED_OUT_OF_RANGE; //0x5A; + if(min_range && m_caster->IsWithinCombatDist(target, min_range)) // skip this check if min_range = 0 return SPELL_FAILED_TOO_CLOSE; + if( m_caster->GetTypeId() == TYPEID_PLAYER && (m_spellInfo->FacingCasterFlags & SPELL_FACING_FLAG_INFRONT) && !m_caster->HasInArc( M_PI, target ) ) return SPELL_FAILED_UNIT_NOT_INFRONT; |
