aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorOvahlord <dreadkiller@gmx.de>2024-08-21 14:55:19 +0200
committerOvahlord <dreadkiller@gmx.de>2024-08-21 14:55:19 +0200
commitb0e058e261caf55eec1f18eab2d79993930eb162 (patch)
tree68a12a7d0b61cf67928d9a3edc0a7126c03b8cc3 /src/server
parent675eb1bab2b129455a724c891804310ffeff26bf (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.cpp17
-rw-r--r--src/server/game/Entities/Player/Player.h4
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp29
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp19
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h1
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;