mirror of
https://github.com/liyunfan1223/azerothcore-wotlk.git
synced 2026-08-07 23:38:00 +00:00
fix(Scripts/Spells): Sweeping Strikes - improvements. (#11666)
* fix(Scripts/Spells): Sweeping Strikes - improvements. Fixes #11594 * Buildfix.
This commit is contained in:
@@ -8205,7 +8205,6 @@ void Spell::HandleLaunchPhase()
|
|||||||
|
|
||||||
PrepareTargetProcessing();
|
PrepareTargetProcessing();
|
||||||
|
|
||||||
bool firstTarget = true;
|
|
||||||
for (std::list<TargetInfo>::iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit)
|
for (std::list<TargetInfo>::iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit)
|
||||||
{
|
{
|
||||||
TargetInfo& target = *ihit;
|
TargetInfo& target = *ihit;
|
||||||
@@ -8239,14 +8238,14 @@ void Spell::HandleLaunchPhase()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DoAllEffectOnLaunchTarget(target, multiplier, firstTarget);
|
|
||||||
firstTarget = false;
|
DoAllEffectOnLaunchTarget(target, multiplier);
|
||||||
}
|
}
|
||||||
|
|
||||||
FinishTargetProcessing();
|
FinishTargetProcessing();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier, bool firstTarget)
|
void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier)
|
||||||
{
|
{
|
||||||
Unit* unit = nullptr;
|
Unit* unit = nullptr;
|
||||||
// In case spell hit target, do all effect on that target
|
// In case spell hit target, do all effect on that target
|
||||||
@@ -8258,7 +8257,6 @@ void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier,
|
|||||||
if (!unit)
|
if (!unit)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint8 ssEffect = MAX_SPELL_EFFECTS;
|
|
||||||
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||||
{
|
{
|
||||||
if (targetInfo.effectMask & (1 << i))
|
if (targetInfo.effectMask & (1 << i))
|
||||||
@@ -8289,18 +8287,6 @@ void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier,
|
|||||||
m_damageMultipliers[i] *= multiplier[i];
|
m_damageMultipliers[i] *= multiplier[i];
|
||||||
}
|
}
|
||||||
targetInfo.damage += m_damage;
|
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);
|
float critChance = caster->SpellDoneCritChance(unit, m_spellInfo, m_spellSchoolMask, m_attackType, false);
|
||||||
critChance = unit->SpellTakenCritChance(caster, m_spellInfo, m_spellSchoolMask, critChance, 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));
|
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)
|
SpellCastResult Spell::CanOpenLock(uint32 effIndex, uint32 lockId, SkillType& skillId, int32& reqSkillValue, int32& skillValue)
|
||||||
|
|||||||
@@ -708,7 +708,7 @@ public:
|
|||||||
bool UpdateChanneledTargetList();
|
bool UpdateChanneledTargetList();
|
||||||
bool IsValidDeadOrAliveTarget(Unit const* target) const;
|
bool IsValidDeadOrAliveTarget(Unit const* target) const;
|
||||||
void HandleLaunchPhase();
|
void HandleLaunchPhase();
|
||||||
void DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier, bool firstTarget);
|
void DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier);
|
||||||
|
|
||||||
void PrepareTargetProcessing();
|
void PrepareTargetProcessing();
|
||||||
void FinishTargetProcessing();
|
void FinishTargetProcessing();
|
||||||
|
|||||||
@@ -3352,13 +3352,6 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex)
|
|||||||
AddPct(totalDamagePercentMod, unitTarget->GetDiseasesByCaster(m_caster->GetGUID(), 1) * 30.0f);
|
AddPct(totalDamagePercentMod, unitTarget->GetDiseasesByCaster(m_caster->GetGUID(), 1) * 30.0f);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// sweeping strikes
|
|
||||||
case 26654:
|
|
||||||
{
|
|
||||||
this->damage = 0;
|
|
||||||
m_damage = m_spellValue->EffectBasePoints[effIndex];
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,14 +50,16 @@ enum WarriorSpells
|
|||||||
SPELL_WARRIOR_RETALIATION_DAMAGE = 22858,
|
SPELL_WARRIOR_RETALIATION_DAMAGE = 22858,
|
||||||
SPELL_WARRIOR_SLAM = 50783,
|
SPELL_WARRIOR_SLAM = 50783,
|
||||||
SPELL_WARRIOR_SUNDER_ARMOR = 58567,
|
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_TAUNT = 355,
|
||||||
SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1 = 46859,
|
SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1 = 46859,
|
||||||
SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_2 = 46860,
|
SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_2 = 46860,
|
||||||
SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_1 = 64849,
|
SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_1 = 64849,
|
||||||
SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_2 = 64850,
|
SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_2 = 64850,
|
||||||
SPELL_WARRIOR_VIGILANCE_PROC = 50725,
|
SPELL_WARRIOR_VIGILANCE_PROC = 50725,
|
||||||
SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT = 59665
|
SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT = 59665,
|
||||||
|
SPELL_WARRIOR_WHIRLWIND_OFF = 44949
|
||||||
};
|
};
|
||||||
|
|
||||||
enum WarriorSpellIcons
|
enum WarriorSpellIcons
|
||||||
@@ -613,7 +615,7 @@ class spell_warr_sweeping_strikes : public AuraScript
|
|||||||
|
|
||||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
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
|
bool Load() override
|
||||||
@@ -624,21 +626,27 @@ class spell_warr_sweeping_strikes : public AuraScript
|
|||||||
|
|
||||||
bool CheckProc(ProcEventInfo& eventInfo)
|
bool CheckProc(ProcEventInfo& eventInfo)
|
||||||
{
|
{
|
||||||
if (!eventInfo.GetActor() || eventInfo.GetProcTarget())
|
Unit* actor = eventInfo.GetActor();
|
||||||
|
if (!actor)
|
||||||
{
|
{
|
||||||
return false;
|
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());
|
_procTarget = eventInfo.GetActor()->SelectNearbyNoTotemTarget(eventInfo.GetProcTarget());
|
||||||
|
return _procTarget != nullptr;
|
||||||
DamageInfo* damageInfo = eventInfo.GetDamageInfo();
|
|
||||||
|
|
||||||
if (!damageInfo || !damageInfo->GetSpellInfo())
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return _procTarget && !damageInfo->GetSpellInfo();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
|
void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
|
||||||
@@ -646,8 +654,17 @@ class spell_warr_sweeping_strikes : public AuraScript
|
|||||||
PreventDefaultAction();
|
PreventDefaultAction();
|
||||||
if (DamageInfo* damageInfo = eventInfo.GetDamageInfo())
|
if (DamageInfo* damageInfo = eventInfo.GetDamageInfo())
|
||||||
{
|
{
|
||||||
int32 damage = damageInfo->GetUnmitigatedDamage();
|
SpellInfo const* spellInfo = damageInfo->GetSpellInfo();
|
||||||
GetTarget()->CastCustomSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK, &damage, 0, 0, true, nullptr, aurEff);
|
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:
|
private:
|
||||||
Unit* _procTarget;
|
Unit* _procTarget = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
// 50720 - Vigilance
|
// 50720 - Vigilance
|
||||||
|
|||||||
Reference in New Issue
Block a user