aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOvahlord <dreadkiller@gmx.de>2023-11-18 15:40:25 +0100
committerOvahlord <dreadkiller@gmx.de>2023-11-18 15:40:25 +0100
commitc31de5d84014aaab62641b43e7346902fefc199c (patch)
tree7f677ab5a5ab6cc37aeebcfa55719c468fc6e28e
parentca4d2c80b97e7110e6282ad15dd6f5f85866943c (diff)
Core/Auras: restore SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT implementation
-rw-r--r--src/server/game/Entities/Player/Player.h1
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp34
-rw-r--r--src/server/game/Spells/Auras/SpellAuraDefines.h4
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp39
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp4
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())
{