diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 35 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 1 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 4 |
3 files changed, 37 insertions, 3 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index efe13db12f1..ec639b906e4 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -614,6 +614,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); @@ -623,7 +656,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 3f612510cfa..eed53952898 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -1290,6 +1290,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 0e1fe59b06e..49e14a34207 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -548,7 +548,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 @@ -597,7 +597,7 @@ 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 - // 134 : 3.3.5 reserved + SMART_ACTION_INVOKER_CAST = 134, // spellID, castFlags SMART_ACTION_PLAY_CINEMATIC = 135, // reserved for future uses SMART_ACTION_SET_MOVEMENT_SPEED = 136, // movementType, speedInteger, speedFraction SMART_ACTION_PLAY_SPELL_VISUAL_KIT = 137, // spellVisualKitId, kitType (unknown values, copypaste from packet dumps), duration |