diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-12-23 17:53:58 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-12-23 17:53:58 +0100 |
commit | 38eee2f034398e77335ec97228b931aaca5579bd (patch) | |
tree | ecaa896f0b68c33c37f997c910599fcd939dc95a | |
parent | 38a5956b8544ee43ec4faeba42a40dbee4dcc65f (diff) |
Core/Spells: Moved loading aoe target caps out of SpellMgr::LoadSpellInfoCorrections
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 43 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.h | 4 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.h | 1 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 3 |
5 files changed, 54 insertions, 22 deletions
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index f0eaa86f97e..7b93cce27e1 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -3483,38 +3483,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, 0, -1); 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, 0, -1); 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 d327683dc28..6dc47a1902d 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -608,8 +608,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 657f32df739..0c88860160e 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -5065,12 +5065,6 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesCu |= SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED; }); - // Eye Beam - ApplySpellFix({ 198030 }, [](SpellInfo* spellInfo) - { - spellInfo->_LoadSqrtTargetLimit(5, 0, {}, {}); - }); - // Collective Anguish channel hack (triggered by another channel) ApplySpellFix({ 391057, 393831 }, [](SpellInfo* spellInfo) { @@ -5233,6 +5227,25 @@ void SpellMgr::LoadSpellInfoImmunities() TC_LOG_INFO("server.loading", ">> Loaded SpellInfo immunity infos in {} ms", GetMSTimeDiffToNow(oldMSTime)); } +void SpellMgr::LoadSpellInfoTargetCaps() +{ + uint32 oldMSTime = getMSTime(); + + // Eye Beam + ApplySpellFix({ 198030 }, [](SpellInfo* spellInfo) + { + spellInfo->_LoadSqrtTargetLimit(5, 0, 198013, EFFECT_4, {}, {}); + }); + + // Volatile Agony + ApplySpellFix({ 453035 }, [](SpellInfo* spellInfo) + { + spellInfo->_LoadSqrtTargetLimit(8, 0, 453034, EFFECT_1, {}, {}); + }); + + 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 b80fc9aa033..26c7e565cc8 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -827,6 +827,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 3540e053c55..0a085ed2088 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1884,6 +1884,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(); |