aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Spells/SpellInfo.cpp409
-rw-r--r--src/server/game/Spells/SpellInfo.h6
-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
5 files changed, 241 insertions, 195 deletions
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index f69f49eb509..1e3eeee676a 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -855,6 +855,9 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry)
ChainEntry = NULL;
ExplicitTargetMask = 0;
+
+ _spellSpecific = SPELL_SPECIFIC_NORMAL;
+ _auraState = AURA_STATE_NONE;
}
SpellInfo::~SpellInfo()
@@ -1854,239 +1857,255 @@ uint32 SpellInfo::GetExplicitTargetMask() const
AuraStateType SpellInfo::GetAuraState() const
{
- // Seals
- if (GetSpellSpecific() == SPELL_SPECIFIC_SEAL)
- return AURA_STATE_JUDGEMENT;
-
- // Conflagrate aura state on Immolate and Shadowflame
- if (SpellFamilyName == SPELLFAMILY_WARLOCK &&
- // Immolate
- ((SpellFamilyFlags[0] & 4) ||
- // Shadowflame
- (SpellFamilyFlags[2] & 2)))
- return AURA_STATE_CONFLAGRATE;
-
- // Faerie Fire (druid versions)
- if (SpellFamilyName == SPELLFAMILY_DRUID && SpellFamilyFlags[0] & 0x400)
- return AURA_STATE_FAERIE_FIRE;
-
- // Sting (hunter's pet ability)
- if (GetCategory() == 1133)
- return AURA_STATE_FAERIE_FIRE;
-
- // Victorious
- if (SpellFamilyName == SPELLFAMILY_WARRIOR && SpellFamilyFlags[1] & 0x00040000)
- return AURA_STATE_WARRIOR_VICTORY_RUSH;
-
- // Swiftmend state on Regrowth & Rejuvenation
- if (SpellFamilyName == SPELLFAMILY_DRUID && SpellFamilyFlags[0] & 0x50)
- return AURA_STATE_SWIFTMEND;
-
- // Deadly poison aura state
- if (SpellFamilyName == SPELLFAMILY_ROGUE && SpellFamilyFlags[0] & 0x10000)
- return AURA_STATE_DEADLY_POISON;
-
- // Enrage aura state
- if (Dispel == DISPEL_ENRAGE)
- return AURA_STATE_ENRAGE;
-
- // Bleeding aura state
- if (GetAllEffectsMechanicMask() & 1<<MECHANIC_BLEED)
- return AURA_STATE_BLEEDING;
-
- if (GetSchoolMask() & SPELL_SCHOOL_MASK_FROST)
- for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
- if (Effects[i].IsAura() && (Effects[i].ApplyAuraName == SPELL_AURA_MOD_STUN
- || Effects[i].ApplyAuraName == SPELL_AURA_MOD_ROOT))
- return AURA_STATE_FROZEN;
+ return _auraState;
+}
- switch (Id)
+void SpellInfo::_LoadAuraState()
+{
+ _auraState = [this]() -> AuraStateType
{
- case 71465: // Divine Surge
- case 50241: // Evasive Charges
- return AURA_STATE_UNKNOWN22;
- default:
- break;
- }
+ // Seals
+ if (GetSpellSpecific() == SPELL_SPECIFIC_SEAL)
+ return AURA_STATE_JUDGEMENT;
+
+ // Conflagrate aura state on Immolate and Shadowflame
+ if (SpellFamilyName == SPELLFAMILY_WARLOCK &&
+ // Immolate
+ ((SpellFamilyFlags[0] & 4) ||
+ // Shadowflame
+ (SpellFamilyFlags[2] & 2)))
+ return AURA_STATE_CONFLAGRATE;
+
+ // Faerie Fire (druid versions)
+ if (SpellFamilyName == SPELLFAMILY_DRUID && SpellFamilyFlags[0] & 0x400)
+ return AURA_STATE_FAERIE_FIRE;
+
+ // Sting (hunter's pet ability)
+ if (GetCategory() == 1133)
+ return AURA_STATE_FAERIE_FIRE;
+
+ // Victorious
+ if (SpellFamilyName == SPELLFAMILY_WARRIOR && SpellFamilyFlags[1] & 0x00040000)
+ return AURA_STATE_WARRIOR_VICTORY_RUSH;
+
+ // Swiftmend state on Regrowth & Rejuvenation
+ if (SpellFamilyName == SPELLFAMILY_DRUID && SpellFamilyFlags[0] & 0x50)
+ return AURA_STATE_SWIFTMEND;
+
+ // Deadly poison aura state
+ if (SpellFamilyName == SPELLFAMILY_ROGUE && SpellFamilyFlags[0] & 0x10000)
+ return AURA_STATE_DEADLY_POISON;
+
+ // Enrage aura state
+ if (Dispel == DISPEL_ENRAGE)
+ return AURA_STATE_ENRAGE;
+
+ // Bleeding aura state
+ if (GetAllEffectsMechanicMask() & 1 << MECHANIC_BLEED)
+ return AURA_STATE_BLEEDING;
+
+ if (GetSchoolMask() & SPELL_SCHOOL_MASK_FROST)
+ for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ if (Effects[i].IsAura() && (Effects[i].ApplyAuraName == SPELL_AURA_MOD_STUN
+ || Effects[i].ApplyAuraName == 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 (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ // Food / Drinks (mostly)
+ if (AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
{
- if (!Effects[i].IsAura())
- continue;
- switch (Effects[i].ApplyAuraName)
+ bool food = false;
+ bool drink = false;
+ for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
- // 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 (!Effects[i].IsAura())
+ continue;
+ switch (Effects[i].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;
+ // Arcane brillance and Arcane intelect (normal check fails because of flags difference)
+ if (SpellFamilyFlags[0] & 0x400)
+ return SPELL_SPECIFIC_MAGE_ARCANE_BRILLANCE;
- if ((SpellFamilyFlags[0] & 0x1000000) && Effects[0].ApplyAuraName == SPELL_AURA_MOD_CONFUSE)
- return SPELL_SPECIFIC_MAGE_POLYMORPH;
+ if ((SpellFamilyFlags[0] & 0x1000000) && Effects[0].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:
- {
- // only warlock curses have this
- if (Dispel == DISPEL_CURSE)
- return SPELL_SPECIFIC_CURSE;
+ break;
+ }
+ case SPELLFAMILY_WARLOCK:
+ {
+ // 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.HasFlag(0x00380000, 0x00440000, 0x00001010))
- return SPELL_SPECIFIC_ASPECT;
+ // only hunter aspects have this (but not all aspects in hunter family)
+ if (SpellFamilyFlags.HasFlag(0x00380000, 0x00440000, 0x00001010))
+ 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] & 0x26000C00
- || SpellFamilyFlags[0] & 0x0A000000)
- 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] & 0x26000C00
+ || SpellFamilyFlags[0] & 0x0A000000)
+ return SPELL_SPECIFIC_SEAL;
- if (SpellFamilyFlags[0] & 0x00002190)
- return SPELL_SPECIFIC_HAND;
+ if (SpellFamilyFlags[0] & 0x00002190)
+ return SPELL_SPECIFIC_HAND;
- // Judgement of Wisdom, Judgement of Light, Judgement of Justice
- if (Id == 20184 || Id == 20185 || Id == 20186)
- return SPELL_SPECIFIC_JUDGEMENT;
+ // Judgement of Wisdom, Judgement of Light, Judgement of Justice
+ if (Id == 20184 || Id == 20185 || Id == 20186)
+ 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 (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
- {
- if (Effects[i].Effect == SPELL_EFFECT_APPLY_AURA)
+ for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
- switch (Effects[i].ApplyAuraName)
+ if (Effects[i].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 (Effects[i].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 589ed16e409..2f94555e493 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -483,9 +483,15 @@ public:
bool _IsPositiveEffect(uint8 effIndex, bool deep) const;
bool _IsPositiveSpell() const;
static bool _IsPositiveTarget(uint32 targetA, uint32 targetB);
+ void _LoadSpellSpecific();
+ void _LoadAuraState();
// unloading helpers
void _UnloadImplicitTargetConditionLists();
+
+private:
+ SpellSpecificType _spellSpecific;
+ AuraStateType _auraState;
};
#endif // _SPELLINFO_H
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index bab1a34c038..94d34d78bd6 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -3731,3 +3731,20 @@ 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));
+}
diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h
index ff328a2ac1f..52ea6f25d1f 100644
--- a/src/server/game/Spells/SpellMgr.h
+++ b/src/server/game/Spells/SpellMgr.h
@@ -684,6 +684,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 934b33333f2..443d0c63efa 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1449,6 +1449,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 GameObject models...");
LoadGameObjectModelList(m_dataPath);