This commit is contained in:
hondacrx
2017-07-21 23:08:32 -04:00
parent 0736bf1fda
commit c41f76d27e
3 changed files with 47 additions and 238 deletions
-19
View File
@@ -128,24 +128,5 @@ namespace Game.AI
} }
return new NullGameObjectAI(go); return new NullGameObjectAI(go);
} }
public static SpellScript SelectSpellScript(Spell spell)
{
var holder = Global.SmartAIMgr.GetScript((int)spell.GetSpellInfo().Id, SmartScriptType.Spell);
if (holder.Empty())
return null;
var script = new SmartSpell();
script._Init("", spell.GetSpellInfo().Id);
if (!script._Load(spell))
return null;
script._Register();
if (!script._Validate(spell.GetSpellInfo()))
return null;
return script;
}
} }
} }
+1 -1
View File
@@ -1823,7 +1823,7 @@ namespace Game.Spells
public void LoadScripts() public void LoadScripts()
{ {
m_loadedScripts = Global.ScriptMgr.CreateAuraScripts(m_spellInfo.Id, this); m_loadedScripts = Global.ScriptMgr.CreateAuraScripts(m_spellInfo.Id, this);
foreach (var script in m_loadedScripts.ToList()) foreach (var script in m_loadedScripts)
{ {
Log.outDebug(LogFilter.Spells, "Aura.LoadScripts: Script `{0}` for aura `{1}` is loaded now", script._GetScriptName(), m_spellInfo.Id); Log.outDebug(LogFilter.Spells, "Aura.LoadScripts: Script `{0}` for aura `{1}` is loaded now", script._GetScriptName(), m_spellInfo.Id);
script.Register(); script.Register();
+46 -218
View File
@@ -32,6 +32,7 @@ using System.Collections.Generic;
using System.Diagnostics.Contracts; using System.Diagnostics.Contracts;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using Game.AI;
namespace Game.Spells namespace Game.Spells
{ {
@@ -131,9 +132,8 @@ namespace Game.Spells
public virtual void Dispose() public virtual void Dispose()
{ {
// unload scripts // unload scripts
//foreach (var script in m_loadedScripts) foreach (var script in m_loadedScripts.ToList())
//script._Unload(); script._Unload();
script.Unload();
if (m_referencedFromCurrentSpell && m_selfContainer && m_selfContainer == this) if (m_referencedFromCurrentSpell && m_selfContainer && m_selfContainer == this)
{ {
@@ -6648,35 +6648,29 @@ namespace Game.Spells
{ {
m_loadedScripts = Global.ScriptMgr.CreateSpellScripts(m_spellInfo.Id, this); m_loadedScripts = Global.ScriptMgr.CreateSpellScripts(m_spellInfo.Id, this);
if (!m_loadedScripts.Empty()) var holder = Global.SmartAIMgr.GetScript((int)GetSpellInfo().Id, SmartScriptType.Spell);
if (!holder.Empty())
{ {
foreach (var script1 in m_loadedScripts) var script = new SmartSpell();
script._Init("", GetSpellInfo().Id);
if (script._Load(this))
{ {
if (script != null) script._Register();
Log.outError(LogFilter.Server, "More then one script is trying to load"); if (script._Validate(GetSpellInfo()))
m_loadedScripts.Add(script);
Log.outDebug(LogFilter.Spells, "Spell.LoadScripts: Script `{0}` for spell `{1}` is loaded now", script1._GetScriptName(), m_spellInfo.Id);
script1.Register();
script = script1;
} }
} }
else
script = AI.AISelector.SelectSpellScript(this); foreach (var script in m_loadedScripts)
{
Log.outDebug(LogFilter.Spells, "Spell.LoadScripts: Script `{0}` for spell `{1}` is loaded now", script._GetScriptName(), m_spellInfo.Id);
script.Register();
}
} }
void CallScriptBeforeCastHandlers() void CallScriptBeforeCastHandlers()
{ {
if (script == null) foreach (var script in m_loadedScripts)
return;
script._PrepareScriptCall(SpellScriptHookType.BeforeCast);
foreach (var hook in script.BeforeCast)
hook.Call();
script._FinishScriptCall();
/*foreach (var script in m_loadedScripts)
{ {
script._PrepareScriptCall(SpellScriptHookType.BeforeCast); script._PrepareScriptCall(SpellScriptHookType.BeforeCast);
@@ -6684,22 +6678,12 @@ namespace Game.Spells
hook.Call(); hook.Call();
script._FinishScriptCall(); script._FinishScriptCall();
}*/ }
} }
void CallScriptOnCastHandlers() void CallScriptOnCastHandlers()
{ {
if (script == null) foreach (var script in m_loadedScripts)
return;
script._PrepareScriptCall(SpellScriptHookType.OnCast);
foreach (var hook in script.OnCast)
hook.Call();
script._FinishScriptCall();
/*foreach (var script in m_loadedScripts)
{ {
script._PrepareScriptCall(SpellScriptHookType.OnCast); script._PrepareScriptCall(SpellScriptHookType.OnCast);
@@ -6707,22 +6691,12 @@ namespace Game.Spells
hook.Call(); hook.Call();
script._FinishScriptCall(); script._FinishScriptCall();
}*/ }
} }
void CallScriptAfterCastHandlers() void CallScriptAfterCastHandlers()
{ {
if (script == null) foreach (var script in m_loadedScripts)
return;
script._PrepareScriptCall(SpellScriptHookType.AfterCast);
foreach (var hook in script.AfterCast)
hook.Call();
script._FinishScriptCall();
/*foreach (var script in m_loadedScripts)
{ {
script._PrepareScriptCall(SpellScriptHookType.AfterCast); script._PrepareScriptCall(SpellScriptHookType.AfterCast);
@@ -6730,27 +6704,13 @@ namespace Game.Spells
hook.Call(); hook.Call();
script._FinishScriptCall(); script._FinishScriptCall();
}*/ }
} }
SpellCastResult CallScriptCheckCastHandlers() SpellCastResult CallScriptCheckCastHandlers()
{ {
SpellCastResult retVal = SpellCastResult.SpellCastOk; SpellCastResult retVal = SpellCastResult.SpellCastOk;
if (script == null) foreach (var script in m_loadedScripts)
return retVal;
script._PrepareScriptCall(SpellScriptHookType.CheckCast);
foreach (var hook in script.OnCheckCast)
{
SpellCastResult tempResult = hook.Call();
if (tempResult != SpellCastResult.SpellCastOk)
retVal = tempResult;
}
script._FinishScriptCall();
/*foreach (var script in m_loadedScripts)
{ {
script._PrepareScriptCall(SpellScriptHookType.CheckCast); script._PrepareScriptCall(SpellScriptHookType.CheckCast);
@@ -6762,67 +6722,22 @@ namespace Game.Spells
} }
script._FinishScriptCall(); script._FinishScriptCall();
}*/ }
return retVal; return retVal;
} }
void PrepareScriptHitHandlers() void PrepareScriptHitHandlers()
{ {
if (script == null) foreach (var script in m_loadedScripts)
return; script._InitHit();
script._InitHit();
//foreach (var script in m_loadedScripts)
//script._InitHit();
} }
bool CallScriptEffectHandlers(uint effIndex, SpellEffectHandleMode mode) bool CallScriptEffectHandlers(uint effIndex, SpellEffectHandleMode mode)
{ {
if (script == null)
return false;
// execute script effect handler hooks and check if effects was prevented // execute script effect handler hooks and check if effects was prevented
bool preventDefault = false; bool preventDefault = false;
SpellScriptHookType hookType; foreach (var script in m_loadedScripts)
List<SpellScript.EffectHandler> effList;
switch (mode)
{
case SpellEffectHandleMode.Launch:
effList = script.OnEffectLaunch;
hookType = SpellScriptHookType.Launch;
break;
case SpellEffectHandleMode.LaunchTarget:
effList = script.OnEffectLaunchTarget;
hookType = SpellScriptHookType.LaunchTarget;
break;
case SpellEffectHandleMode.Hit:
effList = script.OnEffectHit;
hookType = SpellScriptHookType.EffectHit;
break;
case SpellEffectHandleMode.HitTarget:
effList = script.OnEffectHitTarget;
hookType = SpellScriptHookType.EffectHitTarget;
break;
default:
Contract.Assert(false);
return false;
}
script._PrepareScriptCall(hookType);
foreach (var eff in effList)
{
// effect execution can be prevented
if (!script._IsEffectPrevented(effIndex) && eff.IsEffectAffected(m_spellInfo, effIndex))
eff.Call(effIndex);
}
if (!preventDefault)
preventDefault = script._IsDefaultEffectPrevented(effIndex);
script._FinishScriptCall();
/*foreach (var script in m_loadedScripts)
{ {
SpellScriptHookType hookType; SpellScriptHookType hookType;
List<SpellScript.EffectHandler> effList; List<SpellScript.EffectHandler> effList;
@@ -6860,23 +6775,13 @@ namespace Game.Spells
preventDefault = script._IsDefaultEffectPrevented(effIndex); preventDefault = script._IsDefaultEffectPrevented(effIndex);
script._FinishScriptCall(); script._FinishScriptCall();
}*/ }
return preventDefault; return preventDefault;
} }
void CallScriptSuccessfulDispel(uint effIndex) void CallScriptSuccessfulDispel(uint effIndex)
{ {
if (script == null) foreach (var script in m_loadedScripts)
return;
script._PrepareScriptCall(SpellScriptHookType.EffectSuccessfulDispel);
foreach (var hook in script.OnEffectSuccessfulDispel)
hook.Call(effIndex);
script._FinishScriptCall();
/*foreach (var script in m_loadedScripts)
{ {
script._PrepareScriptCall(SpellScriptHookType.EffectSuccessfulDispel); script._PrepareScriptCall(SpellScriptHookType.EffectSuccessfulDispel);
@@ -6884,22 +6789,12 @@ namespace Game.Spells
hook.Call(effIndex); hook.Call(effIndex);
script._FinishScriptCall(); script._FinishScriptCall();
}*/ }
} }
void CallScriptBeforeHitHandlers(SpellMissInfo missInfo) void CallScriptBeforeHitHandlers(SpellMissInfo missInfo)
{ {
if (script == null) foreach (var script in m_loadedScripts)
return;
script._PrepareScriptCall(SpellScriptHookType.BeforeHit);
foreach (var hook in script.BeforeHit)
hook.Call(missInfo);
script._FinishScriptCall();
/*foreach (var script in m_loadedScripts)
{ {
script._PrepareScriptCall(SpellScriptHookType.BeforeHit); script._PrepareScriptCall(SpellScriptHookType.BeforeHit);
@@ -6907,22 +6802,12 @@ namespace Game.Spells
hook.Call(missInfo); hook.Call(missInfo);
script._FinishScriptCall(); script._FinishScriptCall();
}*/ }
} }
void CallScriptOnHitHandlers() void CallScriptOnHitHandlers()
{ {
if (script == null) foreach (var script in m_loadedScripts)
return;
script._PrepareScriptCall(SpellScriptHookType.OnHit);
foreach (var hook in script.OnHit)
hook.Call();
script._FinishScriptCall();
/*foreach (var script in m_loadedScripts)
{ {
script._PrepareScriptCall(SpellScriptHookType.OnHit); script._PrepareScriptCall(SpellScriptHookType.OnHit);
@@ -6930,22 +6815,12 @@ namespace Game.Spells
hook.Call(); hook.Call();
script._FinishScriptCall(); script._FinishScriptCall();
}*/ }
} }
void CallScriptAfterHitHandlers() void CallScriptAfterHitHandlers()
{ {
if (script == null) foreach (var script in m_loadedScripts)
return;
script._PrepareScriptCall(SpellScriptHookType.AfterHit);
foreach (var hook in script.AfterHit)
hook.Call();
script._FinishScriptCall();
/*foreach (var script in m_loadedScripts)
{ {
script._PrepareScriptCall(SpellScriptHookType.AfterHit); script._PrepareScriptCall(SpellScriptHookType.AfterHit);
@@ -6953,23 +6828,12 @@ namespace Game.Spells
hook.Call(); hook.Call();
script._FinishScriptCall(); script._FinishScriptCall();
}*/ }
} }
void CallScriptObjectAreaTargetSelectHandlers(List<WorldObject> targets, uint effIndex, SpellImplicitTargetInfo targetType) void CallScriptObjectAreaTargetSelectHandlers(List<WorldObject> targets, uint effIndex, SpellImplicitTargetInfo targetType)
{ {
if (script == null) foreach (var script in m_loadedScripts)
return;
script._PrepareScriptCall(SpellScriptHookType.ObjectAreaTargetSelect);
foreach (var hook in script.OnObjectAreaTargetSelect)
if (hook.IsEffectAffected(m_spellInfo, effIndex) && targetType.GetTarget() == hook.GetTarget())
hook.Call(targets);
script._FinishScriptCall();
/*foreach (var script in m_loadedScripts)
{ {
script._PrepareScriptCall(SpellScriptHookType.ObjectAreaTargetSelect); script._PrepareScriptCall(SpellScriptHookType.ObjectAreaTargetSelect);
@@ -6978,23 +6842,12 @@ namespace Game.Spells
hook.Call(targets); hook.Call(targets);
script._FinishScriptCall(); script._FinishScriptCall();
}*/ }
} }
void CallScriptObjectTargetSelectHandlers(ref WorldObject target, uint effIndex, SpellImplicitTargetInfo targetType) void CallScriptObjectTargetSelectHandlers(ref WorldObject target, uint effIndex, SpellImplicitTargetInfo targetType)
{ {
if (script == null) foreach (var script in m_loadedScripts)
return;
script._PrepareScriptCall(SpellScriptHookType.ObjectTargetSelect);
foreach (var hook in script.OnObjectTargetSelect)
if (hook.IsEffectAffected(m_spellInfo, effIndex) && targetType.GetTarget() == hook.GetTarget())
hook.Call(ref target);
script._FinishScriptCall();
/*foreach (var script in m_loadedScripts)
{ {
script._PrepareScriptCall(SpellScriptHookType.ObjectTargetSelect); script._PrepareScriptCall(SpellScriptHookType.ObjectTargetSelect);
@@ -7003,23 +6856,12 @@ namespace Game.Spells
hook.Call(ref target); hook.Call(ref target);
script._FinishScriptCall(); script._FinishScriptCall();
}*/ }
} }
void CallScriptDestinationTargetSelectHandlers(ref SpellDestination target, uint effIndex, SpellImplicitTargetInfo targetType) void CallScriptDestinationTargetSelectHandlers(ref SpellDestination target, uint effIndex, SpellImplicitTargetInfo targetType)
{ {
if (script == null) foreach (var script in m_loadedScripts)
return;
script._PrepareScriptCall(SpellScriptHookType.DestinationTargetSelect);
foreach (var hook in script.OnDestinationTargetSelect)
if (hook.IsEffectAffected(m_spellInfo, effIndex) && targetType.GetTarget() == hook.GetTarget())
hook.Call(ref target);
script._FinishScriptCall();
/*foreach (var script in m_loadedScripts)
{ {
script._PrepareScriptCall(SpellScriptHookType.DestinationTargetSelect); script._PrepareScriptCall(SpellScriptHookType.DestinationTargetSelect);
@@ -7028,29 +6870,16 @@ namespace Game.Spells
hook.Call(ref target); hook.Call(ref target);
script._FinishScriptCall(); script._FinishScriptCall();
}*/ }
} }
bool CheckScriptEffectImplicitTargets(uint effIndex, uint effIndexToCheck) bool CheckScriptEffectImplicitTargets(uint effIndex, uint effIndexToCheck)
{ {
// Skip if there are not any script // Skip if there are not any script
//if (m_loadedScripts.Empty()) if (m_loadedScripts.Empty())
//return true;
if (script == null)
return true; return true;
foreach (var hook in script.OnObjectTargetSelect) foreach (var script in m_loadedScripts)
if ((hook.IsEffectAffected(m_spellInfo, effIndex) && !hook.IsEffectAffected(m_spellInfo, effIndexToCheck)) ||
(!hook.IsEffectAffected(m_spellInfo, effIndex) && hook.IsEffectAffected(m_spellInfo, effIndexToCheck)))
return false;
foreach (var hook in script.OnObjectAreaTargetSelect)
if ((hook.IsEffectAffected(m_spellInfo, effIndex) && !hook.IsEffectAffected(m_spellInfo, effIndexToCheck)) ||
(!hook.IsEffectAffected(m_spellInfo, effIndex) && hook.IsEffectAffected(m_spellInfo, effIndexToCheck)))
return false;
/*foreach (var script in m_loadedScripts)
{ {
foreach (var hook in script.OnObjectTargetSelect) foreach (var hook in script.OnObjectTargetSelect)
if ((hook.IsEffectAffected(m_spellInfo, effIndex) && !hook.IsEffectAffected(m_spellInfo, effIndexToCheck)) || if ((hook.IsEffectAffected(m_spellInfo, effIndex) && !hook.IsEffectAffected(m_spellInfo, effIndexToCheck)) ||
@@ -7061,7 +6890,7 @@ namespace Game.Spells
if ((hook.IsEffectAffected(m_spellInfo, effIndex) && !hook.IsEffectAffected(m_spellInfo, effIndexToCheck)) || if ((hook.IsEffectAffected(m_spellInfo, effIndex) && !hook.IsEffectAffected(m_spellInfo, effIndexToCheck)) ||
(!hook.IsEffectAffected(m_spellInfo, effIndex) && hook.IsEffectAffected(m_spellInfo, effIndexToCheck))) (!hook.IsEffectAffected(m_spellInfo, effIndex) && hook.IsEffectAffected(m_spellInfo, effIndexToCheck)))
return false; return false;
}*/ }
return true; return true;
} }
@@ -7199,7 +7028,6 @@ namespace Game.Spells
} }
List<SpellScript> m_loadedScripts = new List<SpellScript>(); List<SpellScript> m_loadedScripts = new List<SpellScript>();
SpellScript script { get; set; }
int CalculateDamage(uint i, Unit target) int CalculateDamage(uint i, Unit target)
{ {