From 55720eedd3cfe2485faf84c1eba47c72ffcaaa0e Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Mon, 23 May 2022 10:49:56 +0200 Subject: [PATCH] fix(Scripts/Spells): Sweeping Strikes - improvements. (#11666) * fix(Scripts/Spells): Sweeping Strikes - improvements. Fixes #11594 * Buildfix. --- src/server/game/Spells/Spell.cpp | 45 ++----------------- src/server/game/Spells/Spell.h | 2 +- src/server/game/Spells/SpellEffects.cpp | 7 --- src/server/scripts/Spells/spell_warrior.cpp | 49 ++++++++++++++------- 4 files changed, 37 insertions(+), 66 deletions(-) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 751033fe0..9758eeebc 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -8205,7 +8205,6 @@ void Spell::HandleLaunchPhase() PrepareTargetProcessing(); - bool firstTarget = true; for (std::list::iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) { TargetInfo& target = *ihit; @@ -8239,14 +8238,14 @@ void Spell::HandleLaunchPhase() break; } } - DoAllEffectOnLaunchTarget(target, multiplier, firstTarget); - firstTarget = false; + + DoAllEffectOnLaunchTarget(target, multiplier); } FinishTargetProcessing(); } -void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier, bool firstTarget) +void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier) { Unit* unit = nullptr; // In case spell hit target, do all effect on that target @@ -8258,7 +8257,6 @@ void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier, if (!unit) return; - uint8 ssEffect = MAX_SPELL_EFFECTS; for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (targetInfo.effectMask & (1 << i)) @@ -8289,18 +8287,6 @@ void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier, m_damageMultipliers[i] *= multiplier[i]; } targetInfo.damage += m_damage; - - // Sweeping Strikes - switch (m_spellInfo->Effects[i].Effect) - { - case SPELL_EFFECT_SCHOOL_DAMAGE: - case SPELL_EFFECT_WEAPON_DAMAGE: - case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL: - case SPELL_EFFECT_NORMALIZED_WEAPON_DMG: - case SPELL_EFFECT_WEAPON_PERCENT_DAMAGE: - ssEffect = i; - break; - } } } @@ -8317,31 +8303,6 @@ void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier, float critChance = caster->SpellDoneCritChance(unit, m_spellInfo, m_spellSchoolMask, m_attackType, false); critChance = unit->SpellTakenCritChance(caster, m_spellInfo, m_spellSchoolMask, critChance, m_attackType, false); targetInfo.crit = roll_chance_f(std::max(0.0f, critChance)); - - // Sweeping strikes - if (m_caster->getClass() == CLASS_WARRIOR && ssEffect < MAX_SPELL_EFFECTS && m_spellInfo->SpellFamilyName == SPELLFAMILY_WARRIOR && - ((m_spellInfo->Id != 50622 && m_spellInfo->Id != 44949) || firstTarget)) - { - if (Aura* aur = m_caster->GetAura(12328)) - { - Unit* target = m_caster->SelectNearbyNoTotemTarget(unit); - if (!target || target == unit) - return; // finish - - int32 mdmg = m_damage; - int32 basepoints = 0; - m_damage = 0; - - HandleEffects(target, nullptr, nullptr, ssEffect, SPELL_EFFECT_HANDLE_LAUNCH_TARGET); - - basepoints = (targetInfo.crit ? Unit::SpellCriticalDamageBonus(m_caster, m_spellInfo, m_damage, target) : m_damage); - m_damage = mdmg; - m_caster->CastCustomSpell(target, 26654, &basepoints, nullptr, nullptr, true); - - if (m_spellInfo->Id != 44949) - aur->DropCharge(); - } - } } SpellCastResult Spell::CanOpenLock(uint32 effIndex, uint32 lockId, SkillType& skillId, int32& reqSkillValue, int32& skillValue) diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 75cecae7b..65f2d9bf7 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -708,7 +708,7 @@ public: bool UpdateChanneledTargetList(); bool IsValidDeadOrAliveTarget(Unit const* target) const; void HandleLaunchPhase(); - void DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier, bool firstTarget); + void DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier); void PrepareTargetProcessing(); void FinishTargetProcessing(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index d0547a1bc..2fb4afd0b 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3352,13 +3352,6 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex) AddPct(totalDamagePercentMod, unitTarget->GetDiseasesByCaster(m_caster->GetGUID(), 1) * 30.0f); break; } - // sweeping strikes - case 26654: - { - this->damage = 0; - m_damage = m_spellValue->EffectBasePoints[effIndex]; - return; - } } break; } diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index 8ce91057e..b107256d7 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -50,14 +50,16 @@ enum WarriorSpells SPELL_WARRIOR_RETALIATION_DAMAGE = 22858, SPELL_WARRIOR_SLAM = 50783, SPELL_WARRIOR_SUNDER_ARMOR = 58567, - SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK = 26654, + SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1 = 12723, + SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2 = 26654, SPELL_WARRIOR_TAUNT = 355, SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1 = 46859, SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_2 = 46860, SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_1 = 64849, SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_2 = 64850, SPELL_WARRIOR_VIGILANCE_PROC = 50725, - SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT = 59665 + SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT = 59665, + SPELL_WARRIOR_WHIRLWIND_OFF = 44949 }; enum WarriorSpellIcons @@ -613,7 +615,7 @@ class spell_warr_sweeping_strikes : public AuraScript bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo({ SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK }); + return ValidateSpellInfo({ SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2 }); } bool Load() override @@ -624,21 +626,27 @@ class spell_warr_sweeping_strikes : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - if (!eventInfo.GetActor() || eventInfo.GetProcTarget()) + Unit* actor = eventInfo.GetActor(); + if (!actor) { return false; } + if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) + { + switch (spellInfo->Id) + { + case SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1: + case SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2: + case SPELL_WARRIOR_WHIRLWIND_OFF: + return false; + default: + break; + } + } + _procTarget = eventInfo.GetActor()->SelectNearbyNoTotemTarget(eventInfo.GetProcTarget()); - - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - - if (!damageInfo || !damageInfo->GetSpellInfo()) - { - return false; - } - - return _procTarget && !damageInfo->GetSpellInfo(); + return _procTarget != nullptr; } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) @@ -646,8 +654,17 @@ class spell_warr_sweeping_strikes : public AuraScript PreventDefaultAction(); if (DamageInfo* damageInfo = eventInfo.GetDamageInfo()) { - int32 damage = damageInfo->GetUnmitigatedDamage(); - GetTarget()->CastCustomSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK, &damage, 0, 0, true, nullptr, aurEff); + SpellInfo const* spellInfo = damageInfo->GetSpellInfo(); + if (spellInfo && spellInfo->Id == SPELL_WARRIOR_EXECUTE && !_procTarget->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT)) + { + // If triggered by Execute (while target is not under 20% hp) deals normalized weapon damage + GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2, aurEff); + } + else + { + int32 damage = damageInfo->GetUnmitigatedDamage(); + GetTarget()->CastCustomSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1, &damage, 0, 0, true, nullptr, aurEff); + } } } @@ -658,7 +675,7 @@ class spell_warr_sweeping_strikes : public AuraScript } private: - Unit* _procTarget; + Unit* _procTarget = nullptr; }; // 50720 - Vigilance