diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-02-24 14:33:56 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-02-24 14:33:56 +0100 |
commit | e233079d2d8dbdc1bcd7beb593f047b26a6c4cc9 (patch) | |
tree | 7d95c9ae4d0f37f1dc39397863aca43ac08c5e94 /src/server | |
parent | 00223f3bee137f3b3f3a8e0ec33b634b4511cc0b (diff) |
Core/Units: Refactor GetCastSpellInfo to return values via return value and hide internal lookup state tracker
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 12 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_shaman.cpp | 5 |
4 files changed, 27 insertions, 14 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 18eac505c14..8c487f96b1c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -30904,8 +30904,9 @@ void Player::ExecutePendingSpellCastRequest() } // Check possible spell cast overrides - GetCastSpellInfoContext overrideContext; - spellInfo = castingUnit->GetCastSpellInfo(spellInfo, triggerFlag, &overrideContext); + auto [overrideSpellInfo, overrideTriggerFlag] = castingUnit->GetCastSpellInfo(spellInfo); + spellInfo = overrideSpellInfo; + triggerFlag |= overrideTriggerFlag; if (spellInfo->IsPassive()) { CancelPendingCastRequest(); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 4b3e7921046..f928a40fe7b 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -14085,16 +14085,19 @@ void Unit::ClearBossEmotes(Optional<uint32> zoneId, Player const* target) const bool Unit::GetCastSpellInfoContext::AddSpell(uint32 spellId) { - auto itr = std::ranges::find(VisitedSpells, spellId); - if (itr != VisitedSpells.end()) - return false; // already exists + for (uint32& slot : VisitedSpells) + { + if (slot == spellId) + return false; // already exists - itr = std::ranges::find(VisitedSpells, 0u); - if (itr == VisitedSpells.end()) - return false; // no free slots left + if (!slot) + { + slot = spellId; + return true; + } + } - *itr = spellId; - return true; + return false; // no free slots left } SpellInfo const* Unit::GetCastSpellInfo(SpellInfo const* spellInfo, TriggerCastFlags& triggerFlag, GetCastSpellInfoContext* context) const diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 8feedd56904..6fbd86f0f31 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1462,6 +1462,18 @@ class TC_GAME_API Unit : public WorldObject std::array<uint32, 5> VisitedSpells = { }; bool AddSpell(uint32 spellId); }; + struct GetCastSpellInfoResult + { + ::SpellInfo const* SpellInfo = nullptr; + TriggerCastFlags TriggerFlag = TRIGGERED_NONE; + }; + GetCastSpellInfoResult GetCastSpellInfo(SpellInfo const* spellInfo) const + { + GetCastSpellInfoContext context; + GetCastSpellInfoResult result; + result.SpellInfo = GetCastSpellInfo(spellInfo, result.TriggerFlag, &context); + return result; + } virtual SpellInfo const* GetCastSpellInfo(SpellInfo const* spellInfo, TriggerCastFlags& triggerFlag, GetCastSpellInfoContext* context) const; uint32 GetCastSpellXSpellVisualId(SpellInfo const* spellInfo) const override; diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index da89bd4c197..58591a25ae9 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -1788,10 +1788,7 @@ class spell_sha_thorims_invocation_trigger : public SpellScript if (!spellIdHolder) return; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellIdHolder->SpellIdToTrigger, GetCastDifficulty()); - TriggerCastFlags triggerFlags = TRIGGERED_NONE; - Unit::GetCastSpellInfoContext overrideContext; - spellInfo = caster->GetCastSpellInfo(spellInfo, triggerFlags, &overrideContext); + auto [spellInfo, triggerFlags] = caster->GetCastSpellInfo(sSpellMgr->GetSpellInfo(spellIdHolder->SpellIdToTrigger, GetCastDifficulty())); // Remove Overflowing Maelstrom spellmod early to make next cast behave as if it consumed only 5 or less maelstrom stacks // this works because consuming "up to 5 stacks" will always cause Maelstrom Weapon stacks to drop to 5 or lower |