From e11e1938b5237a198c82cfdf128a9b6c1e3686ad Mon Sep 17 00:00:00 2001 From: Giacomo Pozzoni Date: Sun, 9 Aug 2020 19:24:15 +0000 Subject: 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) --- src/server/game/AI/SmartScripts/SmartScript.cpp | 38 ++++--------------------- 1 file changed, 6 insertions(+), 32 deletions(-) (limited to 'src') 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 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); -- cgit v1.2.3