diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-02-11 00:58:21 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-02-11 00:58:21 +0100 |
| commit | b4064d38c83bc26efa20a248426a9b8cfea6793f (patch) | |
| tree | fb433e67f1b2733ac4efb45321f6bf3572e2056f /src/server/game/Entities | |
| parent | 9267ac27dd0e006b04b7dc70ca91b91e2f4d5476 (diff) | |
Core/Spells: Allow spells with SPELL_DAMAGE_CLASS_NONE to crit
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 31 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 |
2 files changed, 23 insertions, 10 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 73bd1e4697c..7ca7718fe39 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -360,7 +360,7 @@ Unit::Unit(bool isWorldObject) : m_modMeleeHitChance = 0.0f; m_modRangedHitChance = 0.0f; m_modSpellHitChance = 0.0f; - m_baseSpellCritChance = 5; + m_baseSpellCritChance = 5.0f; m_speed_rate.fill(1.0f); @@ -6914,15 +6914,29 @@ float Unit::SpellCritChanceDone(Spell* spell, AuraEffect const* aurEff, SpellSch float crit_chance = 0.0f; switch (spellInfo->DmgClass) { + case SPELL_DAMAGE_CLASS_NONE: case SPELL_DAMAGE_CLASS_MAGIC: { - if (schoolMask & SPELL_SCHOOL_MASK_NORMAL) - crit_chance = 0.0f; - // For other schools - else if (Player const* thisPlayer = ToPlayer()) - crit_chance = thisPlayer->m_activePlayerData->SpellCritPercentage; - else - crit_chance = (float)m_baseSpellCritChance; + auto getMagicCritChance = [&] + { + if (Player const* thisPlayer = ToPlayer()) + return *thisPlayer->m_activePlayerData->SpellCritPercentage; + + return m_baseSpellCritChance; + }; + + switch (schoolMask & SPELL_SCHOOL_MASK_NORMAL) + { + case SPELL_SCHOOL_MASK_NORMAL: // physical only + crit_chance = GetUnitCriticalChanceDone(attackType); + break; + case 0: // spell only + crit_chance = getMagicCritChance(); + break; + default: // mix of physical and magic + crit_chance = std::max(getMagicCritChance(), GetUnitCriticalChanceDone(attackType)); + break; + } break; } case SPELL_DAMAGE_CLASS_MELEE: @@ -6931,7 +6945,6 @@ float Unit::SpellCritChanceDone(Spell* spell, AuraEffect const* aurEff, SpellSch crit_chance += GetUnitCriticalChanceDone(attackType); break; } - case SPELL_DAMAGE_CLASS_NONE: default: return 0.0f; } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 2bd5dad9b24..7e177193a9b 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1456,7 +1456,7 @@ class TC_GAME_API Unit : public WorldObject float m_modMeleeHitChance; float m_modRangedHitChance; float m_modSpellHitChance; - int32 m_baseSpellCritChance; + float m_baseSpellCritChance; std::array<uint32, MAX_ATTACK> m_baseAttackSpeed; std::array<float, MAX_ATTACK> m_modAttackSpeedPct; |
