diff options
| author | ariel- <ariel-@users.noreply.github.com> | 2016-10-17 01:52:40 -0300 | 
|---|---|---|
| committer | ariel- <ariel-@users.noreply.github.com> | 2016-10-17 01:52:40 -0300 | 
| commit | 9b0fa51022fba3d5ece96dd0ac8399be01ea5b0f (patch) | |
| tree | aec7c19fea709094e28d287154dff6ae6168b6ef /src/server/game/Spells/Spell.cpp | |
| parent | f4a10571f74450daf26a5b0c5bd0f3114c231120 (diff) | |
Core/Globals: compute aura diminishing return info at startup and cache it
Core/Entities: Save diminish return on an array instead of a linked list
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 27 | 
1 files changed, 12 insertions, 15 deletions
| diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 22456c90d7f..3e7783cfc62 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -586,8 +586,6 @@ m_caster((info->HasAttribute(SPELL_ATTR6_CAST_BY_CHARMER) && caster->GetCharmerO      destTarget = NULL;      damage = 0;      effectHandleMode = SPELL_EFFECT_HANDLE_LAUNCH; -    m_diminishLevel = DIMINISHING_LEVEL_1; -    m_diminishGroup = DIMINISHING_NONE;      m_damage = 0;      m_healing = 0;      m_procAttacker = 0; @@ -2588,16 +2586,19 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA              aura_effmask |= 1 << i;      // Get Data Needed for Diminishing Returns, some effects may have multiple auras, so this must be done on spell hit, not aura add -    m_diminishGroup = GetDiminishingReturnsGroupForSpell(m_spellInfo, m_triggeredByAuraSpell != nullptr); -    if (m_diminishGroup && aura_effmask) +    bool const triggered = m_triggeredByAuraSpell != nullptr; +    DiminishingGroup const diminishGroup = m_spellInfo->GetDiminishingReturnsGroupForSpell(triggered); + +    DiminishingLevels diminishLevel = DIMINISHING_LEVEL_1; +    if (diminishGroup && aura_effmask)      { -        m_diminishLevel = unit->GetDiminishing(m_diminishGroup); -        DiminishingReturnsType type = GetDiminishingReturnsGroupType(m_diminishGroup); +        diminishLevel = unit->GetDiminishing(diminishGroup); +        DiminishingReturnsType type = m_spellInfo->GetDiminishingReturnsGroupType(triggered);          // Increase Diminishing on unit, current informations for actually casts will use values above          if ((type == DRTYPE_PLAYER &&              (unit->GetCharmerOrOwnerPlayerOrPlayerItself() || (unit->GetTypeId() == TYPEID_UNIT && unit->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH))) ||              type == DRTYPE_ALL) -            unit->IncrDiminishing(m_diminishGroup); +            unit->IncrDiminishing(m_spellInfo, triggered);      }      if (aura_effmask) @@ -2640,8 +2641,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA                  // Now Reduce spell duration using data received at spell hit                  int32 duration = m_spellAura->GetMaxDuration(); -                int32 limitduration = GetDiminishingReturnsLimitDuration(m_diminishGroup, aurSpellInfo); -                float diminishMod = unit->ApplyDiminishingToDuration(m_diminishGroup, duration, m_originalCaster, m_diminishLevel, limitduration); +                float diminishMod = unit->ApplyDiminishingToDuration(aurSpellInfo, triggered, duration, m_originalCaster, diminishLevel);                  // unit is immune to aura if it was diminished to 0 duration                  if (diminishMod == 0.0f) @@ -2656,7 +2656,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA                  }                  else                  { -                    ((UnitAura*)m_spellAura)->SetDiminishGroup(m_diminishGroup); +                    ((UnitAura*)m_spellAura)->SetDiminishGroup(diminishGroup);                      bool positive = m_spellAura->GetSpellInfo()->IsPositive();                      if (AuraApplication* aurApp = m_spellAura->GetApplicationOfTarget(m_originalCaster->GetGUID())) @@ -3457,9 +3457,6 @@ uint64 Spell::handle_delayed(uint64 t_offset)  void Spell::_handle_immediate_phase()  {      m_spellAura = NULL; -    // initialize Diminishing Returns Data -    m_diminishLevel = DIMINISHING_LEVEL_1; -    m_diminishGroup = DIMINISHING_NONE;      // handle some immediate features of the spell here      HandleThreatSpells(); @@ -4692,7 +4689,7 @@ void Spell::HandleThreatSpells()              continue;          // positive spells distribute threat among all units that are in combat with target, like healing -        if (m_spellInfo->_IsPositiveSpell()) +        if (m_spellInfo->IsPositive())              target->getHostileRefManager().threatAssist(m_caster, threatToAdd, m_spellInfo);          // for negative spells threat gets distributed among affected targets          else @@ -4703,7 +4700,7 @@ void Spell::HandleThreatSpells()              target->AddThreat(m_caster, threatToAdd, m_spellInfo->GetSchoolMask(), m_spellInfo);          }      } -    TC_LOG_DEBUG("spells", "Spell %u, added an additional %f threat for %s %u target(s)", m_spellInfo->Id, threat, m_spellInfo->_IsPositiveSpell() ? "assisting" : "harming", uint32(m_UniqueTargetInfo.size())); +    TC_LOG_DEBUG("spells", "Spell %u, added an additional %f threat for %s %u target(s)", m_spellInfo->Id, threat, m_spellInfo->IsPositive() ? "assisting" : "harming", uint32(m_UniqueTargetInfo.size()));  }  void Spell::HandleEffects(Unit* pUnitTarget, Item* pItemTarget, GameObject* pGOTarget, uint32 i, SpellEffectHandleMode mode) | 
