Core/AuraScripts: Fix runtime error messages appearing in aura scripts when one hook is called from inside of another one.

This commit is contained in:
QAston
2011-05-26 16:12:33 +02:00
parent 824e0356a8
commit 0762791754
4 changed files with 35 additions and 27 deletions
+2 -6
View File
@@ -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();
}
}
+1 -1
View File
@@ -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)
+12 -20
View File
@@ -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;
}
}
+20
View File
@@ -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