aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-03-22 20:20:18 +0100
committerOvahlord <dreadkiller@gmx.de>2025-04-06 19:35:36 +0200
commitce106b59f66b22a5d5fc45462466fe91b494db0e (patch)
treebf90c58a9ebed697a70ecfb1998f26071a81f530 /src
parent528f8e3332e13a451df8bcc198eeec7b2bec8d86 (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.cpp5
-rw-r--r--src/server/game/Entities/Player/Player.cpp5
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp7
-rw-r--r--src/server/game/Spells/Auras/SpellAuraDefines.h3
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp5
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h2
-rw-r--r--src/server/game/Spells/Spell.cpp12
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)