From 13be704cb4619ef585ae0043580e2534f62e64aa Mon Sep 17 00:00:00 2001 From: ariel- Date: Sun, 11 Feb 2018 22:52:28 -0300 Subject: [PATCH] Core/Spells: implement SPELLVALUE_CRIT_CHANCE (cherry picked from commit 546a605bd0cd0e828def81e26697f1c116a3f1b7) --- src/server/game/Spells/Spell.cpp | 8 +++++++- src/server/game/Spells/Spell.h | 1 + src/server/game/Spells/SpellDefines.h | 1 + src/server/game/Spells/SpellMgr.cpp | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 501d7acbb04..59d67d12069 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -503,6 +503,7 @@ SpellValue::SpellValue(SpellInfo const* proto, Unit const* caster) MaxAffectedTargets = proto->MaxAffectedTargets; RadiusMod = 1.0f; AuraStackAmount = 1; + CriticalChance = 0.0f; DurationMul = 1; } @@ -7485,7 +7486,9 @@ void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier) } } - float critChance = m_caster->SpellCritChanceDone(this, nullptr, m_spellSchoolMask, m_attackType); + float critChance = m_spellValue->CriticalChance; + if (!critChance) + critChance = m_caster->SpellCritChanceDone(this, nullptr, m_spellSchoolMask, m_attackType); targetInfo.crit = roll_chance_f(unit->SpellCritChanceTaken(m_caster, this, nullptr, m_spellSchoolMask, critChance, m_attackType)); } @@ -7578,6 +7581,9 @@ void Spell::SetSpellValue(SpellValueMod mod, int32 value) case SPELLVALUE_AURA_STACK: m_spellValue->AuraStackAmount = uint8(value); break; + case SPELLVALUE_CRIT_CHANCE: + m_spellValue->CriticalChance = value / 100.0f; // @todo ugly /100 remove when basepoints are double + break; case SPELLVALUE_DURATION_PCT: m_spellValue->DurationMul = float(value) / 100.0f; break; diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index ea980d151a8..82456b035b1 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -306,6 +306,7 @@ struct SpellValue float RadiusMod; int32 AuraStackAmount; float DurationMul; + float CriticalChance; }; enum SpellState diff --git a/src/server/game/Spells/SpellDefines.h b/src/server/game/Spells/SpellDefines.h index 83b48de53ec..77801e9a43f 100644 --- a/src/server/game/Spells/SpellDefines.h +++ b/src/server/game/Spells/SpellDefines.h @@ -212,6 +212,7 @@ enum SpellValueMod : uint8 SPELLVALUE_RADIUS_MOD, SPELLVALUE_MAX_TARGETS, SPELLVALUE_AURA_STACK, + SPELLVALUE_CRIT_CHANCE, SPELLVALUE_DURATION_PCT }; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 96d80449b8a..3cb6ab166e3 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3172,7 +3172,7 @@ void SpellMgr::LoadSpellInfoCustomAttributes() spellInfoMutable->_InitializeExplicitTargetMask(); } - // addition for binary spells, ommit spells triggering other spells + // addition for binary spells, omit spells triggering other spells for (SpellInfo const& spellInfo : mSpellInfoMap) { SpellInfo* spellInfoMutable = const_cast(&spellInfo);