aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/Spell.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2011-01-21 23:42:51 +0100
committerShauren <shauren.trinity@gmail.com>2011-01-21 23:42:51 +0100
commitc2690f748bcc42a1818b90336e81fb586588dd1e (patch)
tree86c513b372d3a75455b442a8bf856ac38570801f /src/server/game/Spells/Spell.cpp
parent76e4b6dda48c7ac20b2b6bfc874fd89deea9398b (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-xsrc/server/game/Spells/Spell.cpp30
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();
+ }
+}