diff options
author | Matan Shukry <matanshukry@gmail.com> | 2021-03-21 20:09:52 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-03-21 22:19:43 +0100 |
commit | b574be08ae552dcc4bba09e15422d74866a0e7d2 (patch) | |
tree | 276adc4b9b44840a722b288cacb2d8d1de65e989 /src | |
parent | d889b4b0e8fc082505f6bf70a551ad4b38f3f34c (diff) |
Core/Auras: Implemented aura to increase armor by percentage of primary stat
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/StatSystem.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.h | 1 |
4 files changed, 29 insertions, 4 deletions
diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 1b63e24353d..4017ceab3b9 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -109,7 +109,6 @@ bool Player::UpdateStats(Stats stat) switch (stat) { case STAT_AGILITY: - UpdateArmor(); UpdateAllCritPercentages(); UpdateDodgePercentage(); break; @@ -118,7 +117,6 @@ bool Player::UpdateStats(Stats stat) break; case STAT_INTELLECT: UpdateSpellCritChance(); - UpdateArmor(); //SPELL_AURA_MOD_RESISTANCE_OF_INTELLECT_PERCENT, only armor currently break; default: break; @@ -132,6 +130,7 @@ bool Player::UpdateStats(Stats stat) UpdateAttackPowerAndDamage(true); } + UpdateArmor(); UpdateSpellDamageAndHealingBonus(); UpdateManaRegen(); return true; @@ -242,6 +241,17 @@ void Player::UpdateArmor() float value = GetFlatModifierValue(unitMod, BASE_VALUE); // base armor (from items) float baseValue = value; + + GetTotalAuraModifier(SPELL_AURA_MOD_ARMOR_PCT_FROM_STAT, [this, &baseValue](AuraEffect const* aurEff) { + int32 miscValue = aurEff->GetMiscValue(); + Stats stat = (miscValue != -2) ? Stats(miscValue) : GetPrimaryStat(); + + int32 armorAmount = CalculatePct(GetStat(stat), aurEff->GetAmount()); + baseValue += armorAmount; + + return true; + }); + value *= GetPctModifierValue(unitMod, BASE_PCT); // armor percent from items value += GetFlatModifierValue(unitMod, TOTAL_VALUE); value *= GetPctModifierValue(unitMod, TOTAL_PCT); diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index a4e11e435cb..e1496fbc123 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -346,7 +346,7 @@ enum AuraType : uint32 SPELL_AURA_265 = 265, SPELL_AURA_SET_VIGNETTE = 266, // NYI SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL = 267, - SPELL_AURA_268 = 268, // old SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT. unused 4.3.4 + SPELL_AURA_MOD_ARMOR_PCT_FROM_STAT = 268, SPELL_AURA_MOD_IGNORE_TARGET_RESIST = 269, SPELL_AURA_MOD_SCHOOL_MASK_DAMAGE_FROM_CASTER = 270, SPELL_AURA_MOD_SPELL_DAMAGE_FROM_CASTER = 271, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index f6d06641036..8f9dd38acc6 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -335,7 +335,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleUnused, //265 unused (4.3.4) &AuraEffect::HandleNULL, //266 SPELL_AURA_SET_VIGNETTE &AuraEffect::HandleNoImmediateEffect, //267 SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL implemented in Unit::IsImmunedToSpellEffect - &AuraEffect::HandleUnused, //268 unused (4.3.4) old SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT. + &AuraEffect::HandleModArmorPctFromStat, //268 SPELL_AURA_MOD_ARMOR_PCT_FROM_STAT also implemented in Player::UpdateArmor() &AuraEffect::HandleNoImmediateEffect, //269 SPELL_AURA_MOD_IGNORE_TARGET_RESIST implemented in Unit::CalcAbsorbResist and CalcArmorReducedDamage &AuraEffect::HandleNoImmediateEffect, //270 SPELL_AURA_MOD_SCHOOL_MASK_DAMAGE_FROM_CASTER implemented in Unit::SpellDamageBonusTaken and Unit::MeleeDamageBonusTaken &AuraEffect::HandleNoImmediateEffect, //271 SPELL_AURA_MOD_SPELL_DAMAGE_FROM_CASTER implemented in Unit::SpellDamageBonusTaken and Unit::MeleeDamageBonusTaken @@ -3460,6 +3460,20 @@ void AuraEffect::HandleAuraModExpertise(AuraApplication const* aurApp, uint8 mod target->ToPlayer()->UpdateExpertise(OFF_ATTACK); } +// Increase armor by <AuraEffect.BasePoints> % of your <primary stat> +void AuraEffect::HandleModArmorPctFromStat(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const +{ + if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT))) + return; + + // only players have primary stats + Player* player = aurApp->GetTarget()->ToPlayer(); + if (!player) + return; + + player->UpdateArmor(); +} + void AuraEffect::HandleModStatBonusPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const { if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT))) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 6503878de89..4ec5d04e5a0 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -238,6 +238,7 @@ class TC_GAME_API AuraEffect void HandleModHealingDonePct(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleModTotalPercentStat(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraModExpertise(AuraApplication const* aurApp, uint8 mode, bool apply) const; + void HandleModArmorPctFromStat(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleModStatBonusPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleOverrideSpellPowerByAttackPower(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleOverrideAttackPowerBySpellPower(AuraApplication const* aurApp, uint8 mode, bool apply) const; |