diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/server/game/Spells/Auras/SpellAuras.cpp | 8 | ||||
| -rwxr-xr-x | src/server/game/Spells/SpellEffects.cpp | 2 | ||||
| -rwxr-xr-x | src/server/game/Spells/SpellScript.cpp | 32 | ||||
| -rwxr-xr-x | src/server/game/Spells/SpellScript.h | 20 |
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 |
