First try at making spells in SmartAI
Signed-off-by: hondacrx <prelude_20032002@yahoo.com>
This commit is contained in:
@@ -195,7 +195,11 @@ namespace Framework.Constants
|
||||
SceneCancel = 80, // none
|
||||
SceneComplete = 81, // none
|
||||
|
||||
End = 82
|
||||
//New
|
||||
SpellEffectHit = 82,
|
||||
SpellEffectHitTarget = 83,
|
||||
|
||||
End = 84
|
||||
}
|
||||
|
||||
public enum SmartActions
|
||||
@@ -358,7 +362,8 @@ namespace Framework.Constants
|
||||
LootRecipients = 27, // all players that have tagged this creature (for kill credit)
|
||||
Farthest = 28, // maxDist, playerOnly, isInLos
|
||||
VehicleAccessory = 29, // seat number (vehicle can target it's own accessory)
|
||||
Caster = 30,
|
||||
|
||||
End = 30
|
||||
End = 31
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,8 @@ using Framework.Constants;
|
||||
using Game.Entities;
|
||||
using Game.Movement;
|
||||
using System.Collections.Generic;
|
||||
using Game.Scripting;
|
||||
using Game.Spells;
|
||||
|
||||
namespace Game.AI
|
||||
{
|
||||
@@ -126,5 +128,24 @@ namespace Game.AI
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1048,6 +1048,48 @@ namespace Game.AI
|
||||
SmartScript mScript;
|
||||
}
|
||||
|
||||
public class SmartSpell : SpellScript
|
||||
{
|
||||
public override bool Load()
|
||||
{
|
||||
mScript.OnInitialize(GetSpell());
|
||||
scriptHolders = Global.SmartAIMgr.GetScript((int)GetSpellInfo().Id, SmartScriptType.Spell);
|
||||
return true;
|
||||
}
|
||||
|
||||
void HandleEffectHit(uint effIndex)
|
||||
{
|
||||
mScript.ProcessEventsFor(SmartEvents.SpellEffectHit);
|
||||
}
|
||||
|
||||
void HandleEffectHitTarget(uint effIndex)
|
||||
{
|
||||
mScript.ProcessEventsFor(SmartEvents.SpellEffectHitTarget);
|
||||
}
|
||||
|
||||
public override void Register()
|
||||
{
|
||||
foreach (var holder in scriptHolders)
|
||||
{
|
||||
switch (holder.GetEventType())
|
||||
{
|
||||
case SmartEvents.SpellEffectHit:
|
||||
OnEffectHit.Add(new EffectHandler(HandleEffectHit, holder.Event.spell.effIndex, SpellEffectName.ScriptEffect));
|
||||
OnEffectHit.Add(new EffectHandler(HandleEffectHit, holder.Event.spell.effIndex, SpellEffectName.Dummy));
|
||||
break;
|
||||
case SmartEvents.SpellEffectHitTarget:
|
||||
OnEffectHitTarget.Add(new EffectHandler(HandleEffectHitTarget, holder.Event.spell.effIndex, SpellEffectName.ScriptEffect));
|
||||
OnEffectHitTarget.Add(new EffectHandler(HandleEffectHitTarget, holder.Event.spell.effIndex, SpellEffectName.Dummy));
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
List<SmartScriptHolder> scriptHolders = new List<SmartScriptHolder>();
|
||||
SmartScript mScript = new SmartScript();
|
||||
}
|
||||
|
||||
[Script]
|
||||
class SmartTrigger : AreaTriggerScript
|
||||
{
|
||||
@@ -1060,7 +1102,7 @@ namespace Game.AI
|
||||
|
||||
Log.outDebug(LogFilter.ScriptsAi, "AreaTrigger {0} is using SmartTrigger script", trigger.Id);
|
||||
SmartScript script = new SmartScript();
|
||||
script.OnInitialize(null, trigger);
|
||||
script.OnInitialize(trigger);
|
||||
script.ProcessEventsFor(SmartEvents.AreatriggerOntrigger, player, trigger.Id);
|
||||
return true;
|
||||
}
|
||||
@@ -1074,28 +1116,28 @@ namespace Game.AI
|
||||
public override void OnSceneStart(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate)
|
||||
{
|
||||
SmartScript smartScript = new SmartScript();
|
||||
smartScript.OnInitialize(null, null, sceneTemplate);
|
||||
smartScript.OnInitialize(sceneTemplate);
|
||||
smartScript.ProcessEventsFor(SmartEvents.SceneStart, player);
|
||||
}
|
||||
|
||||
public override void OnSceneTriggerEvent(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate, string triggerName)
|
||||
{
|
||||
SmartScript smartScript = new SmartScript();
|
||||
smartScript.OnInitialize(null, null, sceneTemplate);
|
||||
smartScript.OnInitialize(sceneTemplate);
|
||||
smartScript.ProcessEventsFor(SmartEvents.SceneTrigger, player, 0, 0, false, null, null, triggerName);
|
||||
}
|
||||
|
||||
public override void OnSceneCancel(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate)
|
||||
{
|
||||
SmartScript smartScript = new SmartScript();
|
||||
smartScript.OnInitialize(null, null, sceneTemplate);
|
||||
smartScript.OnInitialize(sceneTemplate);
|
||||
smartScript.ProcessEventsFor(SmartEvents.SceneCancel, player);
|
||||
}
|
||||
|
||||
public override void OnSceneComplete(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate)
|
||||
{
|
||||
SmartScript smartScript = new SmartScript();
|
||||
smartScript.OnInitialize(null, null, sceneTemplate);
|
||||
smartScript.OnInitialize(sceneTemplate);
|
||||
smartScript.ProcessEventsFor(SmartEvents.SceneComplete, player);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,6 +93,15 @@ namespace Game.AI
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SmartScriptType.Spell:
|
||||
{
|
||||
if (!Global.SpellMgr.HasSpellInfo((uint)temp.entryOrGuid))
|
||||
{
|
||||
Log.outError(LogFilter.Sql, "SmartAIMgr.LoadSmartAIFromDB: Scene id ({0}) does not exist, skipped loading.", temp.entryOrGuid);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SmartScriptType.TimedActionlist:
|
||||
break;//nothing to check, really
|
||||
default:
|
||||
@@ -318,6 +327,7 @@ namespace Game.AI
|
||||
case SmartTargets.Stored:
|
||||
case SmartTargets.LootRecipients:
|
||||
case SmartTargets.VehicleAccessory:
|
||||
case SmartTargets.Caster:
|
||||
break;
|
||||
default:
|
||||
Log.outError(LogFilter.ScriptsAi, "SmartAIMgr: Not handled target_type({0}), Entry {1} SourceType {2} Event {3} Action {4}, skipped.", e.GetTargetType(), e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
|
||||
@@ -689,6 +699,7 @@ namespace Game.AI
|
||||
case SmartEvents.SceneCancel:
|
||||
case SmartEvents.SceneComplete:
|
||||
case SmartEvents.SceneTrigger:
|
||||
case SmartEvents.SpellEffectHit:
|
||||
break;
|
||||
default:
|
||||
Log.outError(LogFilter.ScriptsAi, "SmartAIMgr: Not handled event_type({0}), Entry {1} SourceType {2} Event {3} Action {4}, skipped.", e.GetEventType(), e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
|
||||
@@ -1512,7 +1523,8 @@ namespace Game.AI
|
||||
{ SmartEvents.SceneStart, SmartScriptTypeMaskId.Scene },
|
||||
{ SmartEvents.SceneTrigger, SmartScriptTypeMaskId.Scene },
|
||||
{ SmartEvents.SceneCancel, SmartScriptTypeMaskId.Scene },
|
||||
{ SmartEvents.SceneComplete, SmartScriptTypeMaskId.Scene }
|
||||
{ SmartEvents.SceneComplete, SmartScriptTypeMaskId.Scene },
|
||||
{ SmartEvents.SpellEffectHit, SmartScriptTypeMaskId.Spell }
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1691,6 +1703,9 @@ namespace Game.AI
|
||||
[FieldOffset(16)]
|
||||
public Scene scene;
|
||||
|
||||
[FieldOffset(16)]
|
||||
public Spell spell;
|
||||
|
||||
[FieldOffset(16)]
|
||||
public Raw raw;
|
||||
|
||||
@@ -1897,6 +1912,10 @@ namespace Game.AI
|
||||
{
|
||||
public uint sceneId;
|
||||
}
|
||||
public struct Spell
|
||||
{
|
||||
public uint effIndex;
|
||||
}
|
||||
public struct Raw
|
||||
{
|
||||
public uint param1;
|
||||
|
||||
@@ -528,9 +528,13 @@ namespace Game.AI
|
||||
}
|
||||
else if (go)
|
||||
go.CastSpell(obj.ToUnit(), e.Action.cast.spell, triggerFlag);
|
||||
else if (spellTemplate != null)
|
||||
{
|
||||
spellTemplate.GetCaster().CastSpell(obj.ToUnit(), e.Action.cast.spell, triggerFlag);
|
||||
}
|
||||
|
||||
Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_CAST. Creature {0} casts spell {1} on target {2} with castflags {3}",
|
||||
me.GetGUID().ToString(), e.Action.cast.spell, obj.GetGUID().ToString(), e.Action.cast.castFlags);
|
||||
//Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_CAST. Creature {0} casts spell {1} on target {2} with castflags {3}",
|
||||
// me.GetGUID().ToString(), e.Action.cast.spell, obj.GetGUID().ToString(), e.Action.cast.castFlags);
|
||||
}
|
||||
else
|
||||
Log.outDebug(LogFilter.ScriptsAi, "Spell {0} not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: {1} Entry: {2} Type: {3}) already has the aura",
|
||||
@@ -2850,6 +2854,12 @@ namespace Game.AI
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SmartTargets.Caster:
|
||||
{
|
||||
if (spellTemplate != null)
|
||||
l.Add(spellTemplate.GetCaster());
|
||||
break;
|
||||
}
|
||||
case SmartTargets.Position:
|
||||
default:
|
||||
break;
|
||||
@@ -3428,6 +3438,9 @@ namespace Game.AI
|
||||
ProcessAction(e, unit, var0, 0, false, null, null, varString);
|
||||
break;
|
||||
}
|
||||
case SmartEvents.SpellEffectHit:
|
||||
ProcessAction(e, null, var0);
|
||||
break;
|
||||
default:
|
||||
Log.outError(LogFilter.Sql, "SmartScript.ProcessEvent: Unhandled Event type {0}", e.GetEventType());
|
||||
break;
|
||||
@@ -3623,7 +3636,7 @@ namespace Game.AI
|
||||
}
|
||||
}
|
||||
|
||||
void FillScript(List<SmartScriptHolder> e, WorldObject obj, AreaTriggerRecord at, SceneTemplate scene)
|
||||
void FillScript(List<SmartScriptHolder> e, WorldObject obj, AreaTriggerRecord at, SceneTemplate scene, Spell spell = null)
|
||||
{
|
||||
if (e.Empty())
|
||||
{
|
||||
@@ -3633,6 +3646,8 @@ namespace Game.AI
|
||||
Log.outDebug(LogFilter.ScriptsAi, "SmartScript: EventMap for AreaTrigger {0} is empty but is using SmartScript.", at.Id);
|
||||
if (scene != null)
|
||||
Log.outDebug(LogFilter.ScriptsAi, "SmartScript: EventMap for SceneId {0} is empty but is using SmartScript.", scene.SceneId);
|
||||
if (spell != null)
|
||||
Log.outDebug(LogFilter.ScriptsAi, "SmartScript: EventMap for SceneId {0} is empty but is using SmartScript.", scene.SceneId);
|
||||
return;
|
||||
}
|
||||
foreach (var holder in e)
|
||||
@@ -3656,6 +3671,8 @@ namespace Game.AI
|
||||
Log.outError(LogFilter.Sql, "SmartScript: AreaTrigger {0} has events but no events added to list because of instance flags. NOTE: triggers can not handle any instance flags.", at.Id);
|
||||
if (mEvents.Empty() && scene != null)
|
||||
Log.outError(LogFilter.Sql, "SmartScript: SceneId {0} has events but no events added to list because of instance flags. NOTE: scenes can not handle any instance flags.", scene.SceneId);
|
||||
if (mEvents.Empty() && spell != null)
|
||||
Log.outError(LogFilter.Sql, "SmartScript: Spell {0} has events but no events added to list because of instance flags. NOTE: scenes can not handle any instance flags.", spell.GetSpellInfo().Id);
|
||||
}
|
||||
|
||||
void GetScript()
|
||||
@@ -3685,9 +3702,14 @@ namespace Game.AI
|
||||
e = Global.SmartAIMgr.GetScript((int)sceneTemplate.SceneId, mScriptType);
|
||||
FillScript(e, null, null, sceneTemplate);
|
||||
}
|
||||
else if (spellTemplate != null)
|
||||
{
|
||||
e = Global.SmartAIMgr.GetScript((int)spellTemplate.GetSpellInfo().Id, mScriptType);
|
||||
FillScript(e, null, null, null, spellTemplate);
|
||||
}
|
||||
}
|
||||
|
||||
public void OnInitialize(WorldObject obj, AreaTriggerRecord at = null, SceneTemplate scene = null)
|
||||
public void OnInitialize(WorldObject obj)
|
||||
{
|
||||
if (obj != null)
|
||||
{
|
||||
@@ -3708,21 +3730,9 @@ namespace Game.AI
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (at != null)
|
||||
{
|
||||
mScriptType = SmartScriptType.AreaTrigger;
|
||||
trigger = at;
|
||||
Log.outDebug(LogFilter.ScriptsAi, "SmartScript.OnInitialize: source is AreaTrigger {0}", trigger.Id);
|
||||
}
|
||||
else if (scene != null)
|
||||
{
|
||||
mScriptType = SmartScriptType.Scene;
|
||||
sceneTemplate = scene;
|
||||
Log.outDebug(LogFilter.ScriptsAi, "SmartScript.OnInitialize: source is Scene with id {0}", scene.SceneId);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.outError(LogFilter.ScriptsAi, "SmartScript.OnInitialize: !WARNING! Initialized objects are Null.");
|
||||
Log.outError(LogFilter.ScriptsAi, "SmartScript.OnInitialize: !WARNING! Initialized WorldObject is Null.");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3736,6 +3746,72 @@ namespace Game.AI
|
||||
ProcessEventsFor(SmartEvents.JustCreated);
|
||||
}
|
||||
|
||||
public void OnInitialize(AreaTriggerRecord at)
|
||||
{
|
||||
if (at != null)
|
||||
{
|
||||
mScriptType = SmartScriptType.AreaTrigger;
|
||||
trigger = at;
|
||||
Log.outDebug(LogFilter.ScriptsAi, "SmartScript.OnInitialize: AreaTrigger {0}", trigger.Id);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.outError(LogFilter.ScriptsAi, "SmartScript.OnInitialize: !WARNING! Initialized AreaTrigger is Null.");
|
||||
return;
|
||||
}
|
||||
|
||||
GetScript();//load copy of script
|
||||
|
||||
foreach (var holder in mEvents)
|
||||
InitTimer(holder);//calculate timers for first time use
|
||||
|
||||
InstallEvents();
|
||||
}
|
||||
|
||||
public void OnInitialize(SceneTemplate scene)
|
||||
{
|
||||
if (scene != null)
|
||||
{
|
||||
mScriptType = SmartScriptType.Scene;
|
||||
sceneTemplate = scene;
|
||||
Log.outDebug(LogFilter.ScriptsAi, "SmartScript.OnInitialize: Scene with id {0}", scene.SceneId);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.outError(LogFilter.ScriptsAi, "SmartScript.OnInitialize: !WARNING! Initialized Scene is Null.");
|
||||
return;
|
||||
}
|
||||
|
||||
GetScript();//load copy of script
|
||||
|
||||
foreach (var holder in mEvents)
|
||||
InitTimer(holder);//calculate timers for first time use
|
||||
|
||||
InstallEvents();
|
||||
}
|
||||
|
||||
public void OnInitialize(Spell spell)
|
||||
{
|
||||
if (spell != null)
|
||||
{
|
||||
mScriptType = SmartScriptType.Spell;
|
||||
spellTemplate = spell;
|
||||
Log.outDebug(LogFilter.ScriptsAi, "SmartScript.OnInitialize: Spell id {0}", spell.GetSpellInfo().Id);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.outError(LogFilter.ScriptsAi, "SmartScript.OnInitialize: !WARNING! Initialized Spell is Null.");
|
||||
return;
|
||||
}
|
||||
|
||||
GetScript();//load copy of script
|
||||
|
||||
foreach (var holder in mEvents)
|
||||
InitTimer(holder);//calculate timers for first time use
|
||||
|
||||
InstallEvents();
|
||||
}
|
||||
|
||||
public void OnMoveInLineOfSight(Unit who)
|
||||
{
|
||||
ProcessEventsFor(SmartEvents.OocLos, who);
|
||||
@@ -4039,6 +4115,7 @@ namespace Game.AI
|
||||
ObjectGuid goOrigGUID;
|
||||
AreaTriggerRecord trigger;
|
||||
SceneTemplate sceneTemplate;
|
||||
Spell spellTemplate;
|
||||
SmartScriptType mScriptType;
|
||||
uint mEventPhase;
|
||||
|
||||
|
||||
@@ -785,7 +785,7 @@ namespace Game
|
||||
LoadAutobroadcasts();
|
||||
|
||||
// Load and initialize scripts
|
||||
Global.ObjectMgr.LoadSpellScripts(); // must be after load Creature/Gameobject(Template/Data)
|
||||
//Global.ObjectMgr.LoadSpellScripts(); // must be after load Creature/Gameobject(Template/Data)
|
||||
Global.ObjectMgr.LoadEventScripts(); // must be after load Creature/Gameobject(Template/Data)
|
||||
Global.ObjectMgr.LoadWaypointScripts();
|
||||
|
||||
|
||||
+221
-33
@@ -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)
|
||||
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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user