diff options
author | Ovahlord <dreadkiller@gmx.de> | 2024-08-21 14:55:19 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2024-08-21 14:55:19 +0200 |
commit | b0e058e261caf55eec1f18eab2d79993930eb162 (patch) | |
tree | 68a12a7d0b61cf67928d9a3edc0a7126c03b8cc3 /src/server | |
parent | 675eb1bab2b129455a724c891804310ffeff26bf (diff) |
Core/Player: restore crit chance bonus from intellect
* implemented SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 17 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/StatSystem.cpp | 29 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.h | 1 |
5 files changed, 59 insertions, 11 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 4701b43ec5a..c7c5e753656 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -4844,6 +4844,21 @@ void Player::GetDodgeFromAgility(float &/*diminishing*/, float &/*nondiminishing //nondiminishing = 100.0f * (dodge_base[pclass-1] + base_agility * dodgeRatio->ratio * crit_to_dodge[pclass-1]); } +float Player::GetSpellCritFromIntellect() const +{ + float critBase = GetGameTableColumnForClass(sChanceToSpellCritBaseGameTable.GetRow(1), GetClass()); + float critRatio = [&]() + { + GtChanceToSpellCritEntry const* critRatio = sChanceToSpellCritGameTable.GetRow(GetLevel()); + if (!critRatio) + return 0.0f; + + return GetGameTableColumnForClass(critRatio, GetClass()); + }(); + + return (critBase + GetStat(STAT_INTELLECT) * critRatio) * 100.0f; +} + inline float GetGameTableColumnForCombatRating(GtCombatRatingsEntry const* row, CombatRating combatRating) { switch (combatRating) @@ -4994,7 +5009,7 @@ void Player::UpdateRating(CombatRating cr) break; case CR_CRIT_SPELL: if (affectStats) - UpdateSpellCritChance(); + UpdateAllSpellCritChances(); break; case CR_CORRUPTION: case CR_CORRUPTION_RESISTANCE: diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 95c91c6a9cf..3e2842651f1 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2038,6 +2038,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true);} void GetDodgeFromAgility(float &diminishing, float &nondiminishing) const; + float GetSpellCritFromIntellect() const; float GetRatingMultiplier(CombatRating cr) const; float GetRatingBonusValue(CombatRating cr) const; @@ -2057,7 +2058,8 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void UpdateRangedHitChances(); void UpdateSpellHitChances(); - void UpdateSpellCritChance(); + void UpdateAllSpellCritChances(); + void UpdateSpellCritChance(SpellSchools school); void UpdateCorruption(); void UpdateArmorPenetration(int32 amount); void UpdateExpertise(WeaponAttackType attType); diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 4e1bb27398b..cc247e09f78 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -214,7 +214,7 @@ bool Player::UpdateStats(Stats stat) break; case STAT_INTELLECT: UpdateMaxPower(POWER_MANA); - UpdateSpellCritChance(); + UpdateAllSpellCritChances(); break; case STAT_SPIRIT: break; @@ -298,7 +298,7 @@ bool Player::UpdateAllStats() UpdateAllRatings(); UpdateAllCritPercentages(); - UpdateSpellCritChance(); + UpdateAllSpellCritChances(); UpdateBlockPercentage(); UpdateParryPercentage(); UpdateDodgePercentage(); @@ -834,19 +834,36 @@ void Player::UpdateDodgePercentage() SetUpdateFieldStatValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::DodgePercentage), value); } -void Player::UpdateSpellCritChance() +void Player::UpdateAllSpellCritChances() { - float crit = 5.0f; + for (uint8 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i) + UpdateSpellCritChance(SpellSchools(i)); +} + +void Player::UpdateSpellCritChance(SpellSchools school) +{ + // For normal school set zero crit chance + if (school == SPELL_SCHOOL_NORMAL) + { + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::SpellCritPercentage, school), 0.0f); + return; + } + + // For others recalculate it from: + float crit = 0.0f; + // Crit from Intellect + crit += GetSpellCritFromIntellect(); // Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE crit += GetTotalAuraModifier(SPELL_AURA_MOD_SPELL_CRIT_CHANCE); // Increase crit from SPELL_AURA_MOD_CRIT_PCT crit += GetTotalAuraModifier(SPELL_AURA_MOD_CRIT_PCT); + // Increase crit by school from SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL + crit += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, 1 << school); // Increase crit from spell crit ratings crit += GetRatingBonusValue(CR_CRIT_SPELL); // Store crit value - for (uint8 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i) - SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::SpellCritPercentage, i), crit); + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::SpellCritPercentage, school), crit); } void Player::UpdateCorruption() diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 90ec31a6411..acf008b281f 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -621,7 +621,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //549 formerly SPELL_AURA_46 - Ignore all gear test spells &AuraEffect::HandleNULL, //550 &AuraEffect::HandleNULL, //551 - &AuraEffect::HandleNULL, //552 + &AuraEffect::HandleModSpellCritChanceSchool, //552 SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL &AuraEffect::HandleModPowerCost, //553 SPELL_AURA_MOD_POWER_COST_SCHOOL &AuraEffect::HandleNULL, //554 &AuraEffect::HandleNULL, //555 @@ -4299,7 +4299,7 @@ void AuraEffect::HandleModSpellCritChance(AuraApplication const* aurApp, uint8 m Unit* target = aurApp->GetTarget(); if (target->GetTypeId() == TYPEID_PLAYER) - target->ToPlayer()->UpdateSpellCritChance(); + target->ToPlayer()->UpdateAllCritPercentages(); else target->m_baseSpellCritChance += apply ? GetAmount() : -GetAmount(); } @@ -4320,7 +4320,20 @@ void AuraEffect::HandleAuraModCritPct(AuraApplication const* aurApp, uint8 mode, target->ToPlayer()->UpdateAllWeaponDependentCritAuras(); // included in Player::UpdateSpellCritChance calculation - target->ToPlayer()->UpdateSpellCritChance(); + target->ToPlayer()->UpdateAllCritPercentages(); +} + +void AuraEffect::HandleModSpellCritChanceSchool(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) + for (uint8 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i) + if (GetMiscValue() & (1 << i)) + target->ToPlayer()->UpdateSpellCritChance(SpellSchools(i)); } /********************************/ diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 6d7f07256c7..1bb46abe8b8 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -274,6 +274,7 @@ class TC_GAME_API AuraEffect void HandleModSpellHitChance(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleModSpellCritChance(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraModCritPct(AuraApplication const* aurApp, uint8 mode, bool apply) const; + void HandleModSpellCritChanceSchool(AuraApplication const* aurApp, uint8 mode, bool apply) const; // attack speed void HandleModCastingSpeed(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleModMeleeRangedSpeedPct(AuraApplication const* aurApp, uint8 mode, bool apply) const; |