diff options
| author | ariel- <ariel-@users.noreply.github.com> | 2016-10-07 00:51:52 -0300 |
|---|---|---|
| committer | joschiwald <joschiwald.trinity@gmail.com> | 2017-08-26 23:23:32 +0200 |
| commit | c7cd9102d364fa8225b9952ccfa245c54bb6654b (patch) | |
| tree | 92a2cea4743c7a085d087deeaab7de4ace5e9062 | |
| parent | ee0e9c8578486879a27059b82f30618ef2ebb4fd (diff) | |
Core/Globals: cache SpellSpecific and AuraState information instead of computing them each time they're needed
(cherry picked from commit ce45e1bf95a03be6b1f42c785e4c01dd55999d33)
# Conflicts:
# src/server/game/Spells/SpellInfo.cpp
# src/server/game/Spells/SpellInfo.h
# src/server/game/Spells/SpellMgr.cpp
# src/server/game/World/World.cpp
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 405 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellInfo.h | 7 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 17 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellMgr.h | 1 | ||||
| -rw-r--r-- | src/server/game/World/World.cpp | 3 |
6 files changed, 242 insertions, 197 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b7ef48b619a..a5947dec0ac 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3234,7 +3234,7 @@ AuraApplication * Unit::_CreateAuraApplication(Aura* aura, uint32 effMask) AddInterruptMask(aurSpellInfo->AuraInterruptFlags); } - if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState(GetMap()->GetDifficultyID())) + if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState()) m_auraStateAuras.insert(AuraStateAurasMap::value_type(aState, aurApp)); aura->_ApplyForTarget(this, caster, aurApp); @@ -3265,7 +3265,7 @@ void Unit::_ApplyAura(AuraApplication * aurApp, uint32 effMask) return; // Update target aura state flag - if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState(GetMap()->GetDifficultyID())) + if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState()) ModifyAuraState(aState, true); if (aurApp->GetRemoveMode()) @@ -3320,7 +3320,7 @@ void Unit::_UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMo } bool auraStateFound = false; - AuraStateType auraState = aura->GetSpellInfo()->GetAuraState(GetMap()->GetDifficultyID()); + AuraStateType auraState = aura->GetSpellInfo()->GetAuraState(); if (auraState) { bool canBreak = false; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 233123c1542..258362a43e2 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1148,6 +1148,9 @@ SpellInfo::SpellInfo(SpellInfoLoadHelper const& data, SpellEffectEntryMap const& ChainEntry = NULL; ExplicitTargetMask = 0; + + _spellSpecific = SPELL_SPECIFIC_NORMAL; + _auraState = AURA_STATE_NONE; } SpellInfo::~SpellInfo() @@ -2203,249 +2206,265 @@ uint32 SpellInfo::GetExplicitTargetMask() const return ExplicitTargetMask; } -AuraStateType SpellInfo::GetAuraState(uint32 difficulty) const +AuraStateType SpellInfo::GetAuraState() const { - // Seals - if (GetSpellSpecific() == SPELL_SPECIFIC_SEAL) - return AURA_STATE_JUDGEMENT; + return _auraState; +} - // Conflagrate aura state on Immolate and Shadowflame - if (SpellFamilyName == SPELLFAMILY_WARLOCK && - // Immolate - ((SpellFamilyFlags[0] & 4) || - // Shadowflame - (SpellFamilyFlags[2] & 2))) - return AURA_STATE_CONFLAGRATE; +void SpellInfo::_LoadAuraState() +{ + _auraState = [this]()->AuraStateType + { + // Seals + if (GetSpellSpecific() == SPELL_SPECIFIC_SEAL) + return AURA_STATE_JUDGEMENT; - // Faerie Fire (druid versions) - if (SpellFamilyName == SPELLFAMILY_DRUID && SpellFamilyFlags[0] & 0x400) - return AURA_STATE_FAERIE_FIRE; + // Conflagrate aura state on Immolate and Shadowflame + if (SpellFamilyName == SPELLFAMILY_WARLOCK && + // Immolate + ((SpellFamilyFlags[0] & 4) || + // Shadowflame + (SpellFamilyFlags[2] & 2))) + return AURA_STATE_CONFLAGRATE; - // Sting (hunter's pet ability) - if (GetCategory() == 1133) - return AURA_STATE_FAERIE_FIRE; + // Faerie Fire (druid versions) + if (SpellFamilyName == SPELLFAMILY_DRUID && SpellFamilyFlags[0] & 0x400) + return AURA_STATE_FAERIE_FIRE; - // Victorious - if (SpellFamilyName == SPELLFAMILY_WARRIOR && SpellFamilyFlags[1] & 0x00040000) - return AURA_STATE_WARRIOR_VICTORY_RUSH; + // Sting (hunter's pet ability) + if (GetCategory() == 1133) + return AURA_STATE_FAERIE_FIRE; - // Swiftmend state on Regrowth & Rejuvenation - if (SpellFamilyName == SPELLFAMILY_DRUID && SpellFamilyFlags[0] & 0x50) - return AURA_STATE_SWIFTMEND; + // Victorious + if (SpellFamilyName == SPELLFAMILY_WARRIOR && SpellFamilyFlags[1] & 0x00040000) + return AURA_STATE_WARRIOR_VICTORY_RUSH; - // Deadly poison aura state - if (SpellFamilyName == SPELLFAMILY_ROGUE && SpellFamilyFlags[0] & 0x10000) - return AURA_STATE_DEADLY_POISON; + // Swiftmend state on Regrowth & Rejuvenation + if (SpellFamilyName == SPELLFAMILY_DRUID && SpellFamilyFlags[0] & 0x50) + return AURA_STATE_SWIFTMEND; - // Enrage aura state - if (Dispel == DISPEL_ENRAGE) - return AURA_STATE_ENRAGE; + // Deadly poison aura state + if (SpellFamilyName == SPELLFAMILY_ROGUE && SpellFamilyFlags[0] & 0x10000) + return AURA_STATE_DEADLY_POISON; - // Bleeding aura state - if (GetAllEffectsMechanicMask() & 1<<MECHANIC_BLEED) - return AURA_STATE_BLEEDING; + // Enrage aura state + if (Dispel == DISPEL_ENRAGE) + return AURA_STATE_ENRAGE; - if (GetSchoolMask() & SPELL_SCHOOL_MASK_FROST) - for (SpellEffectInfo const* effect : GetEffectsForDifficulty(difficulty)) - if (effect && effect->IsAura() && (effect->ApplyAuraName == SPELL_AURA_MOD_STUN - || effect->ApplyAuraName == SPELL_AURA_MOD_ROOT)) - return AURA_STATE_FROZEN; + // Bleeding aura state + if (GetAllEffectsMechanicMask() & 1<<MECHANIC_BLEED) + return AURA_STATE_BLEEDING; - switch (Id) - { - case 71465: // Divine Surge - case 50241: // Evasive Charges - return AURA_STATE_UNKNOWN22; - default: - break; - } + if (GetSchoolMask() & SPELL_SCHOOL_MASK_FROST) + for (SpellEffectInfoMap::const_iterator itr = _effects.begin(); itr != _effects.end(); ++itr) + for (SpellEffectInfo const* effect : itr->second) + if (effect && (effect->IsAura(SPELL_AURA_MOD_STUN) || effect->IsAura(SPELL_AURA_MOD_ROOT))) + return AURA_STATE_FROZEN; + + switch (Id) + { + case 71465: // Divine Surge + case 50241: // Evasive Charges + return AURA_STATE_UNKNOWN22; + default: + break; + } - return AURA_STATE_NONE; + return AURA_STATE_NONE; + }(); } SpellSpecificType SpellInfo::GetSpellSpecific() const { - switch (SpellFamilyName) + return _spellSpecific; +}; + +void SpellInfo::_LoadSpellSpecific() +{ + _spellSpecific = [this]()->SpellSpecificType { - case SPELLFAMILY_GENERIC: + switch (SpellFamilyName) { - // Food / Drinks (mostly) - if (AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) + case SPELLFAMILY_GENERIC: { - bool food = false; - bool drink = false; - for (SpellEffectInfoMap::const_iterator itr = _effects.begin(); itr != _effects.end(); ++itr) + // Food / Drinks (mostly) + if (AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) { - for (SpellEffectInfo const* effect : itr->second) + bool food = false; + bool drink = false; + for (SpellEffectInfoMap::const_iterator itr = _effects.begin(); itr != _effects.end(); ++itr) { - if (!effect || !effect->IsAura()) - continue; - switch (effect->ApplyAuraName) + for (SpellEffectInfo const* effect : itr->second) { - // Food - case SPELL_AURA_MOD_REGEN: - case SPELL_AURA_OBS_MOD_HEALTH: - food = true; - break; - // Drink - case SPELL_AURA_MOD_POWER_REGEN: - case SPELL_AURA_OBS_MOD_POWER: - drink = true; - break; - default: - break; + if (!effect || !effect->IsAura()) + continue; + switch (effect->ApplyAuraName) + { + // Food + case SPELL_AURA_MOD_REGEN: + case SPELL_AURA_OBS_MOD_HEALTH: + food = true; + break; + // Drink + case SPELL_AURA_MOD_POWER_REGEN: + case SPELL_AURA_OBS_MOD_POWER: + drink = true; + break; + default: + break; + } } } - } - if (food && drink) - return SPELL_SPECIFIC_FOOD_AND_DRINK; - else if (food) - return SPELL_SPECIFIC_FOOD; - else if (drink) - return SPELL_SPECIFIC_DRINK; - } - // scrolls effects - else - { - SpellInfo const* firstRankSpellInfo = GetFirstRankSpell(); - switch (firstRankSpellInfo->Id) + if (food && drink) + return SPELL_SPECIFIC_FOOD_AND_DRINK; + else if (food) + return SPELL_SPECIFIC_FOOD; + else if (drink) + return SPELL_SPECIFIC_DRINK; + } + // scrolls effects + else { - case 8118: // Strength - case 8099: // Stamina - case 8112: // Spirit - case 8096: // Intellect - case 8115: // Agility - case 8091: // Armor - return SPELL_SPECIFIC_SCROLL; - case 12880: // Enrage (Enrage) - case 57518: // Enrage (Wrecking Crew) - return SPELL_SPECIFIC_WARRIOR_ENRAGE; + SpellInfo const* firstRankSpellInfo = GetFirstRankSpell(); + switch (firstRankSpellInfo->Id) + { + case 8118: // Strength + case 8099: // Stamina + case 8112: // Spirit + case 8096: // Intellect + case 8115: // Agility + case 8091: // Armor + return SPELL_SPECIFIC_SCROLL; + case 12880: // Enrage (Enrage) + case 57518: // Enrage (Wrecking Crew) + return SPELL_SPECIFIC_WARRIOR_ENRAGE; + } } + break; } - break; - } - case SPELLFAMILY_MAGE: - { - // family flags 18(Molten), 25(Frost/Ice), 28(Mage) - if (SpellFamilyFlags[0] & 0x12040000) - return SPELL_SPECIFIC_MAGE_ARMOR; + case SPELLFAMILY_MAGE: + { + // family flags 18(Molten), 25(Frost/Ice), 28(Mage) + if (SpellFamilyFlags[0] & 0x12040000) + return SPELL_SPECIFIC_MAGE_ARMOR; - // Arcane brillance and Arcane intelect (normal check fails because of flags difference) - if (SpellFamilyFlags[0] & 0x400) - return SPELL_SPECIFIC_MAGE_ARCANE_BRILLANCE; - SpellEffectInfo const* effect = GetEffect(DIFFICULTY_NONE, EFFECT_0); - if (effect && (SpellFamilyFlags[0] & 0x1000000) && effect->ApplyAuraName == SPELL_AURA_MOD_CONFUSE) - return SPELL_SPECIFIC_MAGE_POLYMORPH; + // Arcane brillance and Arcane intelect (normal check fails because of flags difference) + if (SpellFamilyFlags[0] & 0x400) + return SPELL_SPECIFIC_MAGE_ARCANE_BRILLANCE; + SpellEffectInfo const* effect = GetEffect(DIFFICULTY_NONE, EFFECT_0); + if (effect && (SpellFamilyFlags[0] & 0x1000000) && effect->ApplyAuraName == SPELL_AURA_MOD_CONFUSE) + return SPELL_SPECIFIC_MAGE_POLYMORPH; - break; - } - case SPELLFAMILY_WARRIOR: - { - if (Id == 12292) // Death Wish - return SPELL_SPECIFIC_WARRIOR_ENRAGE; + break; + } + case SPELLFAMILY_WARRIOR: + { + if (Id == 12292) // Death Wish + return SPELL_SPECIFIC_WARRIOR_ENRAGE; - break; - } - case SPELLFAMILY_WARLOCK: - { - // Warlock (Bane of Doom | Bane of Agony | Bane of Havoc) - if (Id == 603 || Id == 980 || Id == 80240) - return SPELL_SPECIFIC_BANE; + break; + } + case SPELLFAMILY_WARLOCK: + { + // Warlock (Bane of Doom | Bane of Agony | Bane of Havoc) + if (Id == 603 || Id == 980 || Id == 80240) + return SPELL_SPECIFIC_BANE; - // only warlock curses have this - if (Dispel == DISPEL_CURSE) - return SPELL_SPECIFIC_CURSE; + // only warlock curses have this + if (Dispel == DISPEL_CURSE) + return SPELL_SPECIFIC_CURSE; - // Warlock (Demon Armor | Demon Skin | Fel Armor) - if (SpellFamilyFlags[1] & 0x20000020 || SpellFamilyFlags[2] & 0x00000010) - return SPELL_SPECIFIC_WARLOCK_ARMOR; + // Warlock (Demon Armor | Demon Skin | Fel Armor) + if (SpellFamilyFlags[1] & 0x20000020 || SpellFamilyFlags[2] & 0x00000010) + return SPELL_SPECIFIC_WARLOCK_ARMOR; - //seed of corruption and corruption - if (SpellFamilyFlags[1] & 0x10 || SpellFamilyFlags[0] & 0x2) - return SPELL_SPECIFIC_WARLOCK_CORRUPTION; - break; - } - case SPELLFAMILY_PRIEST: - { - // Divine Spirit and Prayer of Spirit - if (SpellFamilyFlags[0] & 0x20) - return SPELL_SPECIFIC_PRIEST_DIVINE_SPIRIT; + //seed of corruption and corruption + if (SpellFamilyFlags[1] & 0x10 || SpellFamilyFlags[0] & 0x2) + return SPELL_SPECIFIC_WARLOCK_CORRUPTION; + break; + } + case SPELLFAMILY_PRIEST: + { + // Divine Spirit and Prayer of Spirit + if (SpellFamilyFlags[0] & 0x20) + return SPELL_SPECIFIC_PRIEST_DIVINE_SPIRIT; - break; - } - case SPELLFAMILY_HUNTER: - { - // only hunter stings have this - if (Dispel == DISPEL_POISON) - return SPELL_SPECIFIC_STING; + break; + } + case SPELLFAMILY_HUNTER: + { + // only hunter stings have this + if (Dispel == DISPEL_POISON) + return SPELL_SPECIFIC_STING; - // only hunter aspects have this (but not all aspects in hunter family) - if (SpellFamilyFlags & flag128(0x00200000, 0x00000000, 0x00001010, 0x00000000)) - return SPELL_SPECIFIC_ASPECT; + // only hunter aspects have this (but not all aspects in hunter family) + if (SpellFamilyFlags & flag128(0x00200000, 0x00000000, 0x00001010, 0x00000000)) + return SPELL_SPECIFIC_ASPECT; - break; - } - case SPELLFAMILY_PALADIN: - { - // Collection of all the seal family flags. No other paladin spell has any of those. - if (SpellFamilyFlags[1] & 0xA2000800) - return SPELL_SPECIFIC_SEAL; + break; + } + case SPELLFAMILY_PALADIN: + { + // Collection of all the seal family flags. No other paladin spell has any of those. + if (SpellFamilyFlags[1] & 0xA2000800) + return SPELL_SPECIFIC_SEAL; - if (SpellFamilyFlags[0] & 0x00002190) - return SPELL_SPECIFIC_HAND; + if (SpellFamilyFlags[0] & 0x00002190) + return SPELL_SPECIFIC_HAND; - // Judgement - if (Id == 20271) - return SPELL_SPECIFIC_JUDGEMENT; + // Judgement + if (Id == 20271) + return SPELL_SPECIFIC_JUDGEMENT; - // only paladin auras have this (for palaldin class family) - if (SpellFamilyFlags[2] & 0x00000020) - return SPELL_SPECIFIC_AURA; + // only paladin auras have this (for palaldin class family) + if (SpellFamilyFlags[2] & 0x00000020) + return SPELL_SPECIFIC_AURA; - break; - } - case SPELLFAMILY_SHAMAN: - { - // family flags 10 (Lightning), 42 (Earth), 37 (Water), proc shield from T2 8 pieces bonus - if (SpellFamilyFlags[1] & 0x420 - || SpellFamilyFlags[0] & 0x00000400 - || Id == 23552) - return SPELL_SPECIFIC_ELEMENTAL_SHIELD; + break; + } + case SPELLFAMILY_SHAMAN: + { + // family flags 10 (Lightning), 42 (Earth), 37 (Water), proc shield from T2 8 pieces bonus + if (SpellFamilyFlags[1] & 0x420 + || SpellFamilyFlags[0] & 0x00000400 + || Id == 23552) + return SPELL_SPECIFIC_ELEMENTAL_SHIELD; - break; + break; + } + case SPELLFAMILY_DEATHKNIGHT: + if (Id == 48266 || Id == 48263 || Id == 48265) + return SPELL_SPECIFIC_PRESENCE; + break; } - case SPELLFAMILY_DEATHKNIGHT: - if (Id == 48266 || Id == 48263 || Id == 48265) - return SPELL_SPECIFIC_PRESENCE; - break; - } - for (SpellEffectInfoMap::const_iterator itr = _effects.begin(); itr != _effects.end(); ++itr) - { - for (SpellEffectInfo const* effect : itr->second) + for (SpellEffectInfoMap::const_iterator itr = _effects.begin(); itr != _effects.end(); ++itr) { - if (effect && effect->Effect == SPELL_EFFECT_APPLY_AURA) + for (SpellEffectInfo const* effect : itr->second) { - switch (effect->ApplyAuraName) + if (effect && effect->Effect == SPELL_EFFECT_APPLY_AURA) { - case SPELL_AURA_MOD_CHARM: - case SPELL_AURA_MOD_POSSESS_PET: - case SPELL_AURA_MOD_POSSESS: - case SPELL_AURA_AOE_CHARM: - return SPELL_SPECIFIC_CHARM; - case SPELL_AURA_TRACK_CREATURES: - /// @workaround For non-stacking tracking spells (We need generic solution) - if (Id == 30645) // Gas Cloud Tracking - return SPELL_SPECIFIC_NORMAL; - case SPELL_AURA_TRACK_RESOURCES: - case SPELL_AURA_TRACK_STEALTHED: - return SPELL_SPECIFIC_TRACKER; + switch (effect->ApplyAuraName) + { + case SPELL_AURA_MOD_CHARM: + case SPELL_AURA_MOD_POSSESS_PET: + case SPELL_AURA_MOD_POSSESS: + case SPELL_AURA_AOE_CHARM: + return SPELL_SPECIFIC_CHARM; + case SPELL_AURA_TRACK_CREATURES: + /// @workaround For non-stacking tracking spells (We need generic solution) + if (Id == 30645) // Gas Cloud Tracking + return SPELL_SPECIFIC_NORMAL; + case SPELL_AURA_TRACK_RESOURCES: + case SPELL_AURA_TRACK_STEALTHED: + return SPELL_SPECIFIC_TRACKER; + } } } } - } - return SPELL_SPECIFIC_NORMAL; + return SPELL_SPECIFIC_NORMAL; + }(); } float SpellInfo::GetMinRange(bool positive) const diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 3404099e6f2..b04fa2403da 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -506,7 +506,7 @@ public: static uint32 GetDispelMask(DispelType type); uint32 GetExplicitTargetMask() const; - AuraStateType GetAuraState(uint32 difficulty) const; + AuraStateType GetAuraState() const; SpellSpecificType GetSpellSpecific() const; float GetMinRange(bool positive = false) const; @@ -544,6 +544,8 @@ public: bool _IsPositiveEffect(uint32 effIndex, bool deep) const; bool _IsPositiveSpell() const; static bool _IsPositiveTarget(uint32 targetA, uint32 targetB); + void _LoadSpellSpecific(); + void _LoadAuraState(); // unloading helpers void _UnloadImplicitTargetConditionLists(); @@ -553,9 +555,12 @@ public: SpellEffectInfo const* GetEffect(uint32 difficulty, uint32 index) const; SpellEffectInfo const* GetEffect(uint32 index) const { return GetEffect(DIFFICULTY_NONE, index); } +private: SpellEffectInfoMap _effects; SpellVisualMap _visuals; bool _hasPowerDifficultyData; + SpellSpecificType _spellSpecific; + AuraStateType _auraState; }; #endif // _SPELLINFO_H diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 0a2ae57ffd1..0d949f26d75 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3746,6 +3746,23 @@ void SpellMgr::LoadSpellInfoCorrections() TC_LOG_INFO("server.loading", ">> Loaded SpellInfo corrections in %u ms", GetMSTimeDiffToNow(oldMSTime)); } +void SpellMgr::LoadSpellInfoSpellSpecificAndAuraState() +{ + uint32 oldMSTime = getMSTime(); + + for (SpellInfo* spellInfo : mSpellInfoMap) + { + if (!spellInfo) + continue; + + // AuraState depends on SpellSpecific + spellInfo->_LoadSpellSpecific(); + spellInfo->_LoadAuraState(); + } + + TC_LOG_INFO("server.loading", ">> Loaded SpellInfo SpellSpecific and AuraState in %u ms", GetMSTimeDiffToNow(oldMSTime)); +} + void SpellMgr::LoadPetFamilySpellsStore() { std::unordered_map<uint32, SpellLevelsEntry const*> levelsBySpell; diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index 6110e8da79c..022258ab8cf 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -714,6 +714,7 @@ class TC_GAME_API SpellMgr void UnloadSpellInfoImplicitTargetConditionLists(); void LoadSpellInfoCustomAttributes(); void LoadSpellInfoCorrections(); + void LoadSpellInfoSpellSpecificAndAuraState(); private: SpellDifficultySearcherMap mSpellDifficultySearcherMap; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 47fa1cb9ea2..96fd5f02905 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1603,6 +1603,9 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Loading SpellInfo custom attributes..."); sSpellMgr->LoadSpellInfoCustomAttributes(); + TC_LOG_INFO("server.loading", "Loading SpellInfo SpellSpecific and AuraState..."); + sSpellMgr->LoadSpellInfoSpellSpecificAndAuraState(); + TC_LOG_INFO("server.loading", "Loading PetFamilySpellsStore Data..."); sSpellMgr->LoadPetFamilySpellsStore(); |
