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.cpp42
1 files changed, 19 insertions, 23 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index b66570a58d8..67cafa53df6 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -2878,13 +2878,9 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered
}
LoadScripts();
- if (m_caster->GetTypeId() == TYPEID_PLAYER)
- m_caster->ToPlayer()->SetSpellModTakingSpell(this, true);
// Fill cost data (do not use power for item casts)
- if (!m_CastItem)
- m_powerCost = m_spellInfo->CalcPowerCost(m_caster, m_spellSchoolMask);
- if (m_caster->GetTypeId() == TYPEID_PLAYER)
- m_caster->ToPlayer()->SetSpellModTakingSpell(this, false);
+ if (m_CastItem)
+ m_powerCost = m_spellInfo->CalcPowerCost(m_caster, m_spellSchoolMask, this);
// Set combo point requirement
if ((_triggeredCastFlags & TRIGGERED_IGNORE_COMBO_POINTS) || m_CastItem || !m_caster->m_playerMovingMe)
@@ -2908,11 +2904,6 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered
triggeredByAura->GetBase()->SetDuration(0);
}
- // cleanup after mod system
- // triggered spell pointer can be not removed in some cases
- if (m_caster->GetTypeId() == TYPEID_PLAYER)
- m_caster->ToPlayer()->SetSpellModTakingSpell(this, false);
-
if (param1 || param2)
SendCastResult(result, &param1, &param2);
else
@@ -2929,10 +2920,8 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered
{
if (!player->GetCommandStatus(CHEAT_CASTTIME))
{
- player->SetSpellModTakingSpell(this, true);
// calculate cast time (calculated after first CheckCast check to prevent charge counting for first CheckCast fail)
m_casttime = m_spellInfo->CalcCastTime(player->getLevel(), this);
- player->SetSpellModTakingSpell(this, false);
}
else
m_casttime = 0; // Set cast time to 0 if .cheat casttime is enabled.
@@ -3058,6 +3047,23 @@ void Spell::cancel()
void Spell::cast(bool skipCheck)
{
+ Player* modOwner = m_caster->GetSpellModOwner();
+ Spell* lastSpellMod = nullptr;
+ if (modOwner)
+ {
+ lastSpellMod = modOwner->m_spellModTakingSpell;
+ if (lastSpellMod)
+ modOwner->SetSpellModTakingSpell(lastSpellMod, false);
+ }
+
+ _cast(skipCheck);
+
+ if (lastSpellMod)
+ modOwner->SetSpellModTakingSpell(lastSpellMod, true);
+}
+
+void Spell::_cast(bool skipCheck)
+{
// update pointers base at GUIDs to prevent access to non-existed already object
if (!UpdatePointers())
{
@@ -3114,8 +3120,6 @@ void Spell::cast(bool skipCheck)
SendCastResult(castResult, &param1, &param2);
SendInterrupted(0);
- // cleanup after mod system
- // triggered spell pointer can be not removed in some cases
if (m_caster->GetTypeId() == TYPEID_PLAYER)
m_caster->ToPlayer()->SetSpellModTakingSpell(this, false);
@@ -3139,8 +3143,6 @@ void Spell::cast(bool skipCheck)
SendCastResult(SPELL_FAILED_DONT_REPORT);
SendInterrupted(0);
- // cleanup after mod system
- // triggered spell pointer can be not removed in some cases
m_caster->ToPlayer()->SetSpellModTakingSpell(this, false);
finish(false);
@@ -7241,13 +7243,7 @@ void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier)
}
}
- if (Player* modOwner = m_caster->GetSpellModOwner())
- modOwner->SetSpellModTakingSpell(this, true);
-
targetInfo.crit = m_caster->IsSpellCrit(unit, m_spellInfo, m_spellSchoolMask, m_attackType);
-
- if (Player* modOwner = m_caster->GetSpellModOwner())
- modOwner->SetSpellModTakingSpell(this, false);
}
SpellCastResult Spell::CanOpenLock(uint32 effIndex, uint32 lockId, SkillType& skillId, int32& reqSkillValue, int32& skillValue)