First try at making spells in SmartAI

Signed-off-by: hondacrx <prelude_20032002@yahoo.com>
This commit is contained in:
hondacrx
2017-07-10 14:23:51 -04:00
parent 40a4685a9c
commit 809e601945
7 changed files with 412 additions and 60 deletions
+222 -34
View File
@@ -131,8 +131,9 @@ namespace Game.Spells
public virtual void Dispose()
{
// unload scripts
foreach (var script in m_loadedScripts)
script._Unload();
//foreach (var script in m_loadedScripts)
//script._Unload();
script.Unload();
if (m_referencedFromCurrentSpell && m_selfContainer && m_selfContainer == this)
{
@@ -6646,16 +6647,36 @@ namespace Game.Spells
void LoadScripts()
{
m_loadedScripts = Global.ScriptMgr.CreateSpellScripts(m_spellInfo.Id, this);
foreach (var script in m_loadedScripts)
if (!m_loadedScripts.Empty())
{
Log.outDebug(LogFilter.Spells, "Spell.LoadScripts: Script `{0}` for spell `{1}` is loaded now", script._GetScriptName(), m_spellInfo.Id);
script.Register();
foreach (var script1 in m_loadedScripts)
{
if (script != null)
Log.outError(LogFilter.Server, "More then one script is trying to load");
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);
}
void CallScriptBeforeCastHandlers()
{
foreach (var script in m_loadedScripts)
if (script == null)
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);
@@ -6663,12 +6684,22 @@ namespace Game.Spells
hook.Call();
script._FinishScriptCall();
}
}*/
}
void CallScriptOnCastHandlers()
{
foreach (var script in m_loadedScripts)
if (script == null)
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);
@@ -6676,12 +6707,22 @@ namespace Game.Spells
hook.Call();
script._FinishScriptCall();
}
}*/
}
void CallScriptAfterCastHandlers()
{
foreach (var script in m_loadedScripts)
if (script == null)
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);
@@ -6689,13 +6730,27 @@ namespace Game.Spells
hook.Call();
script._FinishScriptCall();
}
}*/
}
SpellCastResult CallScriptCheckCastHandlers()
{
SpellCastResult retVal = SpellCastResult.SpellCastOk;
foreach (var script in m_loadedScripts)
if (script == null)
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);
@@ -6707,21 +6762,67 @@ namespace Game.Spells
}
script._FinishScriptCall();
}
}*/
return retVal;
}
void PrepareScriptHitHandlers()
{
foreach (var script in m_loadedScripts)
script._InitHit();
if (script == null)
return;
script._InitHit();
//foreach (var script in m_loadedScripts)
//script._InitHit();
}
bool CallScriptEffectHandlers(uint effIndex, SpellEffectHandleMode mode)
{
if (script == null)
return false;
// execute script effect handler hooks and check if effects was prevented
bool preventDefault = false;
foreach (var script in m_loadedScripts)
SpellScriptHookType hookType;
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;
List<SpellScript.EffectHandler> effList;
@@ -6759,13 +6860,23 @@ namespace Game.Spells
preventDefault = script._IsDefaultEffectPrevented(effIndex);
script._FinishScriptCall();
}
}*/
return preventDefault;
}
void CallScriptSuccessfulDispel(uint effIndex)
{
foreach (var script in m_loadedScripts)
if (script == null)
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);
@@ -6773,12 +6884,22 @@ namespace Game.Spells
hook.Call(effIndex);
script._FinishScriptCall();
}
}*/
}
void CallScriptBeforeHitHandlers(SpellMissInfo missInfo)
{
foreach (var script in m_loadedScripts)
if (script == null)
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);
@@ -6786,12 +6907,22 @@ namespace Game.Spells
hook.Call(missInfo);
script._FinishScriptCall();
}
}*/
}
void CallScriptOnHitHandlers()
{
foreach (var script in m_loadedScripts)
if (script == null)
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);
@@ -6799,12 +6930,22 @@ namespace Game.Spells
hook.Call();
script._FinishScriptCall();
}
}*/
}
void CallScriptAfterHitHandlers()
{
foreach (var script in m_loadedScripts)
if (script == null)
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);
@@ -6812,12 +6953,23 @@ namespace Game.Spells
hook.Call();
script._FinishScriptCall();
}
}*/
}
void CallScriptObjectAreaTargetSelectHandlers(List<WorldObject> targets, uint effIndex, SpellImplicitTargetInfo targetType)
{
foreach (var script in m_loadedScripts)
if (script == null)
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);
@@ -6826,12 +6978,23 @@ namespace Game.Spells
hook.Call(targets);
script._FinishScriptCall();
}
}*/
}
void CallScriptObjectTargetSelectHandlers(ref WorldObject target, uint effIndex, SpellImplicitTargetInfo targetType)
{
foreach (var script in m_loadedScripts)
if (script == null)
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);
@@ -6840,12 +7003,23 @@ namespace Game.Spells
hook.Call(ref target);
script._FinishScriptCall();
}
}*/
}
void CallScriptDestinationTargetSelectHandlers(ref SpellDestination target, uint effIndex, SpellImplicitTargetInfo targetType)
{
foreach (var script in m_loadedScripts)
if (script == null)
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);
@@ -6854,16 +7028,29 @@ namespace Game.Spells
hook.Call(ref target);
script._FinishScriptCall();
}
}*/
}
bool CheckScriptEffectImplicitTargets(uint effIndex, uint effIndexToCheck)
{
// Skip if there are not any script
if (m_loadedScripts.Empty())
//if (m_loadedScripts.Empty())
//return true;
if (script == null)
return true;
foreach (var script in m_loadedScripts)
foreach (var hook in script.OnObjectTargetSelect)
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)
if ((hook.IsEffectAffected(m_spellInfo, effIndex) && !hook.IsEffectAffected(m_spellInfo, effIndexToCheck)) ||
@@ -6874,7 +7061,7 @@ namespace Game.Spells
if ((hook.IsEffectAffected(m_spellInfo, effIndex) && !hook.IsEffectAffected(m_spellInfo, effIndexToCheck)) ||
(!hook.IsEffectAffected(m_spellInfo, effIndex) && hook.IsEffectAffected(m_spellInfo, effIndexToCheck)))
return false;
}
}*/
return true;
}
@@ -7012,6 +7199,7 @@ namespace Game.Spells
}
List<SpellScript> m_loadedScripts = new List<SpellScript>();
SpellScript script { get; set; }
int CalculateDamage(uint i, Unit target)
{