diff --git a/Source/Framework/Constants/ScriptsConst.cs b/Source/Framework/Constants/ScriptsConst.cs index 31602bddb..ba61b434f 100644 --- a/Source/Framework/Constants/ScriptsConst.cs +++ b/Source/Framework/Constants/ScriptsConst.cs @@ -44,7 +44,8 @@ namespace Framework.Constants OnCast, OnResistAbsorbCalculation, AfterCast, - CalcCritChance + CalcCritChance, + OnPrecast } // AuraScript interface - enum used for runtime checks of script function calls diff --git a/Source/Game/Scripting/SpellScript.cs b/Source/Game/Scripting/SpellScript.cs index e80a31c43..ba904285b 100644 --- a/Source/Game/Scripting/SpellScript.cs +++ b/Source/Game/Scripting/SpellScript.cs @@ -502,6 +502,8 @@ namespace Game.Scripting || m_currentScriptState == (byte)SpellScriptHookType.EffectSuccessfulDispel; } + public virtual void OnPrecast() { } + Spell m_spell; uint m_hitPreventEffectMask; uint m_hitPreventDefaultEffectMask; diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index 854e4f0be..77dbd0d87 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -2413,6 +2413,8 @@ namespace Game.Spells // set timer base at cast time ReSetTimer(); + CallScriptOnPrecastHandler(); + Log.outDebug(LogFilter.Spells, "Spell.prepare: spell id {0} source {1} caster {2} customCastFlags {3} mask {4}", m_spellInfo.Id, m_caster.GetEntry(), m_originalCaster != null ? (int)m_originalCaster.GetEntry() : -1, _triggeredCastFlags, m_targets.GetTargetMask()); if (m_spellInfo.HasAttribute(SpellAttr12.StartCooldownOnCastStart)) @@ -7131,6 +7133,16 @@ namespace Game.Spells } } + void CallScriptOnPrecastHandler() + { + foreach (var script in m_loadedScripts) + { + script._PrepareScriptCall(SpellScriptHookType.OnPrecast); + script.OnPrecast(); + script._FinishScriptCall(); + } + } + void CallScriptBeforeCastHandlers() { foreach (var script in m_loadedScripts)