aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/Spell.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
-rw-r--r--src/server/game/Spells/Spell.cpp27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 7d85b70d498..0972c84b3e5 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -1404,6 +1404,8 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask, bool
if (m_spellInfo->speed && (unit->IsImmunedToDamage(m_spellInfo) || unit->IsImmunedToSpell(m_spellInfo)))
return SPELL_MISS_IMMUNE;
+ PrepareTargetHitForScripts();
+
if (unit->GetTypeId() == TYPEID_PLAYER)
{
unit->ToPlayer()->GetAchievementMgr().StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, m_spellInfo->Id);
@@ -1639,6 +1641,8 @@ void Spell::DoAllEffectOnTarget(GOTargetInfo *target)
if (!go)
return;
+ PrepareTargetHitForScripts();
+
for (uint32 effectNumber = 0; effectNumber < 3; ++effectNumber)
if (effectMask & (1 << effectNumber))
HandleEffects(NULL, NULL, go, effectNumber);
@@ -1658,6 +1662,8 @@ void Spell::DoAllEffectOnTarget(ItemTargetInfo *target)
if (!target->item || !effectMask)
return;
+ PrepareTargetHitForScripts();
+
for (uint32 effectNumber = 0; effectNumber < 3; ++effectNumber)
if (effectMask & (1 << effectNumber))
HandleEffects(NULL, target->item, NULL, effectNumber);
@@ -3255,6 +3261,8 @@ void Spell::cast(bool skipCheck)
// CAST SPELL
SendSpellCooldown();
+ PrepareTargetHitForScripts();
+
for (uint32 i = 0; i < 3; ++i)
{
switch(m_spellInfo->Effect[i])
@@ -3419,6 +3427,8 @@ void Spell::_handle_immediate_phase()
// handle some immediate features of the spell here
HandleThreatSpells(m_spellInfo->Id);
+ PrepareTargetHitForScripts();
+
m_needSpellLog = IsNeedSendToClient();
for (uint32 j = 0; j < 3; ++j)
{
@@ -4667,17 +4677,22 @@ void Spell::HandleEffects(Unit *pUnitTarget,Item *pItemTarget,GameObject *pGOTar
//we do not need DamageMultiplier here.
damage = CalculateDamage(i, NULL);
+ // execute script effect handler hooks and check if effects was prevented
+ bool preventDefault = false;
for(std::list<SpellScript *>::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr)
{
std::list<SpellScript::EffectHandler>::iterator effEndItr = (*scritr)->EffectHandlers.end(), effItr = (*scritr)->EffectHandlers.begin();
for(; effItr != effEndItr ; ++effItr)
{
- if ((*effItr).IsEffectAffected(m_spellInfo, i))
+ // effect execution can be prevented
+ if (!(*scritr)->_IsEffectPrevented((SpellEffIndex)i) && (*effItr).IsEffectAffected(m_spellInfo, i))
(*effItr).Call(*scritr, (SpellEffIndex)i);
}
+ if (!preventDefault)
+ preventDefault = (*scritr)->_IsDefaultEffectPrevented((SpellEffIndex)i);
}
- if (eff < TOTAL_SPELL_EFFECTS)
+ if (!preventDefault && eff < TOTAL_SPELL_EFFECTS)
{
(this->*SpellEffects[eff])(i);
}
@@ -7290,3 +7305,11 @@ void Spell::LoadScripts()
++itr;
}
}
+
+void Spell::PrepareTargetHitForScripts()
+{
+ for(std::list<SpellScript *>::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr)
+ {
+ (*scritr)->_InitHit();
+ }
+}