diff options
Diffstat (limited to 'src')
-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 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; |