aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Spells/SpellInfo.cpp43
-rw-r--r--src/server/game/Spells/SpellInfo.h4
-rw-r--r--src/server/game/Spells/SpellMgr.cpp7
-rw-r--r--src/server/game/Spells/SpellMgr.h1
-rw-r--r--src/server/game/World/World.cpp3
5 files changed, 42 insertions, 16 deletions
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 3d4b590a59b..01e20ff03ec 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -3429,38 +3429,53 @@ void SpellInfo::_LoadImmunityInfo()
}
}
-void SpellInfo::_LoadSqrtTargetLimit(int32 maxTargets, int32 numNonDiminishedTargets, Optional<SpellEffIndex> maxTargetsEffectValueHolder,
- Optional<SpellEffIndex> numNonDiminishedTargetsEffectValueHolder)
+void SpellInfo::_LoadSqrtTargetLimit(int32 maxTargets, int32 numNonDiminishedTargets,
+ Optional<uint32> maxTargetsValueHolderSpell, Optional<SpellEffIndex> maxTargetsValueHolderEffect,
+ Optional<uint32> numNonDiminishedTargetsValueHolderSpell, Optional<SpellEffIndex> numNonDiminishedTargetsValueHolderEffect)
{
SqrtDamageAndHealingDiminishing.MaxTargets = maxTargets;
SqrtDamageAndHealingDiminishing.NumNonDiminishedTargets = numNonDiminishedTargets;
- if (maxTargetsEffectValueHolder)
+ if (maxTargetsValueHolderEffect)
{
- if (maxTargetsEffectValueHolder < GetEffects().size())
+ SpellInfo const* maxTargetValueHolder = this;
+ if (maxTargetsValueHolderSpell)
+ maxTargetValueHolder = sSpellMgr->GetSpellInfo(*maxTargetsValueHolderSpell, Difficulty);
+
+ if (!maxTargetValueHolder)
+ TC_LOG_ERROR("spells", "SpellInfo::_LoadSqrtTargetLimit(maxTargets): Spell {} does not exist", maxTargetsValueHolderSpell);
+ else if (maxTargetsValueHolderEffect >= maxTargetValueHolder->GetEffects().size())
+ TC_LOG_ERROR("spells", "SpellInfo::_LoadSqrtTargetLimit(maxTargets): Spell {} does not have effect {}",
+ maxTargetValueHolder->Id, AsUnderlyingType(*maxTargetsValueHolderEffect));
+ else
{
- SpellEffectInfo const& valueHolder = GetEffect(*maxTargetsEffectValueHolder);
+ SpellEffectInfo const& valueHolder = maxTargetValueHolder->GetEffect(*maxTargetsValueHolderEffect);
int32 expectedValue = valueHolder.CalcBaseValue(nullptr, nullptr);
if (maxTargets != expectedValue)
TC_LOG_ERROR("spells", "SpellInfo::_LoadSqrtTargetLimit(maxTargets): Spell {} has different value in effect {} than expected, recheck target caps (expected {}, got {})",
- Id, AsUnderlyingType(*maxTargetsEffectValueHolder), maxTargets, expectedValue);
+ maxTargetValueHolder->Id, AsUnderlyingType(*maxTargetsValueHolderEffect), maxTargets, expectedValue);
}
- else
- TC_LOG_ERROR("spells", "SpellInfo::_LoadSqrtTargetLimit(maxTargets): Spell {} does not have effect {}", Id, AsUnderlyingType(*maxTargetsEffectValueHolder));
}
- if (numNonDiminishedTargetsEffectValueHolder)
+ if (numNonDiminishedTargetsValueHolderEffect)
{
- if (numNonDiminishedTargetsEffectValueHolder < GetEffects().size())
+ SpellInfo const* numNonDiminishedTargetsValueHolder = this;
+ if (numNonDiminishedTargetsValueHolderSpell)
+ numNonDiminishedTargetsValueHolder = sSpellMgr->GetSpellInfo(*numNonDiminishedTargetsValueHolderSpell, Difficulty);
+
+ if (!numNonDiminishedTargetsValueHolder)
+ TC_LOG_ERROR("spells", "SpellInfo::_LoadSqrtTargetLimit(numNonDiminishedTargets): Spell {} does not exist", maxTargetsValueHolderSpell);
+ else if (numNonDiminishedTargetsValueHolderEffect >= numNonDiminishedTargetsValueHolder->GetEffects().size())
+ TC_LOG_ERROR("spells", "SpellInfo::_LoadSqrtTargetLimit(numNonDiminishedTargets): Spell {} does not have effect {}",
+ numNonDiminishedTargetsValueHolder->Id, AsUnderlyingType(*maxTargetsValueHolderEffect));
+ else
{
- SpellEffectInfo const& valueHolder = GetEffect(*numNonDiminishedTargetsEffectValueHolder);
+ SpellEffectInfo const& valueHolder = numNonDiminishedTargetsValueHolder->GetEffect(*numNonDiminishedTargetsValueHolderEffect);
int32 expectedValue = valueHolder.CalcBaseValue(nullptr, nullptr);
if (numNonDiminishedTargets != expectedValue)
TC_LOG_ERROR("spells", "SpellInfo::_LoadSqrtTargetLimit(numNonDiminishedTargets): Spell {} has different value in effect {} than expected, recheck target caps (expected {}, got {})",
- Id, AsUnderlyingType(*numNonDiminishedTargetsEffectValueHolder), numNonDiminishedTargets, expectedValue);
+ numNonDiminishedTargetsValueHolder->Id, AsUnderlyingType(*numNonDiminishedTargetsValueHolderEffect), numNonDiminishedTargets, expectedValue);
}
- else
- TC_LOG_ERROR("spells", "SpellInfo::_LoadSqrtTargetLimit(numNonDiminishedTargets): Spell {} does not have effect {}", Id, AsUnderlyingType(*numNonDiminishedTargetsEffectValueHolder));
}
}
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index af85b681ac3..6576e1eb228 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -610,8 +610,8 @@ class TC_GAME_API SpellInfo
void _LoadSpellDiminishInfo();
void _LoadImmunityInfo();
void _LoadSqrtTargetLimit(int32 maxTargets, int32 numNonDiminishedTargets,
- Optional<SpellEffIndex> maxTargetsEffectValueHolder,
- Optional<SpellEffIndex> numNonDiminishedTargetsEffectValueHolder);
+ Optional<uint32> maxTargetsValueHolderSpell, Optional<SpellEffIndex> maxTargetsValueHolderEffect,
+ Optional<uint32> numNonDiminishedTargetsValueHolderSpell, Optional<SpellEffIndex> numNonDiminishedTargetsValueHolderEffect);
// unloading helpers
void _UnloadImplicitTargetConditionLists();
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index e488ba8e611..8e55b58cb8e 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -5123,6 +5123,13 @@ void SpellMgr::LoadSpellInfoImmunities()
TC_LOG_INFO("server.loading", ">> Loaded SpellInfo immunity infos in {} ms", GetMSTimeDiffToNow(oldMSTime));
}
+void SpellMgr::LoadSpellInfoTargetCaps()
+{
+ uint32 oldMSTime = getMSTime();
+
+ TC_LOG_INFO("server.loading", ">> Loaded SpellInfo target caps in {} 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 7ad5f98a73c..20ed878b465 100644
--- a/src/server/game/Spells/SpellMgr.h
+++ b/src/server/game/Spells/SpellMgr.h
@@ -826,6 +826,7 @@ class TC_GAME_API SpellMgr
void LoadSpellInfoSpellSpecificAndAuraState();
void LoadSpellInfoDiminishing();
void LoadSpellInfoImmunities();
+ void LoadSpellInfoTargetCaps();
void LoadSpellTotemModel();
private:
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 0415626b00a..67f2fedb6bd 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1833,6 +1833,9 @@ bool World::SetInitialWorldSettings()
TC_LOG_INFO("server.loading", "Loading SpellInfo immunity infos...");
sSpellMgr->LoadSpellInfoImmunities();
+ TC_LOG_INFO("server.loading", "Loading SpellInfo target caps...");
+ sSpellMgr->LoadSpellInfoTargetCaps();
+
TC_LOG_INFO("server.loading", "Loading PetFamilySpellsStore Data...");
sSpellMgr->LoadPetFamilySpellsStore();