From 809e60194538646f38dd1384577db85b450b3b71 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 10 Jul 2017 14:23:51 -0400 Subject: [PATCH 1/3] First try at making spells in SmartAI Signed-off-by: hondacrx --- Framework/Constants/SmartAIConst.cs | 9 +- Game/AI/AISelector.cs | 21 ++ Game/AI/SmartScripts/SmartAI.cs | 52 ++++- Game/AI/SmartScripts/SmartAIManager.cs | 21 +- Game/AI/SmartScripts/SmartScript.cs | 111 +++++++++-- Game/Server/WorldManager.cs | 2 +- Game/Spells/Spell.cs | 256 +++++++++++++++++++++---- 7 files changed, 412 insertions(+), 60 deletions(-) diff --git a/Framework/Constants/SmartAIConst.cs b/Framework/Constants/SmartAIConst.cs index 6245d2d40..459f0a3c4 100644 --- a/Framework/Constants/SmartAIConst.cs +++ b/Framework/Constants/SmartAIConst.cs @@ -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 } } diff --git a/Game/AI/AISelector.cs b/Game/AI/AISelector.cs index f103c43f9..959cfe603 100644 --- a/Game/AI/AISelector.cs +++ b/Game/AI/AISelector.cs @@ -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; + } } } diff --git a/Game/AI/SmartScripts/SmartAI.cs b/Game/AI/SmartScripts/SmartAI.cs index 7b943b405..12045736d 100644 --- a/Game/AI/SmartScripts/SmartAI.cs +++ b/Game/AI/SmartScripts/SmartAI.cs @@ -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 scriptHolders = new List(); + 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); } } diff --git a/Game/AI/SmartScripts/SmartAIManager.cs b/Game/AI/SmartScripts/SmartAIManager.cs index 885efc1d2..09820c791 100644 --- a/Game/AI/SmartScripts/SmartAIManager.cs +++ b/Game/AI/SmartScripts/SmartAIManager.cs @@ -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; diff --git a/Game/AI/SmartScripts/SmartScript.cs b/Game/AI/SmartScripts/SmartScript.cs index 852edc9ba..0591eb0e4 100644 --- a/Game/AI/SmartScripts/SmartScript.cs +++ b/Game/AI/SmartScripts/SmartScript.cs @@ -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 e, WorldObject obj, AreaTriggerRecord at, SceneTemplate scene) + void FillScript(List 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; diff --git a/Game/Server/WorldManager.cs b/Game/Server/WorldManager.cs index 0e66c937e..7c3116f85 100644 --- a/Game/Server/WorldManager.cs +++ b/Game/Server/WorldManager.cs @@ -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(); diff --git a/Game/Spells/Spell.cs b/Game/Spells/Spell.cs index 5422e0592..96670f70b 100644 --- a/Game/Spells/Spell.cs +++ b/Game/Spells/Spell.cs @@ -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 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 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 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 m_loadedScripts = new List(); + SpellScript script { get; set; } int CalculateDamage(uint i, Unit target) { From a63a3360b68288d5bb9076572fa571bba22704af Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 11 Jul 2017 00:04:18 -0400 Subject: [PATCH 2/3] More work on smartAI for spells. got the Orb of Translocations working. SQL files to follow someday :) Signed-off-by: hondacrx --- Framework/Constants/SmartAIConst.cs | 2 +- Game/AI/SmartScripts/SmartAI.cs | 2 +- Game/AI/SmartScripts/SmartAIManager.cs | 22 ++++++++++++++-------- Game/AI/SmartScripts/SmartScript.cs | 14 ++++++-------- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/Framework/Constants/SmartAIConst.cs b/Framework/Constants/SmartAIConst.cs index 459f0a3c4..b243874eb 100644 --- a/Framework/Constants/SmartAIConst.cs +++ b/Framework/Constants/SmartAIConst.cs @@ -362,7 +362,7 @@ 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, + SpellTarget = 30, End = 31 } diff --git a/Game/AI/SmartScripts/SmartAI.cs b/Game/AI/SmartScripts/SmartAI.cs index 12045736d..c82141779 100644 --- a/Game/AI/SmartScripts/SmartAI.cs +++ b/Game/AI/SmartScripts/SmartAI.cs @@ -1059,7 +1059,7 @@ namespace Game.AI void HandleEffectHit(uint effIndex) { - mScript.ProcessEventsFor(SmartEvents.SpellEffectHit); + mScript.ProcessEventsFor(SmartEvents.SpellEffectHit, GetCaster()); } void HandleEffectHitTarget(uint effIndex) diff --git a/Game/AI/SmartScripts/SmartAIManager.cs b/Game/AI/SmartScripts/SmartAIManager.cs index 09820c791..cb763b742 100644 --- a/Game/AI/SmartScripts/SmartAIManager.cs +++ b/Game/AI/SmartScripts/SmartAIManager.cs @@ -28,12 +28,19 @@ namespace Game.AI { public class SmartAIManager : Singleton { - SmartAIManager() { } + SmartAIManager() + { + for (byte i = 0; i < (int)SmartScriptType.Max; i++) + mEventMap[i] = new MultiMap(); + } public void LoadFromDB() { uint oldMSTime = Time.GetMSTime(); + for (byte i = 0; i < (int)SmartScriptType.Max; i++) + mEventMap[i].Clear(); //Drop Existing SmartAI List + PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.SEL_SMART_SCRIPTS); SQLResult result = DB.World.Query(stmt); if (result.IsEmpty()) @@ -158,15 +165,13 @@ namespace Game.AI continue; // creature entry / guid not found in storage, create empty event list for it and increase counters - if (mEventMap[(int)source_type] == null) - mEventMap[(int)source_type] = new MultiMap(); - if (!mEventMap[(int)source_type].ContainsKey(temp.entryOrGuid)) ++count; // store the new event - mEventMap[(uint)source_type].Add(temp.entryOrGuid, temp); - } while (result.NextRow()); + mEventMap[(int)source_type].Add(temp.entryOrGuid, temp); + } + while (result.NextRow()); // Post Loading Validation for (byte i = 0; i < (int)SmartScriptType.Max; ++i) @@ -327,7 +332,7 @@ namespace Game.AI case SmartTargets.Stored: case SmartTargets.LootRecipients: case SmartTargets.VehicleAccessory: - case SmartTargets.Caster: + case SmartTargets.SpellTarget: 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()); @@ -1524,7 +1529,8 @@ namespace Game.AI { SmartEvents.SceneTrigger, SmartScriptTypeMaskId.Scene }, { SmartEvents.SceneCancel, SmartScriptTypeMaskId.Scene }, { SmartEvents.SceneComplete, SmartScriptTypeMaskId.Scene }, - { SmartEvents.SpellEffectHit, SmartScriptTypeMaskId.Spell } + { SmartEvents.SpellEffectHit, SmartScriptTypeMaskId.Spell }, + { SmartEvents.SpellEffectHitTarget, SmartScriptTypeMaskId.Spell } }; } diff --git a/Game/AI/SmartScripts/SmartScript.cs b/Game/AI/SmartScripts/SmartScript.cs index 0591eb0e4..8d13a5549 100644 --- a/Game/AI/SmartScripts/SmartScript.cs +++ b/Game/AI/SmartScripts/SmartScript.cs @@ -528,10 +528,8 @@ 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); - } + else if (obj != null) + obj.ToUnit().CastSpell(obj.ToUnit(), e.Action.cast.spell); //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); @@ -2854,10 +2852,10 @@ namespace Game.AI } break; } - case SmartTargets.Caster: + case SmartTargets.SpellTarget: { if (spellTemplate != null) - l.Add(spellTemplate.GetCaster()); + l.Add(spellTemplate.m_targets.GetUnitTarget()); break; } case SmartTargets.Position: @@ -3439,7 +3437,7 @@ namespace Game.AI break; } case SmartEvents.SpellEffectHit: - ProcessAction(e, null, var0); + ProcessAction(e, unit, var0); break; default: Log.outError(LogFilter.Sql, "SmartScript.ProcessEvent: Unhandled Event type {0}", e.GetEventType()); @@ -3923,7 +3921,7 @@ namespace Game.AI return summoner; } - bool IsUnit(WorldObject obj) { return obj != null && obj.IsTypeId(TypeId.Unit) || obj.IsTypeId(TypeId.Player); } + bool IsUnit(WorldObject obj) { return obj != null && (obj.IsTypeId(TypeId.Unit) || obj.IsTypeId(TypeId.Player)); } public bool IsPlayer(WorldObject obj) { return obj != null && obj.IsTypeId(TypeId.Player); } bool IsCreature(WorldObject obj) { return obj != null && obj.IsTypeId(TypeId.Unit); } static bool IsCreatureInControlOfSelf(WorldObject obj) From c41f76d27e7738ce41ce8b83041903911620ddc2 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Fri, 21 Jul 2017 23:08:32 -0400 Subject: [PATCH 3/3] Revert some of 809e60194538646f38dd1384577db85b450b3b71 --- Game/AI/AISelector.cs | 19 --- Game/Spells/Auras/Aura.cs | 2 +- Game/Spells/Spell.cs | 264 +++++++------------------------------- 3 files changed, 47 insertions(+), 238 deletions(-) diff --git a/Game/AI/AISelector.cs b/Game/AI/AISelector.cs index 959cfe603..0a399a58a 100644 --- a/Game/AI/AISelector.cs +++ b/Game/AI/AISelector.cs @@ -128,24 +128,5 @@ 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; - } } } diff --git a/Game/Spells/Auras/Aura.cs b/Game/Spells/Auras/Aura.cs index b4d9cfb8c..c43be84e2 100644 --- a/Game/Spells/Auras/Aura.cs +++ b/Game/Spells/Auras/Aura.cs @@ -1823,7 +1823,7 @@ namespace Game.Spells public void LoadScripts() { 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); script.Register(); diff --git a/Game/Spells/Spell.cs b/Game/Spells/Spell.cs index 96670f70b..7ef22ffea 100644 --- a/Game/Spells/Spell.cs +++ b/Game/Spells/Spell.cs @@ -32,6 +32,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; using System.Runtime.InteropServices; +using Game.AI; namespace Game.Spells { @@ -131,9 +132,8 @@ namespace Game.Spells public virtual void Dispose() { // unload scripts - //foreach (var script in m_loadedScripts) - //script._Unload(); - script.Unload(); + foreach (var script in m_loadedScripts.ToList()) + script._Unload(); if (m_referencedFromCurrentSpell && m_selfContainer && m_selfContainer == this) { @@ -6648,35 +6648,29 @@ namespace Game.Spells { 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) - 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; + script._Register(); + if (script._Validate(GetSpellInfo())) + m_loadedScripts.Add(script); } } - 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() { - if (script == null) - return; - - script._PrepareScriptCall(SpellScriptHookType.BeforeCast); - - foreach (var hook in script.BeforeCast) - hook.Call(); - - script._FinishScriptCall(); - - /*foreach (var script in m_loadedScripts) + foreach (var script in m_loadedScripts) { script._PrepareScriptCall(SpellScriptHookType.BeforeCast); @@ -6684,22 +6678,12 @@ namespace Game.Spells hook.Call(); script._FinishScriptCall(); - }*/ + } } void CallScriptOnCastHandlers() { - if (script == null) - return; - - script._PrepareScriptCall(SpellScriptHookType.OnCast); - - foreach (var hook in script.OnCast) - hook.Call(); - - script._FinishScriptCall(); - - /*foreach (var script in m_loadedScripts) + foreach (var script in m_loadedScripts) { script._PrepareScriptCall(SpellScriptHookType.OnCast); @@ -6707,22 +6691,12 @@ namespace Game.Spells hook.Call(); script._FinishScriptCall(); - }*/ + } } void CallScriptAfterCastHandlers() { - if (script == null) - return; - - script._PrepareScriptCall(SpellScriptHookType.AfterCast); - - foreach (var hook in script.AfterCast) - hook.Call(); - - script._FinishScriptCall(); - - /*foreach (var script in m_loadedScripts) + foreach (var script in m_loadedScripts) { script._PrepareScriptCall(SpellScriptHookType.AfterCast); @@ -6730,27 +6704,13 @@ namespace Game.Spells hook.Call(); script._FinishScriptCall(); - }*/ + } } SpellCastResult CallScriptCheckCastHandlers() { SpellCastResult retVal = SpellCastResult.SpellCastOk; - 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) + foreach (var script in m_loadedScripts) { script._PrepareScriptCall(SpellScriptHookType.CheckCast); @@ -6762,67 +6722,22 @@ namespace Game.Spells } script._FinishScriptCall(); - }*/ + } return retVal; } void PrepareScriptHitHandlers() { - if (script == null) - return; - - script._InitHit(); - - //foreach (var script in m_loadedScripts) - //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; - SpellScriptHookType hookType; - List 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) + foreach (var script in m_loadedScripts) { SpellScriptHookType hookType; List effList; @@ -6860,23 +6775,13 @@ namespace Game.Spells preventDefault = script._IsDefaultEffectPrevented(effIndex); script._FinishScriptCall(); - }*/ + } return preventDefault; } void CallScriptSuccessfulDispel(uint effIndex) { - 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) + foreach (var script in m_loadedScripts) { script._PrepareScriptCall(SpellScriptHookType.EffectSuccessfulDispel); @@ -6884,22 +6789,12 @@ namespace Game.Spells hook.Call(effIndex); script._FinishScriptCall(); - }*/ + } } void CallScriptBeforeHitHandlers(SpellMissInfo missInfo) { - 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) + foreach (var script in m_loadedScripts) { script._PrepareScriptCall(SpellScriptHookType.BeforeHit); @@ -6907,22 +6802,12 @@ namespace Game.Spells hook.Call(missInfo); script._FinishScriptCall(); - }*/ + } } void CallScriptOnHitHandlers() { - if (script == null) - return; - - script._PrepareScriptCall(SpellScriptHookType.OnHit); - - foreach (var hook in script.OnHit) - hook.Call(); - - script._FinishScriptCall(); - - /*foreach (var script in m_loadedScripts) + foreach (var script in m_loadedScripts) { script._PrepareScriptCall(SpellScriptHookType.OnHit); @@ -6930,22 +6815,12 @@ namespace Game.Spells hook.Call(); script._FinishScriptCall(); - }*/ + } } void CallScriptAfterHitHandlers() { - if (script == null) - return; - - script._PrepareScriptCall(SpellScriptHookType.AfterHit); - - foreach (var hook in script.AfterHit) - hook.Call(); - - script._FinishScriptCall(); - - /*foreach (var script in m_loadedScripts) + foreach (var script in m_loadedScripts) { script._PrepareScriptCall(SpellScriptHookType.AfterHit); @@ -6953,23 +6828,12 @@ namespace Game.Spells hook.Call(); script._FinishScriptCall(); - }*/ + } } void CallScriptObjectAreaTargetSelectHandlers(List targets, uint effIndex, SpellImplicitTargetInfo targetType) { - 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) + foreach (var script in m_loadedScripts) { script._PrepareScriptCall(SpellScriptHookType.ObjectAreaTargetSelect); @@ -6978,23 +6842,12 @@ namespace Game.Spells hook.Call(targets); script._FinishScriptCall(); - }*/ + } } void CallScriptObjectTargetSelectHandlers(ref WorldObject target, uint effIndex, SpellImplicitTargetInfo targetType) { - 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) + foreach (var script in m_loadedScripts) { script._PrepareScriptCall(SpellScriptHookType.ObjectTargetSelect); @@ -7003,23 +6856,12 @@ namespace Game.Spells hook.Call(ref target); script._FinishScriptCall(); - }*/ + } } void CallScriptDestinationTargetSelectHandlers(ref SpellDestination target, uint effIndex, SpellImplicitTargetInfo targetType) { - 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) + foreach (var script in m_loadedScripts) { script._PrepareScriptCall(SpellScriptHookType.DestinationTargetSelect); @@ -7028,29 +6870,16 @@ 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()) - //return true; - - if (script == null) + if (m_loadedScripts.Empty()) return true; - 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 script in m_loadedScripts) { foreach (var hook in script.OnObjectTargetSelect) 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)) || (!hook.IsEffectAffected(m_spellInfo, effIndex) && hook.IsEffectAffected(m_spellInfo, effIndexToCheck))) return false; - }*/ + } return true; } @@ -7199,7 +7028,6 @@ namespace Game.Spells } List m_loadedScripts = new List(); - SpellScript script { get; set; } int CalculateDamage(uint i, Unit target) {