From fbb50210aa06f6ba7ea58079198ffd34e17a7f35 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Fri, 28 Jan 2022 18:10:30 +0100 Subject: [PATCH] fix(Core/Spells): Reset melee swing timer on cast rather than on finish. (#10101) Fixes #7216 --- src/server/game/Spells/Spell.cpp | 63 ++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 2fa0bfddc..0493ff6a6 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3797,6 +3797,41 @@ void Spell::_cast(bool skipCheck) handle_immediate(); } + if (IsAutoActionResetSpell()) + { + bool found = false; + Unit::AuraEffectList const& vIgnoreReset = m_caster->GetAuraEffectsByType(SPELL_AURA_IGNORE_MELEE_RESET); + for (Unit::AuraEffectList::const_iterator i = vIgnoreReset.begin(); i != vIgnoreReset.end(); ++i) + { + if ((*i)->IsAffectedOnSpell(m_spellInfo)) + { + found = true; + break; + } + } + + if (!found && !m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS)) + { + bool allow = true; + if (m_casttime == 0 && m_spellInfo->CalcCastTime()) + { + allow = false; + } + + if (allow) + { + m_caster->resetAttackTimer(BASE_ATTACK); + + if (m_caster->haveOffhandWeapon()) + { + m_caster->resetAttackTimer(OFF_ATTACK); + } + + m_caster->resetAttackTimer(RANGED_ATTACK); + } + } + } + CallScriptAfterCastHandlers(); if (modOwner) @@ -4241,34 +4276,6 @@ void Spell::finish(bool ok) } } - if (IsAutoActionResetSpell()) - { - bool found = false; - Unit::AuraEffectList const& vIgnoreReset = m_caster->GetAuraEffectsByType(SPELL_AURA_IGNORE_MELEE_RESET); - for (Unit::AuraEffectList::const_iterator i = vIgnoreReset.begin(); i != vIgnoreReset.end(); ++i) - { - if ((*i)->IsAffectedOnSpell(m_spellInfo)) - { - found = true; - break; - } - } - if (!found && !m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS)) - { - bool allow = true; - if (m_casttime == 0 && m_spellInfo->CalcCastTime()) - allow = false; - - if (allow) - { - m_caster->resetAttackTimer(BASE_ATTACK); - if (m_caster->haveOffhandWeapon()) - m_caster->resetAttackTimer(OFF_ATTACK); - m_caster->resetAttackTimer(RANGED_ATTACK); - } - } - } - // potions disabled by client, send event "not in combat" if need if (m_caster->GetTypeId() == TYPEID_PLAYER && !m_triggeredByAuraSpell) m_caster->ToPlayer()->UpdatePotionCooldown(this);