Core/Auras: Fixed SPELLVALUE_AURA_STACK adding incorrect number of stacks on aura refresh

This commit is contained in:
Shauren
2025-03-22 20:20:18 +01:00
parent b954fd23c1
commit 4c605ce621
7 changed files with 18 additions and 21 deletions
+3 -2
View File
@@ -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);
}
+3 -2
View File
@@ -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());
+4 -3
View File
@@ -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();
}
}
@@ -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:
+2 -3
View File
@@ -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())
{
+1 -1
View File
@@ -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;
+2 -10
View File
@@ -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)