aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-01-09 17:48:41 +0100
committerShauren <shauren.trinity@gmail.com>2025-01-09 17:48:41 +0100
commit561b122364525deaee815ad900a78f1323c37776 (patch)
tree162a91f6740c225fa9970ee3aa477af559c352d5 /src
parent97f58a59f13fcf3a8a6675215674fb89b1a136ca (diff)
Core/Spells: Replace MAX_SPELL_EFFECTS loop limits with correct upper bound depending on how many effects the spell has
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp5
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp27
-rw-r--r--src/server/game/Spells/Spell.cpp3
-rw-r--r--src/server/game/Spells/SpellEffects.cpp9
-rw-r--r--src/server/game/Spells/SpellScript.cpp2
6 files changed, 25 insertions, 23 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 269678cf9ba..48ed4643fab 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -3305,13 +3305,14 @@ void Player::RemoveSpell(uint32 spell_id, bool disabled /*= false*/, bool learn_
RemoveOwnedAura(spell_id, GetGUID());
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id, DIFFICULTY_NONE);
+
// remove pet auras
- for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ for (uint8 i = 0; i < spellInfo->GetEffects().size(); ++i)
if (PetAura const* petSpell = sSpellMgr->GetPetAura(spell_id, i))
RemovePetAura(petSpell);
// update free primary prof.points (if not overflow setting, can be in case GM use before .learn prof. learning)
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id, DIFFICULTY_NONE);
if (spellInfo && spellInfo->IsPrimaryProfessionFirstRank())
{
uint32 freeProfs = GetFreePrimaryProfessionPoints()+1;
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 5425afe4bc3..2a474f4a6c4 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -5582,7 +5582,7 @@ void AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick(Unit* target, Unit*
{
CastSpellExtraArgs args(this);
args.SetTriggerFlags(TRIGGERED_FULL_MASK & ~(TRIGGERED_IGNORE_POWER_COST | TRIGGERED_IGNORE_REAGENT_COST));
- for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ for (std::size_t i = 0; i < triggeredSpellInfo->GetEffects().size(); ++i)
args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), GetAmount());
triggerCaster->CastSpell(target, triggerSpellId, args);
TC_LOG_DEBUG("spells.aura.effect", "AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick: Spell {} Trigger {}", GetId(), triggeredSpellInfo->Id);
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 90cb347b578..1fce448a566 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -200,14 +200,14 @@ void AuraApplication::UpdateApplyEffectMask(uint32 newEffMask, bool canHandleNew
}
// update real effects only if they were applied already
- for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ for (std::size_t i = 0; i < GetBase()->GetAuraEffectCount(); ++i)
if (HasEffect(i) && (removeEffMask & (1 << i)))
_HandleEffect(i, false);
_effectsToApply = newEffMask;
if (canHandleNewEffects)
- for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ for (std::size_t i = 0; i < GetBase()->GetAuraEffectCount(); ++i)
if (addEffMask & (1 << i))
_HandleEffect(i, true);
}
@@ -507,6 +507,9 @@ void Aura::_InitEffects(uint32 effMask, Unit* caster, int32 const* baseAmount)
for (SpellEffectInfo const& spellEffectInfo : GetSpellInfo()->GetEffects())
if (effMask & (1 << spellEffectInfo.EffectIndex))
_effects[spellEffectInfo.EffectIndex] = new AuraEffect(this, spellEffectInfo, baseAmount ? baseAmount + spellEffectInfo.EffectIndex : nullptr, caster);
+
+ while (!_effects.back())
+ _effects.pop_back();
}
Aura::~Aura()
@@ -940,9 +943,8 @@ void Aura::RefreshDuration(bool withMods)
m_timeCla = 1 * IN_MILLISECONDS;
// also reset periodic counters
- for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
- if (AuraEffect* aurEff = GetEffect(i))
- aurEff->ResetTicks();
+ for (AuraEffect* aurEff : GetAuraEffects())
+ aurEff->ResetTicks();
}
void Aura::RefreshTimers(bool resetPeriodicTimer)
@@ -962,9 +964,8 @@ void Aura::RefreshTimers(bool resetPeriodicTimer)
RefreshDuration();
Unit* caster = GetCaster();
- for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
- if (AuraEffect* aurEff = GetEffect(i))
- aurEff->CalculatePeriodic(caster, resetPeriodicTimer, false);
+ for (AuraEffect* aurEff : GetAuraEffects())
+ aurEff->CalculatePeriodic(caster, resetPeriodicTimer, false);
}
void Aura::SetCharges(uint8 charges)
@@ -1886,10 +1887,10 @@ uint32 Aura::GetProcEffectMask(AuraApplication* aurApp, ProcEventInfo& eventInfo
// At least one effect has to pass checks to proc aura
uint32 procEffectMask = aurApp->GetEffectMask();
- for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
- if (procEffectMask & (1u << i))
- if ((procEntry->DisableEffectsMask & (1u << i)) || !GetEffect(i)->CheckEffectProc(aurApp, eventInfo))
- procEffectMask &= ~(1u << i);
+ for (AuraEffect const* aurEff : GetAuraEffects())
+ if (procEffectMask & (1u << aurEff->GetEffIndex()))
+ if ((procEntry->DisableEffectsMask & (1u << aurEff->GetEffIndex())) || !aurEff->CheckEffectProc(aurApp, eventInfo))
+ procEffectMask &= ~(1u << aurEff->GetEffIndex());
if (!procEffectMask)
return 0;
@@ -1990,7 +1991,7 @@ void Aura::TriggerProcOnEvent(uint32 procEffectMask, AuraApplication* aurApp, Pr
bool prevented = CallScriptProcHandlers(aurApp, eventInfo);
if (!prevented)
{
- for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ for (std::size_t i = 0; i < GetAuraEffectCount(); ++i)
{
if (!(procEffectMask & (1 << i)))
continue;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 09828f515f5..587c4c0af9b 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -613,8 +613,7 @@ m_spellValue(new SpellValue(m_spellInfo, caster)), _spellEvent(nullptr)
&& !m_spellInfo->HasAttribute(SPELL_ATTR1_NO_REFLECTION) && !m_spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES)
&& !m_spellInfo->IsPassive();
- for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
- m_destTargets[i] = SpellDestination(*m_caster);
+ std::ranges::fill(m_destTargets, SpellDestination(*m_caster));
}
Spell::~Spell()
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 037c2728b6b..4f9951260eb 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -712,13 +712,14 @@ void Spell::EffectTriggerSpell()
args.SetOriginalCaster(originalCaster);
args.OriginalCastId = originalCastId;
args.OriginalCastItemLevel = itemLevel;
- if (!castItemGuid.IsEmpty() && sSpellMgr->AssertSpellInfo(spellEffectInfo->TriggerSpell, caster->GetMap()->GetDifficultyID())->HasAttribute(SPELL_ATTR2_RETAIN_ITEM_CAST))
+ SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(spellEffectInfo->TriggerSpell, caster->GetMap()->GetDifficultyID());
+ if (!castItemGuid.IsEmpty() && spellInfo->HasAttribute(SPELL_ATTR2_RETAIN_ITEM_CAST))
if (Player const* triggeringAuraCaster = Object::ToPlayer(caster))
args.CastItem = triggeringAuraCaster->GetItemByGuid(castItemGuid);
// set basepoints for trigger with value effect
if (spellEffectInfo->Effect == SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE)
- for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ for (std::size_t i = 0; i < spellInfo->GetEffects().size(); ++i)
args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), value);
if (targetCount)
@@ -784,7 +785,7 @@ void Spell::EffectTriggerMissileSpell()
// set basepoints for trigger with value effect
if (effectInfo->Effect == SPELL_EFFECT_TRIGGER_MISSILE_SPELL_WITH_VALUE)
- for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ for (std::size_t i = 0; i < spellInfo->GetEffects().size(); ++i)
args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), damage);
if (targetCount)
@@ -854,7 +855,7 @@ void Spell::EffectForceCast()
CastSpellExtraArgs args(TRIGGERED_FULL_MASK & ~(TRIGGERED_IGNORE_POWER_COST | TRIGGERED_IGNORE_REAGENT_COST));
args.SetTriggeringSpell(this);
if (effectInfo->Effect == SPELL_EFFECT_FORCE_CAST_WITH_VALUE)
- for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ for (std::size_t i = 0; i < spellInfo->GetEffects().size(); ++i)
args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), damage);
unitTarget->CastSpell(m_caster, spellInfo->Id, args);
diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp
index 79087620742..f8eb76085ab 100644
--- a/src/server/game/Spells/SpellScript.cpp
+++ b/src/server/game/Spells/SpellScript.cpp
@@ -118,7 +118,7 @@ uint32 SpellScriptBase::EffectHook::GetAffectedEffectsMask(SpellInfo const* spel
uint32 mask = 0;
if (_effIndex == EFFECT_ALL || _effIndex == EFFECT_FIRST_FOUND)
{
- for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ for (uint8 i = 0; i < spellInfo->GetEffects().size(); ++i)
{
if (_effIndex == EFFECT_FIRST_FOUND && mask)
return mask;