aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuras.cpp8
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp2
-rwxr-xr-xsrc/server/game/Spells/SpellScript.cpp32
-rwxr-xr-xsrc/server/game/Spells/SpellScript.h20
4 files changed, 35 insertions, 27 deletions
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index f50452feb80..b77f5923b63 100755
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -1753,7 +1753,7 @@ void Aura::CallScriptAfterEffectApplyHandlers(AuraEffect const * aurEff, AuraApp
{
for(std::list<AuraScript *>::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr)
{
- (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_APPLY, aurApp);
+ (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_AFTER_APPLY, aurApp);
std::list<AuraScript::EffectApplyHandler>::iterator effEndItr = (*scritr)->AfterEffectApply.end(), effItr = (*scritr)->AfterEffectApply.begin();
for(; effItr != effEndItr ; ++effItr)
{
@@ -1768,7 +1768,7 @@ void Aura::CallScriptAfterEffectRemoveHandlers(AuraEffect const * aurEff, AuraAp
{
for(std::list<AuraScript *>::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end() ; ++scritr)
{
- (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_REMOVE, aurApp);
+ (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_EFFECT_AFTER_REMOVE, aurApp);
std::list<AuraScript::EffectApplyHandler>::iterator effEndItr = (*scritr)->AfterEffectRemove.end(), effItr = (*scritr)->AfterEffectRemove.begin();
for(; effItr != effEndItr ; ++effItr)
{
@@ -1869,8 +1869,6 @@ void Aura::CallScriptEffectAbsorbHandlers(AuraEffect * aurEff, AuraApplication c
if ((*effItr).IsEffectAffected(m_spellProto, aurEff->GetEffIndex()))
(*effItr).Call(*scritr, aurEff, dmgInfo, absorbAmount);
}
- if (!defaultPrevented)
- defaultPrevented = (*scritr)->_IsDefaultActionPrevented();
(*scritr)->_FinishScriptCall();
}
}
@@ -1901,8 +1899,6 @@ void Aura::CallScriptEffectManaShieldHandlers(AuraEffect * aurEff, AuraApplicati
if ((*effItr).IsEffectAffected(m_spellProto, aurEff->GetEffIndex()))
(*effItr).Call(*scritr, aurEff, dmgInfo, absorbAmount);
}
- if (!defaultPrevented)
- defaultPrevented = (*scritr)->_IsDefaultActionPrevented();
(*scritr)->_FinishScriptCall();
}
}
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index a0ac2a27fdd..90789041422 100755
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -1297,7 +1297,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex)
break;
case SPELLFAMILY_WARLOCK:
// Life Tap
- if (m_spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_WARLOCK_LIFETAP)
+ if ((m_spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_WARLOCK_LIFETAP) && m_caster->ToPlayer())
{
float spFactor = 0.0f;
switch (m_spellInfo->Id)
diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp
index 30b4f9d92d0..95ca8c9c37f 100755
--- a/src/server/game/Spells/SpellScript.cpp
+++ b/src/server/game/Spells/SpellScript.cpp
@@ -227,10 +227,10 @@ bool SpellScript::_Validate(SpellEntry const * entry)
bool SpellScript::_Load(Spell* spell)
{
- m_currentScriptState = SPELL_SCRIPT_STATE_LOADING;
m_spell = spell;
+ _PrepareScriptCall((SpellScriptHookType)SPELL_SCRIPT_STATE_LOADING);
bool load = Load();
- m_currentScriptState = SPELL_SCRIPT_STATE_NONE;
+ _FinishScriptCall();
return load;
}
@@ -630,35 +630,28 @@ void AuraScript::EffectManaShieldHandler::Call(AuraScript* auraScript, AuraEffec
bool AuraScript::_Load(Aura* aura)
{
- m_currentScriptState = SPELL_SCRIPT_STATE_LOADING;
m_aura = aura;
+ _PrepareScriptCall((AuraScriptHookType)SPELL_SCRIPT_STATE_LOADING, NULL);
bool load = Load();
- m_currentScriptState = SPELL_SCRIPT_STATE_NONE;
+ _FinishScriptCall();
return load;
}
void AuraScript::_PrepareScriptCall(AuraScriptHookType hookType, AuraApplication const* aurApp)
{
+ m_scriptStates.push(ScriptStateStore(m_currentScriptState, m_auraApplication, m_defaultActionPrevented));
m_currentScriptState = hookType;
- switch (m_currentScriptState)
- {
- case AURA_SCRIPT_HOOK_EFFECT_APPLY:
- case AURA_SCRIPT_HOOK_EFFECT_REMOVE:
- case AURA_SCRIPT_HOOK_EFFECT_PERIODIC:
- case AURA_SCRIPT_HOOK_EFFECT_ABSORB:
- case AURA_SCRIPT_HOOK_EFFECT_MANASHIELD:
- m_defaultActionPrevented = false;
- break;
- default:
- break;
- }
+ m_defaultActionPrevented = false;
m_auraApplication = aurApp;
}
void AuraScript::_FinishScriptCall()
{
- m_currentScriptState = SPELL_SCRIPT_STATE_NONE;
- m_auraApplication = NULL;
+ ScriptStateStore stateStore = m_scriptStates.top();
+ m_currentScriptState = stateStore._currentScriptState;
+ m_auraApplication = stateStore._auraApplication;
+ m_defaultActionPrevented = stateStore._defaultActionPrevented;
+ m_scriptStates.pop();
}
bool AuraScript::_IsDefaultActionPrevented()
@@ -670,8 +663,7 @@ bool AuraScript::_IsDefaultActionPrevented()
case AURA_SCRIPT_HOOK_EFFECT_PERIODIC:
return m_defaultActionPrevented;
default:
- //TOFIX: probably one hook is called from another hook
- //ASSERT(false && "m_defaultActionPrevented has incorrect value, or AuraScript::_IsDefaultActionPrevented is called in a wrong place");
+ ASSERT(false && "AuraScript::_IsDefaultActionPrevented is called in a wrong place");
return false;
}
}
diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index ffd462c9507..64dc4282ad5 100755
--- a/src/server/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
@@ -21,6 +21,7 @@
#include "Util.h"
#include "SharedDefines.h"
#include "SpellAuraDefines.h"
+#include <stack>
class Unit;
struct SpellEntry;
@@ -58,6 +59,7 @@ class _SpellScript
virtual bool _Validate(SpellEntry const* entry);
public:
+ _SpellScript() : m_currentScriptState(SPELL_SCRIPT_STATE_NONE) {}
virtual ~_SpellScript() {}
virtual void _Register();
virtual void _Unload();
@@ -326,7 +328,9 @@ class SpellScript : public _SpellScript
enum AuraScriptHookType
{
AURA_SCRIPT_HOOK_EFFECT_APPLY = SPELL_SCRIPT_STATE_END,
+ AURA_SCRIPT_HOOK_EFFECT_AFTER_APPLY,
AURA_SCRIPT_HOOK_EFFECT_REMOVE,
+ AURA_SCRIPT_HOOK_EFFECT_AFTER_REMOVE,
AURA_SCRIPT_HOOK_EFFECT_PERIODIC,
AURA_SCRIPT_HOOK_EFFECT_UPDATE_PERIODIC,
AURA_SCRIPT_HOOK_EFFECT_CALC_AMOUNT,
@@ -446,6 +450,8 @@ class AuraScript : public _SpellScript
#define PrepareAuraScript(CLASSNAME) AURASCRIPT_FUNCTION_TYPE_DEFINES(CLASSNAME) AURASCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME)
public:
+ AuraScript() : _SpellScript(), m_aura(NULL), m_auraApplication(NULL), m_defaultActionPrevented(false)
+ {}
bool _Validate(SpellEntry const * entry);
bool _Load(Aura * aura);
void _PrepareScriptCall(AuraScriptHookType hookType, AuraApplication const * aurApp = NULL);
@@ -455,6 +461,20 @@ class AuraScript : public _SpellScript
Aura * m_aura;
AuraApplication const * m_auraApplication;
bool m_defaultActionPrevented;
+
+ class ScriptStateStore
+ {
+ public:
+ uint8 _currentScriptState;
+ AuraApplication const * _auraApplication;
+ bool _defaultActionPrevented;
+ ScriptStateStore(uint8 currentScriptState, AuraApplication const * auraApplication, bool defaultActionPrevented)
+ : _currentScriptState(currentScriptState), _auraApplication(auraApplication), _defaultActionPrevented(defaultActionPrevented)
+ {}
+ };
+ typedef std::stack<ScriptStateStore> ScriptStateStack;
+ ScriptStateStack m_scriptStates;
+
public:
//
// AuraScript interface