From 77c017555b5c312c5675339fd5833b0fecffbf14 Mon Sep 17 00:00:00 2001 From: Shauren Date: Wed, 18 Oct 2023 21:43:46 +0200 Subject: [PATCH] Core/Auras: Registering a new owned aura will now search existing owned auras instead of applied auras to check for unstackable one --- src/server/game/Entities/Unit/Unit.cpp | 27 +++++++------------------- src/server/game/Entities/Unit/Unit.h | 2 +- 2 files changed, 8 insertions(+), 21 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index ae0da6495e..2b73b196c5 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3042,7 +3042,7 @@ void Unit::_AddAura(UnitAura* aura, Unit* caster) ASSERT(!m_cleanupDone); m_ownedAuras.emplace(aura->GetId(), aura); - _RemoveNoStackAurasDueToAura(aura); + _RemoveNoStackAurasDueToAura(aura, true); if (aura->IsRemoved()) return; @@ -3136,7 +3136,7 @@ void Unit::_ApplyAura(AuraApplication* aurApp, uint8 effMask) { Aura* aura = aurApp->GetBase(); - _RemoveNoStackAurasDueToAura(aura); + _RemoveNoStackAurasDueToAura(aura, false); if (aurApp->GetRemoveMode().HasAnyFlag()) return; @@ -3283,7 +3283,7 @@ void Unit::_UnapplyAura(AuraApplication* aurApp, AuraRemoveFlags removeMode) ABORT(); } -void Unit::_RemoveNoStackAurasDueToAura(Aura* aura) +void Unit::_RemoveNoStackAurasDueToAura(Aura* aura, bool owned) { SpellInfo const* spellProto = aura->GetSpellInfo(); @@ -3297,23 +3297,10 @@ void Unit::_RemoveNoStackAurasDueToAura(Aura* aura) return; } - bool remove = false; - for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i) - { - if (remove) - { - remove = false; - i = m_appliedAuras.begin(); - } - - if (aura->CanStackWith(i->second->GetBase())) - continue; - - RemoveAura(i, AuraRemoveFlags::ByDefault); - if (i == m_appliedAuras.end()) - break; - remove = true; - } + if (owned) + RemoveOwnedAuras([aura](Aura const* ownedAura) { return !aura->CanStackWith(ownedAura); }, AuraRemoveFlags::ByDefault); + else + RemoveAppliedAuras([aura](AuraApplication const* appliedAura) { return !aura->CanStackWith(appliedAura->GetBase()); }, AuraRemoveFlags::ByDefault); } void Unit::_RegisterAuraEffect(AuraEffect* aurEff, bool apply) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 40886c0943..7592ae0bc8 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1283,7 +1283,7 @@ class TC_GAME_API Unit : public WorldObject void _ApplyAura(AuraApplication* aurApp, uint8 effMask); void _UnapplyAura(AuraApplicationMap::iterator& i, AuraRemoveFlags removeMode); void _UnapplyAura(AuraApplication* aurApp, AuraRemoveFlags removeMode); - void _RemoveNoStackAurasDueToAura(Aura* aura); + void _RemoveNoStackAurasDueToAura(Aura* aura, bool owned); void _RegisterAuraEffect(AuraEffect* aurEff, bool apply); // m_ownedAuras container management