Core/Spells: Move entering combat for caster and calculating crit chance to separate function called only once for each target instead of doing it once for every effect on every target

This commit is contained in:
Shauren authored and Ovahlord committed 2025-03-15 08:50:50 +01:00
1 parent 2274f69173
commit c23cfa4217
2 files changed
+29 -11

No files matched your search

+28 -11
View File
@@ -8031,6 +8031,9 @@ void Spell::HandleLaunchPhase()
PrepareTargetProcessing();
for (TargetInfo& target : m_UniqueTargetInfo)
PreprocessSpellLaunch(target);
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
float multiplier = 1.0f;
@@ -8049,7 +8052,7 @@ void Spell::HandleLaunchPhase()
FinishTargetProcessing();
}
void Spell::DoEffectOnLaunchTarget(TargetInfo& targetInfo, float multiplier, uint8 effIndex)
void Spell::PreprocessSpellLaunch(TargetInfo& targetInfo)
{
Unit* targetUnit = m_caster->GetGUID() == targetInfo.TargetGUID ? m_caster->ToUnit() : ObjectAccessor::GetUnit(*m_caster, targetInfo.TargetGUID);
if (!targetUnit)
@@ -8070,6 +8073,30 @@ void Spell::DoEffectOnLaunchTarget(TargetInfo& targetInfo, float multiplier, uin
if (!unit)
return;
float critChance = m_spellValue->CriticalChance;
if (m_originalCaster)
{
if (!critChance)
critChance = m_originalCaster->SpellCritChanceDone(m_spellInfo, m_spellSchoolMask, m_attackType);
critChance = unit->SpellCritChanceTaken(m_originalCaster, m_spellInfo, m_spellSchoolMask, critChance, m_attackType);
}
targetInfo.IsCrit = roll_chance_f(critChance);
}
void Spell::DoEffectOnLaunchTarget(TargetInfo& targetInfo, float multiplier, uint8 effIndex)
{
Unit* unit = nullptr;
// In case spell hit target, do all effect on that target
if (targetInfo.MissCondition == SPELL_MISS_NONE)
unit = m_caster->GetGUID() == targetInfo.TargetGUID ? m_caster->ToUnit() : ObjectAccessor::GetUnit(*m_caster, targetInfo.TargetGUID);
// In case spell reflect from target, do all effect on caster (if hit)
else if (targetInfo.MissCondition == SPELL_MISS_REFLECT && targetInfo.ReflectResult == SPELL_MISS_NONE)
unit = m_caster->ToUnit();
if (!unit)
return;
m_damage = 0;
m_healing = 0;
@@ -8102,16 +8129,6 @@ void Spell::DoEffectOnLaunchTarget(TargetInfo& targetInfo, float multiplier, uin
targetInfo.Damage += m_damage;
targetInfo.Healing += m_healing;
float critChance = m_spellValue->CriticalChance;
if (m_originalCaster)
{
if (!critChance)
critChance = m_originalCaster->SpellCritChanceDone(m_spellInfo, m_spellSchoolMask, m_attackType);
critChance = unit->SpellCritChanceTaken(m_originalCaster, m_spellInfo, m_spellSchoolMask, critChance, m_attackType);
}
targetInfo.IsCrit = roll_chance_f(critChance);
}
void Spell::ResetCombatTimers()
+1
View File
@@ -756,6 +756,7 @@ class TC_GAME_API Spell
void AddCorpseTarget(Corpse* target, uint32 effectMask);
void AddDestTarget(SpellDestination const& dest, uint32 effIndex);
void PreprocessSpellLaunch(TargetInfo& targetInfo);
SpellMissInfo PreprocessSpellHit(Unit* unit, bool scaleAura, TargetInfo& targetInfo);
void DoSpellEffectHit(Unit* unit, uint8 effIndex, TargetInfo& targetInfo);