diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-03-22 20:20:18 +0100 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2025-04-06 19:35:36 +0200 |
commit | ce106b59f66b22a5d5fc45462466fe91b494db0e (patch) | |
tree | bf90c58a9ebed697a70ecfb1998f26071a81f530 /src | |
parent | 528f8e3332e13a451df8bcc198eeec7b2bec8d86 (diff) |
Core/Auras: Fixed SPELLVALUE_AURA_STACK adding incorrect number of stacks on aura refresh
(cherry picked from commit 4c605ce621a137f32cf02527d48e36fed1b6e235)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Pet/Pet.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraDefines.h | 3 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 12 |
7 files changed, 18 insertions, 21 deletions
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index e1e9dc36497..753a6afcdc5 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -1238,7 +1238,8 @@ void Pet::_LoadAuras(PreparedQueryResult auraResult, PreparedQueryResult effectR AuraCreateInfo createInfo(castId, spellInfo, difficulty, key.EffectMask, this); createInfo .SetCasterGUID(casterGuid) - .SetBaseAmount(info.BaseAmounts.data()); + .SetBaseAmount(info.BaseAmounts.data()) + .SetStackAmount(stackCount); if (Aura* aura = Aura::TryCreate(createInfo)) { @@ -1248,7 +1249,7 @@ void Pet::_LoadAuras(PreparedQueryResult auraResult, PreparedQueryResult effectR continue; } - aura->SetLoadedState(maxDuration, remainTime, remainCharges, stackCount, recalculateMask, info.Amounts.data()); + aura->SetLoadedState(maxDuration, remainTime, remainCharges, recalculateMask, info.Amounts.data()); aura->ApplyForTargets(); TC_LOG_DEBUG("entities.pet", "Added aura spellid {}, effectmask {}", spellInfo->Id, key.EffectMask); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c88da79dd6e..45d85dbcc89 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -17715,7 +17715,8 @@ void Player::_LoadAuras(PreparedQueryResult auraResult, PreparedQueryResult effe createInfo .SetCasterGUID(casterGuid) .SetBaseAmount(info.BaseAmounts.data()) - .SetCastItem(itemGuid, castItemId, castItemLevel); + .SetCastItem(itemGuid, castItemId, castItemLevel) + .SetStackAmount(stackCount); if (Aura* aura = Aura::TryCreate(createInfo)) { @@ -17725,7 +17726,7 @@ void Player::_LoadAuras(PreparedQueryResult auraResult, PreparedQueryResult effe continue; } - aura->SetLoadedState(maxDuration, remainTime, remainCharges, stackCount, recalculateMask, info.Amounts.data()); + aura->SetLoadedState(maxDuration, remainTime, remainCharges, recalculateMask, info.Amounts.data()); aura->ApplyForTargets(); TC_LOG_DEBUG("entities.player", "Player::_LoadAuras: Added aura (SpellID: {}, EffectMask: {}) to player '{} ({})", spellInfo->Id, key.EffectMask, GetName(), GetGUID().ToString()); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 28d39abd70c..e558ba31c2a 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3348,7 +3348,7 @@ Aura* Unit::_TryStackingOrRefreshingExistingAura(AuraCreateInfo& createInfo) } // try to increase stack amount - foundAura->ModStackAmount(1, AURA_REMOVE_BY_DEFAULT, createInfo.ResetPeriodicTimer); + foundAura->ModStackAmount(createInfo.StackAmount, AURA_REMOVE_BY_DEFAULT, createInfo.ResetPeriodicTimer); return foundAura; } } @@ -3992,7 +3992,8 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, ObjectGuid casterGUID, W AuraCreateInfo createInfo(aura->GetCastId(), aura->GetSpellInfo(), aura->GetCastDifficulty(), effMask, unitStealer); createInfo .SetCasterGUID(aura->GetCasterGUID()) - .SetBaseAmount(baseDamage); + .SetBaseAmount(baseDamage) + .SetStackAmount(stolenCharges); if (Aura* newAura = Aura::TryRefreshStackOrCreate(createInfo)) { @@ -4005,7 +4006,7 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, ObjectGuid casterGUID, W caster->GetSingleCastAuras().push_front(aura); } // FIXME: using aura->GetMaxDuration() maybe not blizzlike but it fixes stealing of spells like Innervate - newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? stolenCharges : aura->GetCharges(), stolenCharges, recalculateMask, &damage[0]); + newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? stolenCharges : aura->GetCharges(), recalculateMask, &damage[0]); newAura->ApplyForTargets(); } } diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index eb540e2c6d8..5b1e006178a 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -788,6 +788,8 @@ struct TC_GAME_API AuraCreateInfo AuraCreateInfo& SetBaseAmount(int32 const* bp) { BaseAmount = bp; return *this; } AuraCreateInfo& SetCastItem(ObjectGuid const& guid, uint32 itemId, int32 itemLevel) { CastItemGUID = guid; CastItemId = itemId; CastItemLevel = itemLevel; return *this; } AuraCreateInfo& SetPeriodicReset(bool reset) { ResetPeriodicTimer = reset; return *this; } + AuraCreateInfo& SetIsRefresh(bool* isRefresh) { IsRefresh = isRefresh; return *this; } + AuraCreateInfo& SetStackAmount(int32 stackAmount) { StackAmount = stackAmount > 0 ? stackAmount : 1; return *this; } AuraCreateInfo& SetOwnerEffectMask(uint32 effMask) { _targetEffectMask = effMask; return *this; } SpellInfo const* GetSpellInfo() const { return _spellInfo; } @@ -800,6 +802,7 @@ struct TC_GAME_API AuraCreateInfo uint32 CastItemId = 0; int32 CastItemLevel = -1; bool* IsRefresh = nullptr; + int32 StackAmount = 1; bool ResetPeriodicTimer = true; private: diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 4bd7f9f19b0..ea99543c16e 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -476,7 +476,7 @@ m_spellInfo(createInfo._spellInfo), m_castDifficulty(createInfo._castDifficulty) m_castItemGuid(createInfo.CastItemGUID), m_castItemId(createInfo.CastItemId), m_castItemLevel(createInfo.CastItemLevel), m_spellVisual({ createInfo.Caster ? createInfo.Caster->GetCastSpellXSpellVisualId(createInfo._spellInfo) : createInfo._spellInfo->GetSpellXSpellVisualId() }), m_applyTime(GameTime::GetGameTime()), m_owner(createInfo._owner), m_timeCla(0), m_updateTargetMapInterval(0), -m_casterLevel(createInfo.Caster ? createInfo.Caster->GetLevel() : m_spellInfo->SpellLevel), m_procCharges(0), m_stackAmount(1), +m_casterLevel(createInfo.Caster ? createInfo.Caster->GetLevel() : m_spellInfo->SpellLevel), m_procCharges(0), m_stackAmount(createInfo.StackAmount), m_isRemoved(false), m_isSingleTarget(false), m_isUsingCharges(false), m_dropEvent(nullptr), m_procCooldown(TimePoint::min()), m_lastProcAttemptTime(GameTime::Now() - Seconds(10)), m_lastProcSuccessTime(GameTime::Now() - Seconds(120)), m_scriptRef(this, NoopAuraDeleter()) @@ -1259,13 +1259,12 @@ AuraKey Aura::GenerateKey(uint32& recalculateMask) const return key; } -void Aura::SetLoadedState(int32 maxDuration, int32 duration, int32 charges, uint8 stackAmount, uint32 recalculateMask, int32* amount) +void Aura::SetLoadedState(int32 maxDuration, int32 duration, int32 charges, uint32 recalculateMask, int32* amount) { m_maxDuration = maxDuration; m_duration = duration; m_procCharges = charges; m_isUsingCharges = m_procCharges != 0; - m_stackAmount = stackAmount; Unit* caster = GetCaster(); for (AuraEffect* effect : GetAuraEffects()) { diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index 609ef81e47d..f75afb2d4f4 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -223,7 +223,7 @@ class TC_GAME_API Aura * @return Aura key. */ AuraKey GenerateKey(uint32& recalculateMask) const; - void SetLoadedState(int32 maxDuration, int32 duration, int32 charges, uint8 stackAmount, uint32 recalculateMask, int32* amount); + void SetLoadedState(int32 maxDuration, int32 duration, int32 charges, uint32 recalculateMask, int32* amount); // helpers for aura effects bool CanPeriodicTickCrit() const; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index e962659526e..f0d88451c29 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3235,21 +3235,13 @@ void Spell::DoSpellEffectHit(Unit* unit, SpellEffectInfo const& spellEffectInfo, .SetCastItem(m_castItemGUID, m_castItemEntry, m_castItemLevel) .SetPeriodicReset(resetPeriodicTimer) .SetOwnerEffectMask(aura_effmask) - .IsRefresh = &refresh; + .SetIsRefresh(&refresh) + .SetStackAmount(m_spellValue->AuraStackAmount); if (Aura* aura = Aura::TryRefreshStackOrCreate(createInfo, false)) { hitInfo.HitAura = aura->ToUnitAura(); - // Set aura stack amount to desired value - if (m_spellValue->AuraStackAmount > 1) - { - if (!refresh) - hitInfo.HitAura->SetStackAmount(m_spellValue->AuraStackAmount); - else - hitInfo.HitAura->ModStackAmount(m_spellValue->AuraStackAmount); - } - hitInfo.HitAura->SetDiminishGroup(hitInfo.DRGroup); if (!m_spellValue->Duration) |