aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp38
1 files changed, 6 insertions, 32 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 9389a012e3d..3a6b8c93661 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -566,43 +566,17 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (e.action.cast.castFlags & SMARTCAST_INTERRUPT_PREVIOUS)
me->InterruptNonMeleeSpells(false);
+ SpellCastResult result = me->CastSpell(target->ToUnit(), e.action.cast.spell, triggerFlag);
+ bool spellCastFailed = (result != SPELL_CAST_OK && result != SPELL_FAILED_SPELL_IN_PROGRESS);
+
if (e.action.cast.castFlags & SMARTCAST_COMBAT_MOVE)
{
// If cast flag SMARTCAST_COMBAT_MOVE is set combat movement will not be allowed unless target is outside spell range, out of mana, or LOS.
- bool allowMove = false;
- SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(e.action.cast.spell, me->GetMap()->GetDifficultyID());
- std::vector<SpellPowerCost> costs = spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask());
- bool hasPower = true;
- for (SpellPowerCost const& cost : costs)
- {
- if (cost.Power == POWER_HEALTH)
- {
- if (me->GetHealth() <= uint32(cost.Amount))
- {
- hasPower = false;
- break;
- }
- }
- else
- {
- if (me->GetPower(cost.Power) < cost.Amount)
- {
- hasPower = false;
- break;
- }
- }
- }
-
- if (me->GetDistance(target) > spellInfo->GetMaxRange(true) || me->GetDistance(target) < spellInfo->GetMinRange(true) ||
- !me->IsWithinLOSInMap(target) ||
- !hasPower ||
- me->HasUnitFlag(UNIT_FLAG_SILENCED))
- allowMove = true;
-
- ENSURE_AI(SmartAI, me->AI())->SetCombatMove(allowMove, true);
+ ENSURE_AI(SmartAI, me->AI())->SetCombatMove(spellCastFailed, true);
}
- me->CastSpell(target->ToUnit(), e.action.cast.spell, triggerFlag);
+ if (spellCastFailed)
+ RecalcTimer(e, 500, 500);
}
else if (go)
go->CastSpell(target->ToUnit(), e.action.cast.spell, triggerFlag);