aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiacomo Pozzoni <giacomopoz@gmail.com>2020-08-09 19:24:15 +0000
committerShauren <shauren.trinity@gmail.com>2022-01-26 19:21:10 +0100
commite11e1938b5237a198c82cfdf128a9b6c1e3686ad (patch)
tree22fd87ecb065a35db251252655cb757f4dd7806d
parent26894508ef03d9e5ec9ca61eb1f9555adee189a6 (diff)
Core/SAI: Fix creatures casting with flag SMARTCAST_COMBAT_MOVE not switching to melee when the school of the spell they are trying to cast gets silenced (and other cases of spell failure) (#25226)
* Core/SAI: Fix creatures casting with flag SMARTCAST_COMBAT_MOVE not switching to melee when the school of the spell they are trying to cast gets silenced (and other cases of spell failure) * Core/SAI: Retry casting after 500ms if a cast failed Fixes #24914 (cherry picked from commit 63a6e1e0480df659e773a3df5e1acc2027ebcf15)
-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);