aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorthenecromancer <none@none>2009-05-28 23:05:52 +0200
committerthenecromancer <none@none>2009-05-28 23:05:52 +0200
commitbc55209b3e2723ef39935d6c4ff3f8b442b98f1c (patch)
tree2b10745a65c1b3fcc18bdf9fe06a651261f9d55f /src
parent39dd09532bb990f40e22cbbfd002f9b0aa24ef6f (diff)
Restore used spell mods if spell cast fails.
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/Player.cpp22
-rw-r--r--src/game/Player.h2
-rw-r--r--src/game/Spell.cpp9
3 files changed, 30 insertions, 3 deletions
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index e11b7e168ef..b036fd1118e 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -16706,6 +16706,28 @@ void Player::AddSpellMod(SpellModifier* mod, bool apply)
}
}
+// Restore spellmods in case of failed cast
+void Player::RestoreSpellMods(Spell const* spell)
+{
+ if(!spell || (m_SpellModRemoveCount == 0))
+ return;
+
+ for(int i=0;i<MAX_SPELLMOD;++i)
+ {
+ for (SpellModList::iterator itr = m_spellMods[i].begin(); itr != m_spellMods[i].end();++itr)
+ {
+ SpellModifier *mod = *itr;
+
+ if (mod && mod->charges == -1 && mod->lastAffected == spell)
+ {
+ mod->lastAffected = NULL;
+ mod->charges = 1;
+ m_SpellModRemoveCount--;
+ }
+ }
+ }
+}
+
void Player::RemoveSpellMods(Spell const* spell)
{
if(!spell || (m_SpellModRemoveCount == 0))
diff --git a/src/game/Player.h b/src/game/Player.h
index 27e088f5131..aff836b33c4 100644
--- a/src/game/Player.h
+++ b/src/game/Player.h
@@ -1447,6 +1447,7 @@ class TRINITY_DLL_SPEC Player : public Unit
bool IsAffectedBySpellmod(SpellEntry const *spellInfo, SpellModifier *mod, Spell const* spell = NULL);
template <class T> T ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell const* spell = NULL);
void RemoveSpellMods(Spell const* spell);
+ void RestoreSpellMods(Spell const* spell);
bool HasSpellCooldown(uint32 spell_id) const
{
@@ -2396,4 +2397,3 @@ template <class T> T Player::ApplySpellMod(uint32 spellId, SpellModOp op, T &bas
return T(diff);
}
#endif
-
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 66a237d9198..e9ab64f87d4 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -2720,9 +2720,14 @@ void Spell::finish(bool ok)
if(!m_caster->IsNonMeleeSpellCasted(false, false, true))
m_caster->clearUnitState(UNIT_STAT_CASTING);
+ if(!ok)
+ {
+ //restore spell mods
+ if (m_caster->GetTypeId() == TYPEID_PLAYER)
+ ((Player*)m_caster)->RestoreSpellMods(this);
+ return;
+ }
// other code related only to successfully finished spells
- if(!ok)
- return;
//remove spell mods
if (m_caster->GetTypeId() == TYPEID_PLAYER)