aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp6
-rw-r--r--src/server/game/Spells/SpellInfo.cpp405
-rw-r--r--src/server/game/Spells/SpellInfo.h7
-rw-r--r--src/server/game/Spells/SpellMgr.cpp17
-rw-r--r--src/server/game/Spells/SpellMgr.h1
-rw-r--r--src/server/game/World/World.cpp3
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();