diff options
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 12 |
4 files changed, 21 insertions, 15 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index c6227639608..24a9ab76377 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -820,7 +820,8 @@ void Spell::SelectEffectImplicitTargets(SpellEffIndex effIndex, SpellImplicitTar for (uint32 j = effIndex + 1; j < MAX_SPELL_EFFECTS; ++j) { SpellEffectInfo const* effects = GetSpellInfo()->Effects; - if (effects[effIndex].TargetA.GetTarget() == effects[j].TargetA.GetTarget() && + if (effects[j].IsEffect() && + effects[effIndex].TargetA.GetTarget() == effects[j].TargetA.GetTarget() && effects[effIndex].TargetB.GetTarget() == effects[j].TargetB.GetTarget() && effects[effIndex].ImplicitTargetConditions == effects[j].ImplicitTargetConditions && effects[effIndex].CalcRadius(m_caster) == effects[j].CalcRadius(m_caster) && diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index c813f9bbd27..a58c2ee19e4 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -816,23 +816,30 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry) StackAmount = spellEntry->StackAmount; for (uint8 i = 0; i < 2; ++i) Totem[i] = spellEntry->Totem[i]; + for (uint8 i = 0; i < MAX_SPELL_REAGENTS; ++i) Reagent[i] = spellEntry->Reagent[i]; + for (uint8 i = 0; i < MAX_SPELL_REAGENTS; ++i) ReagentCount[i] = spellEntry->ReagentCount[i]; + EquippedItemClass = spellEntry->EquippedItemClass; EquippedItemSubClassMask = spellEntry->EquippedItemSubClassMask; EquippedItemInventoryTypeMask = spellEntry->EquippedItemInventoryTypeMask; for (uint8 i = 0; i < 2; ++i) TotemCategory[i] = spellEntry->TotemCategory[i]; + for (uint8 i = 0; i < 2; ++i) SpellVisual[i] = spellEntry->SpellVisual[i]; + SpellIconID = spellEntry->SpellIconID; ActiveIconID = spellEntry->activeIconID; for (uint8 i = 0; i < 16; ++i) SpellName[i] = spellEntry->SpellName[i]; + for (uint8 i = 0; i < 16; ++i) Rank[i] = spellEntry->Rank[i]; + MaxTargetLevel = spellEntry->MaxTargetLevel; MaxAffectedTargets = spellEntry->MaxAffectedTargets; SpellFamilyName = spellEntry->SpellFamilyName; @@ -843,7 +850,7 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry) SchoolMask = spellEntry->SchoolMask; for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) Effects[i] = SpellEffectInfo(spellEntry, this, i); - ExplicitTargetMask = _GetExplicitTargetMask(); + ChainEntry = NULL; } @@ -2270,15 +2277,14 @@ bool SpellInfo::IsDifferentRankOf(SpellInfo const* spellInfo) const bool SpellInfo::IsHighRankOf(SpellInfo const* spellInfo) const { if (ChainEntry && spellInfo->ChainEntry) - { if (ChainEntry->first == spellInfo->ChainEntry->first) if (ChainEntry->rank > spellInfo->ChainEntry->rank) return true; - } + return false; } -uint32 SpellInfo::_GetExplicitTargetMask() const +void SpellInfo::_InitializeExplicitTargetMask() { bool srcSet = false; bool dstSet = false; @@ -2288,6 +2294,7 @@ uint32 SpellInfo::_GetExplicitTargetMask() const { if (!Effects[i].IsEffect()) continue; + targetMask |= Effects[i].TargetA.GetExplicitTargetMask(srcSet, dstSet); targetMask |= Effects[i].TargetB.GetExplicitTargetMask(srcSet, dstSet); @@ -2301,9 +2308,11 @@ uint32 SpellInfo::_GetExplicitTargetMask() const // don't add explicit object/dest flags when spell has no max range if (GetMaxRange(true) == 0.0f && GetMaxRange(false) == 0.0f) effectTargetMask &= ~(TARGET_FLAG_UNIT_MASK | TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_CORPSE_MASK | TARGET_FLAG_DEST_LOCATION); + targetMask |= effectTargetMask; } - return targetMask; + + ExplicitTargetMask = targetMask; } bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index dfe42a7a6af..6ed742a3b8e 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -461,7 +461,7 @@ public: bool IsHighRankOf(SpellInfo const* spellInfo) const; // loading helpers - uint32 _GetExplicitTargetMask() const; + void _InitializeExplicitTargetMask(); bool _IsPositiveEffect(uint8 effIndex, bool deep) const; bool _IsPositiveSpell() const; static bool _IsPositiveTarget(uint32 targetA, uint32 targetB); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index dde8624b2c5..42d408ebbad 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2693,10 +2693,8 @@ void SpellMgr::LoadSpellInfoStore() mSpellInfoMap.resize(sSpellStore.GetNumRows(), NULL); for (uint32 i = 0; i < sSpellStore.GetNumRows(); ++i) - { if (SpellEntry const* spellEntry = sSpellStore.LookupEntry(i)) mSpellInfoMap[i] = new SpellInfo(spellEntry); - } TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded SpellInfo store in %u ms", GetMSTimeDiffToNow(oldMSTime)); } @@ -2704,20 +2702,16 @@ void SpellMgr::LoadSpellInfoStore() void SpellMgr::UnloadSpellInfoStore() { for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) - { - if (mSpellInfoMap[i]) - delete mSpellInfoMap[i]; - } + delete mSpellInfoMap[i]; + mSpellInfoMap.clear(); } void SpellMgr::UnloadSpellInfoImplicitTargetConditionLists() { for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) - { if (mSpellInfoMap[i]) mSpellInfoMap[i]->_UnloadImplicitTargetConditionLists(); - } } void SpellMgr::LoadSpellInfoCustomAttributes() @@ -3010,6 +3004,8 @@ void SpellMgr::LoadSpellInfoCustomAttributes() default: break; } + + spellInfo->_InitializeExplicitTargetMask(); } CreatureAI::FillAISpellInfo(); |