diff options
author | Machiavelli <machiavelli.trinity@gmail.com> | 2011-01-15 19:40:06 +0100 |
---|---|---|
committer | Machiavelli <machiavelli.trinity@gmail.com> | 2011-01-15 19:40:06 +0100 |
commit | 38816cb1dfc212c2fbf2ff8c454257426c6564b3 (patch) | |
tree | e0dbbf1c014af606877a75c8b1443052827b3643 /src | |
parent | 52ec32e7402a9098e00bc1fa1784c5b558d68775 (diff) |
Core/Spells: Implement SPELL_ATTR6_IGNORE_CROWD_CONTROL_TARGETS (0x00000100). Spells with this attribute flag (Avenger's Shield, Hammer of Righteousness, Shield of Righteousness, Felguard Cleave, Fel Iron Bomb) will ignore secondary targets that are under the effect of crowd control aura's.
Thanks to Shauren for advices.
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Miscellaneous/SharedDefines.h | 2 | ||||
-rwxr-xr-x | src/server/game/Spells/Spell.cpp | 12 |
2 files changed, 9 insertions, 5 deletions
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 3f4a853d523..d8d120f527d 100755 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -487,7 +487,7 @@ enum SpellAttr6 SPELL_ATTR6_UNK5 = 0x00000020, // 5 SPELL_ATTR6_UNK6 = 0x00000040, // 6 SPELL_ATTR6_UNK7 = 0x00000080, // 7 - SPELL_ATTR6_UNK8 = 0x00000100, // 8 + SPELL_ATTR6_IGNORE_CROWD_CONTROL_TARGETS = 0x00000100, // 8 SPELL_ATTR6_UNK9 = 0x00000200, // 9 SPELL_ATTR6_UNK10 = 0x00000400, // 10 SPELL_ATTR6_NOT_IN_RAID_INSTANCE = 0x00000800, // 11 not usable in raid instance diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index f0bc46aec98..04da8686a86 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1790,15 +1790,19 @@ void Spell::SearchChainTarget(std::list<Unit*> &TagUnitMap, float max_range, uin tempUnitMap.sort(Trinity::ObjectDistanceOrderPred(cur)); next = tempUnitMap.begin(); - if (cur->GetDistance(*next) > CHAIN_SPELL_JUMP_RADIUS) + if (cur->GetDistance(*next) > CHAIN_SPELL_JUMP_RADIUS) // Don't search beyond the max jump radius break; - while ((m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MELEE + + // Check if (*next) is a valid chain target. If not, don't add to TagUnitMap, and repeat loop. + // If you want to add any conditions to exclude a target from TagUnitMap, add condition in this while() loop. + while ((m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MELEE && !m_caster->isInFrontInMap(*next, max_range)) || !m_caster->canSeeOrDetect(*next) - || !cur->IsWithinLOSInMap(*next)) + || !cur->IsWithinLOSInMap(*next) + || ((GetSpellInfo()->AttributesEx6 & SPELL_ATTR6_IGNORE_CROWD_CONTROL_TARGETS) && !(*next)->CanFreeMove())) { ++next; - if (next == tempUnitMap.end() || cur->GetDistance(*next) > CHAIN_SPELL_JUMP_RADIUS) + if (next == tempUnitMap.end() || cur->GetDistance(*next) > CHAIN_SPELL_JUMP_RADIUS) // Don't search beyond the max jump radius return; } } |