diff options
author | Shauren <shauren.trinity@gmail.com> | 2011-01-21 23:42:51 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2011-01-21 23:42:51 +0100 |
commit | c2690f748bcc42a1818b90336e81fb586588dd1e (patch) | |
tree | 86c513b372d3a75455b442a8bf856ac38570801f /src/server/game/Spells/Spell.cpp | |
parent | 76e4b6dda48c7ac20b2b6bfc874fd89deea9398b (diff) |
Scripts/Spells: Implemented UnitTargetHandler spell script hook, it can be used to filter area targeting spells
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
-rwxr-xr-x | src/server/game/Spells/Spell.cpp | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 04da8686a86..906a40b2261 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2422,6 +2422,8 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) break; } + CallScriptAfterUnitTargetSelectHandlers(unitList, SpellEffIndex(i)); + for (std::list<Unit*>::iterator itr = unitList.begin(); itr != unitList.end(); ++itr) AddUnitTarget(*itr, i); } @@ -2834,17 +2836,6 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) ++itr; } break; - case 69782: case 69796: // Ooze Flood - case 69798: case 69801: // Ooze Flood - // get 2 targets except 2 nearest - unitList.sort(Trinity::ObjectDistanceOrderPred(m_caster)); - unitList.resize(4); - while (unitList.size() > 2) - unitList.pop_front(); - // crashfix - if (unitList.empty()) - return; - break; case 68921: case 69049: // Soulstorm for (std::list<Unit*>::iterator itr = unitList.begin(); itr != unitList.end();) { @@ -2917,6 +2908,9 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) } } } + + CallScriptAfterUnitTargetSelectHandlers(unitList, SpellEffIndex(i)); + for (std::list<Unit*>::iterator itr = unitList.begin(); itr != unitList.end(); ++itr) AddUnitTarget(*itr, i); } @@ -7404,3 +7398,17 @@ void Spell::CallScriptAfterHitHandlers() (*scritr)->_FinishScriptCall(); } } + +void Spell::CallScriptAfterUnitTargetSelectHandlers(std::list<Unit*>& unitTargets, SpellEffIndex effIndex) +{ + for(std::list<SpellScript *>::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr) + { + (*scritr)->_PrepareScriptCall(SPELL_SCRIPT_HOOK_UNIT_TARGET_SELECT); + std::list<SpellScript::UnitTargetHandler>::iterator hookItrEnd = (*scritr)->OnUnitTargetSelect.end(), hookItr = (*scritr)->OnUnitTargetSelect.begin(); + for(; hookItr != hookItrEnd ; ++hookItr) + if ((*hookItr).IsEffectAffected(m_spellInfo, effIndex)) + (*hookItr).Call(*scritr, unitTargets); + + (*scritr)->_FinishScriptCall(); + } +} |