Core/Auras: Fixed SPELLVALUE_AURA_STACK adding incorrect number of stacks on aura refresh
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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())
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user