Core/Auras: Allow using stack rule 3 for haste and crit chance auras

This commit is contained in:
Ovahlord
2019-03-07 22:11:11 +01:00
parent 7ccd3f9d8d
commit 2e09764fa9

View File

@@ -3921,6 +3921,9 @@ void AuraEffect::HandleAuraModCritPct(AuraApplication const* aurApp, uint8 mode,
return;
Unit* target = aurApp->GetTarget();
int32 spellGroupVal = target->GetHighestExclusiveSameEffectSpellGroupValue(this, SPELL_AURA_MOD_CRIT_PCT);
if (abs(spellGroupVal) >= abs(GetAmount()))
return;
if (target->GetTypeId() != TYPEID_PLAYER)
{
@@ -3928,6 +3931,13 @@ void AuraEffect::HandleAuraModCritPct(AuraApplication const* aurApp, uint8 mode,
return;
}
if (spellGroupVal)
{
target->ToPlayer()->HandleBaseModValue(CRIT_PERCENTAGE, FLAT_MOD, float (GetAmount()), !apply);
target->ToPlayer()->HandleBaseModValue(OFFHAND_CRIT_PERCENTAGE, FLAT_MOD, float (GetAmount()), !apply);
target->ToPlayer()->HandleBaseModValue(RANGED_CRIT_PERCENTAGE, FLAT_MOD, float (GetAmount()), !apply);
}
target->ToPlayer()->HandleBaseModValue(CRIT_PERCENTAGE, FLAT_MOD, float (GetAmount()), apply);
target->ToPlayer()->HandleBaseModValue(OFFHAND_CRIT_PERCENTAGE, FLAT_MOD, float (GetAmount()), apply);
target->ToPlayer()->HandleBaseModValue(RANGED_CRIT_PERCENTAGE, FLAT_MOD, float (GetAmount()), apply);
@@ -3947,6 +3957,13 @@ void AuraEffect::HandleModCastingSpeed(AuraApplication const* aurApp, uint8 mode
Unit* target = aurApp->GetTarget();
int32 spellGroupVal = target->GetHighestExclusiveSameEffectSpellGroupValue(this, GetAuraType());
if (abs(spellGroupVal) >= abs(GetAmount()))
return;
if (spellGroupVal)
target->ApplyCastTimePercentMod((float)GetAmount(), !apply);
target->ApplyCastTimePercentMod((float)GetAmount(), apply);
}
@@ -4015,10 +4032,25 @@ void AuraEffect::HandleModMeleeSpeedPct(AuraApplication const* aurApp, uint8 mod
if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT)))
return;
//! ToDo: Haste auras with the same handler _CAN'T_ stack together
Unit* target = aurApp->GetTarget();
bool applyRegenPct = GetAuraType() != SPELL_AURA_MOD_MELEE_HASTE_3 && GetAuraType() != SPELL_AURA_MOD_RANGED_HASTE_2;
int32 spellGroupVal = target->GetHighestExclusiveSameEffectSpellGroupValue(this, GetAuraType());
if (abs(spellGroupVal) >= abs(GetAmount()))
return;
if (spellGroupVal)
{
if (target->GetTypeId() == TYPEID_PLAYER && applyRegenPct && GetBase()->HasEffectType(SPELL_AURA_MOD_MELEE_HASTE_3))
target->ApplyRegenMod(BASE_ATTACK, (float)GetAmount(), !apply);
else
{
target->ApplyAttackTimePercentMod(BASE_ATTACK, (float)GetAmount(), !apply);
target->ApplyAttackTimePercentMod(OFF_ATTACK, (float)GetAmount(), !apply);
target->ApplyRegenMod(BASE_ATTACK, (float)GetAmount(), !apply);
}
}
// Auras that only increase regeneration
if (target->GetTypeId() == TYPEID_PLAYER && applyRegenPct && GetBase()->HasEffectType(SPELL_AURA_MOD_MELEE_HASTE_3))
target->ApplyRegenMod(BASE_ATTACK, (float)GetAmount(), apply);
@@ -4035,8 +4067,17 @@ void AuraEffect::HandleAuraModRangedHaste(AuraApplication const* aurApp, uint8 m
if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT)))
return;
//! ToDo: Haste auras with the same handler _CAN'T_ stack together
Unit* target = aurApp->GetTarget();
int32 spellGroupVal = target->GetHighestExclusiveSameEffectSpellGroupValue(this, GetAuraType());
if (abs(spellGroupVal) >= abs(GetAmount()))
return;
if (spellGroupVal)
{
target->ApplyAttackTimePercentMod(RANGED_ATTACK, (float)GetAmount(), !apply);
if (GetAuraType() != SPELL_AURA_MOD_MELEE_RANGED_HASTE_2 && GetAuraType() != SPELL_AURA_MOD_RANGED_HASTE_2)
target->ApplyRegenMod(RANGED_ATTACK, (float)GetAmount(), !apply);
}
target->ApplyAttackTimePercentMod(RANGED_ATTACK, (float)GetAmount(), apply);
if (GetAuraType() != SPELL_AURA_MOD_MELEE_RANGED_HASTE_2 && GetAuraType() != SPELL_AURA_MOD_RANGED_HASTE_2)