diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-03-22 20:20:18 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-03-22 20:20:18 +0100 |
commit | 4c605ce621a137f32cf02527d48e36fed1b6e235 (patch) | |
tree | 0665f8c815150481fc034560b4de301dbea801d8 /src/server/game | |
parent | b954fd23c1ee8ba800af653b8eca7e7eef84ec49 (diff) |
Core/Auras: Fixed SPELLVALUE_AURA_STACK adding incorrect number of stacks on aura refresh
Diffstat (limited to 'src/server/game')
-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 c1248c88be1..949743f16ae 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -1269,7 +1269,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)) { @@ -1279,7 +1280,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 63a793f951e..cf8d7b08a6c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -18938,7 +18938,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)) { @@ -18948,7 +18949,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 f928a40fe7b..b8f50b8cc3c 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3364,7 +3364,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; } } @@ -4008,7 +4008,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)) { @@ -4021,7 +4022,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 d502faaaa67..d0974fa2329 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -806,6 +806,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; } @@ -818,6 +820,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 646dd70d0b3..446d24a04dd 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -469,7 +469,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(), 0 }), 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()) @@ -1258,13 +1258,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 a3b2fc0192e..edfabcb67b8 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 4f607d64b8c..0e4678bad96 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) |