diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 27 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Spells/SpellScript.cpp | 2 |
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 ad221fa38bf..d651760572c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2943,13 +2943,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 c7c9eb9062c..51fe51088ef 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5523,7 +5523,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 bd31934704c..1ea2ff89e97 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -207,14 +207,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); } @@ -514,6 +514,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() @@ -941,9 +944,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) @@ -963,9 +965,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) @@ -1887,10 +1888,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; @@ -1993,7 +1994,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 2d299e28296..e774abc07a4 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) CleanupTargetList(); - 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 d2c8b9c6c84..9d9463f072c 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -698,13 +698,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) @@ -770,7 +771,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) @@ -840,7 +841,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; |