diff options
author | Ovahlord <dreadkiller@gmx.de> | 2023-11-18 15:40:25 +0100 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2023-11-18 15:40:25 +0100 |
commit | c31de5d84014aaab62641b43e7346902fefc199c (patch) | |
tree | 7f677ab5a5ab6cc37aeebcfa55719c468fc6e28e | |
parent | ca4d2c80b97e7110e6282ad15dd6f5f85866943c (diff) |
Core/Auras: restore SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT implementation
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/StatSystem.cpp | 34 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraDefines.h | 4 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 39 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 4 |
6 files changed, 33 insertions, 51 deletions
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index f162a2c7de3..ce98587a4c7 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2010,7 +2010,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> bool UpdateFishingSkill(int32 expansion); float GetHealthBonusFromStamina() const; - Stats GetPrimaryStat() const; bool UpdateStats(Stats stat) override; bool UpdateAllStats() override; diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 4d088471ddf..7a48044da5a 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -255,17 +255,16 @@ void Player::UpdateArmor() float value = GetFlatModifierValue(unitMod, BASE_VALUE); // base armor value *= GetPctModifierValue(unitMod, BASE_PCT); // armor percent - // SPELL_AURA_MOD_ARMOR_PCT_FROM_STAT counts as base armor - GetTotalAuraModifier(SPELL_AURA_MOD_ARMOR_PCT_FROM_STAT, [this, &value](AuraEffect const* aurEff) { - int32 miscValue = aurEff->GetMiscValue(); - Stats stat = (miscValue != -2) ? Stats(miscValue) : GetPrimaryStat(); - value += CalculatePct(float(GetStat(stat)), aurEff->GetAmount()); - return true; - }); - float baseValue = value; value += GetFlatModifierValue(unitMod, TOTAL_VALUE); // bonus armor from auras and items + + //add dynamic flat mods + AuraEffectList const& mResbyIntellect = GetAuraEffectsByType(SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT); + for (AuraEffect const* aurEff : GetAuraEffectsByType(SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT)) + if (aurEff->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) + value += CalculatePct(GetStat(Stats(aurEff->GetMiscValueB())), aurEff->GetAmount()); + value *= GetPctModifierValue(unitMod, TOTAL_PCT); value *= GetTotalAuraMultiplier(SPELL_AURA_MOD_BONUS_ARMOR_PCT); @@ -291,25 +290,6 @@ float Player::GetHealthBonusFromStamina() const return moreStam * ratio; } -Stats Player::GetPrimaryStat() const -{ - uint8 primaryStatPriority = [&]() -> uint8 - { - if (ChrSpecializationEntry const* specialization = GetPrimarySpecializationEntry()) - return specialization->PrimaryStatPriority; - - return sChrClassesStore.AssertEntry(GetClass())->PrimaryStatPriority; - }(); - - if (primaryStatPriority >= 4) - return STAT_STRENGTH; - - if (primaryStatPriority >= 2) - return STAT_AGILITY; - - return STAT_INTELLECT; -} - void Player::UpdateMaxHealth() { UnitMods unitMod = UNIT_MOD_HEALTH; diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 2fe40981c7a..97aa5d5fd83 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -272,8 +272,8 @@ enum AuraType : uint32 SPELL_AURA_MOD_MAX_POWER_PCT = 178, SPELL_AURA_MOD_POWER_DISPLAY = 179, SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS = 180, - SPELL_AURA_MOD_SPELL_CURRENCY_REAGENTS_COUNT_PCT = 181, // NYI - SPELL_AURA_SUPPRESS_ITEM_PASSIVE_EFFECT_BY_SPELL_LABEL = 182, + SPELL_AURA_MOD_SPELL_CURRENCY_REAGENTS_COUNT_PCT = 181, // NYI + SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT = 182, SPELL_AURA_MOD_CRIT_CHANCE_VERSUS_TARGET_HEALTH = 183, SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE = 184, SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE = 185, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index d0517e1fb91..c1021a53447 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -249,7 +249,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleAuraModPowerDisplay, //179 SPELL_AURA_MOD_POWER_DISPLAY &AuraEffect::HandleNoImmediateEffect, //180 SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS implemented in Unit::SpellDamageBonus &AuraEffect::HandleNULL, //181 SPELL_AURA_MOD_SPELL_CURRENCY_REAGENTS_COUNT_PCT - &AuraEffect::HandleSuppressItemPassiveEffectBySpellLabel, //182 SPELL_AURA_SUPPRESS_ITEM_PASSIVE_EFFECT_BY_SPELL_LABEL + &AuraEffect::HandleAuraModResistenceOfStatPercent, //182 SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT &AuraEffect::HandleNoImmediateEffect, //183 SPELL_AURA_MOD_CRIT_CHANCE_VERSUS_TARGET_HEALTH implemented in Unit::GetUnitCriticalChance, Unit::GetUnitSpellCriticalChance &AuraEffect::HandleNoImmediateEffect, //184 SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst &AuraEffect::HandleNoImmediateEffect, //185 SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst @@ -4020,6 +4020,28 @@ void AuraEffect::HandleAuraModPowerDisplay(AuraApplication const* aurApp, uint8 aurApp->GetTarget()->UpdateDisplayPower(); } +void AuraEffect::HandleAuraModResistenceOfStatPercent(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const +{ + if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT))) + return; + + Unit* target = aurApp->GetTarget(); + + if (target->GetTypeId() != TYPEID_PLAYER) + return; + + if (GetMiscValue() != SPELL_SCHOOL_MASK_NORMAL) + { + // support required adding replace UpdateArmor by loop by UpdateResistence at intellect update + // and include in UpdateResistence same code as in UpdateArmor for aura mod apply. + TC_LOG_ERROR("spells", "Aura SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT(182) does not work for non-armor type resistances!"); + return; + } + + // Recalculate Armor + target->UpdateArmor(); +} + void AuraEffect::HandleAuraModOverridePowerDisplay(AuraApplication const* aurApp, uint8 mode, bool apply) const { if (!(mode & AURA_EFFECT_HANDLE_REAL)) @@ -6295,21 +6317,6 @@ void AuraEffect::HandleModRequiredMountCapabilityFlags(AuraApplication const* au } -void AuraEffect::HandleSuppressItemPassiveEffectBySpellLabel(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const -{ - if (!(mode & AURA_EFFECT_HANDLE_REAL)) - return; - - std::vector<Aura*> suppressedAuras; - for (Unit::AuraMap::value_type const& appliedAura : aurApp->GetTarget()->GetOwnedAuras()) - if (appliedAura.second->GetSpellInfo()->HasLabel(GetMiscValue())) - suppressedAuras.push_back(appliedAura.second); - - // Refresh applications - for (Aura* aura : suppressedAuras) - aura->ApplyForTargets(); -} - void AuraEffect::HandleForceBreathBar(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const { if (!(mode & AURA_EFFECT_HANDLE_REAL)) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index ba5e771f456..fc72fb89e6a 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -334,7 +334,7 @@ class TC_GAME_API AuraEffect void HandleMountRestrictions(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleCosmeticMounted(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleModRequiredMountCapabilityFlags(AuraApplication const* aurApp, uint8 mode, bool apply) const; - void HandleSuppressItemPassiveEffectBySpellLabel(AuraApplication const* aurApp, uint8 mode, bool apply) const; + void HandleAuraModResistenceOfStatPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleForceBreathBar(AuraApplication const* aurApp, uint8 mode, bool apply) const; // aura effect periodic tick handlers diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 2fe302740aa..1fe1c00303f 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1563,10 +1563,6 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b bool Aura::CanBeAppliedOn(Unit* target) { - for (uint32 label : GetSpellInfo()->Labels) - if (target->HasAuraTypeWithMiscvalue(SPELL_AURA_SUPPRESS_ITEM_PASSIVE_EFFECT_BY_SPELL_LABEL, label)) - return false; - // unit not in world or during remove from world if (!target->IsInWorld() || target->IsDuringRemoveFromWorld()) { |