aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp35
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp1
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h5
3 files changed, 38 insertions, 3 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 2e8d2f72563..f9f37dee920 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -587,6 +587,39 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
break;
}
+ case SMART_ACTION_SELF_CAST:
+ {
+ if (targets.empty())
+ break;
+
+ if (e.action.cast.targetsLimit)
+ Trinity::Containers::RandomResize(targets, e.action.cast.targetsLimit);
+
+ TriggerCastFlags triggerFlags = TRIGGERED_NONE;
+ if (e.action.cast.castFlags & SMARTCAST_TRIGGERED)
+ {
+ if (e.action.cast.triggerFlags)
+ triggerFlags = TriggerCastFlags(e.action.cast.triggerFlags);
+ else
+ triggerFlags = TRIGGERED_FULL_MASK;
+ }
+
+ for (WorldObject* target : targets)
+ {
+ Unit* uTarget = target->ToUnit();
+ if (!uTarget)
+ continue;
+
+ if (!(e.action.cast.castFlags & SMARTCAST_AURA_NOT_PRESENT) || !uTarget->HasAura(e.action.cast.spell))
+ {
+ if (e.action.cast.castFlags & SMARTCAST_INTERRUPT_PREVIOUS)
+ uTarget->InterruptNonMeleeSpells(false);
+
+ uTarget->CastSpell(uTarget, e.action.cast.spell, triggerFlags);
+ }
+ }
+ break;
+ }
case SMART_ACTION_INVOKER_CAST:
{
Unit* tempLastInvoker = GetLastInvoker(unit);
@@ -596,7 +629,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (targets.empty())
break;
- if (e.action.cast.targetsLimit > 0 && targets.size() > e.action.cast.targetsLimit)
+ if (e.action.cast.targetsLimit)
Trinity::Containers::RandomResize(targets, e.action.cast.targetsLimit);
for (WorldObject* target : targets)
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index 3028c101fc3..03003852664 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -1190,6 +1190,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
// return false;
}
// no break
+ case SMART_ACTION_SELF_CAST:
case SMART_ACTION_ADD_AURA:
if (!IsSpellValid(e, e.action.cast.spell))
return false;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index fa2e59f8941..57ed0df9fd3 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -532,7 +532,7 @@ enum SMART_ACTION
SMART_ACTION_ADD_NPC_FLAG = 82, // Flags
SMART_ACTION_REMOVE_NPC_FLAG = 83, // Flags
SMART_ACTION_SIMPLE_TALK = 84, // groupID, can be used to make players say groupID, Text_over event is not triggered, whisper can not be used (Target units will say the text)
- SMART_ACTION_INVOKER_CAST = 85, // spellID, castFlags, if avaliable, last used invoker will cast spellId with castFlags on targets
+ SMART_ACTION_SELF_CAST = 85, // spellID, castFlags
SMART_ACTION_CROSS_CAST = 86, // spellID, castFlags, CasterTargetType, CasterTarget param1, CasterTarget param2, CasterTarget param3, ( + the origonal target fields as Destination target), CasterTargets will cast spellID on all Targets (use with caution if targeting multiple * multiple units)
SMART_ACTION_CALL_RANDOM_TIMED_ACTIONLIST = 87, // script9 ids 1-9
SMART_ACTION_CALL_RANDOM_RANGE_TIMED_ACTIONLIST = 88, // script9 id min, max
@@ -581,8 +581,9 @@ enum SMART_ACTION
SMART_ACTION_SPAWN_SPAWNGROUP = 131, // Group ID, min secs, max secs, spawnflags
SMART_ACTION_DESPAWN_SPAWNGROUP = 132, // Group ID, min secs, max secs, spawnflags
SMART_ACTION_RESPAWN_BY_SPAWNID = 133, // spawnType, spawnId
+ SMART_ACTION_INVOKER_CAST = 134, // spellID, castFlags
- SMART_ACTION_END = 134
+ SMART_ACTION_END = 135
};
struct SmartAction