diff --git a/src/game/AggressorAI.cpp b/src/game/AggressorAI.cpp index 7ad080281ea..82292723afa 100644 --- a/src/game/AggressorAI.cpp +++ b/src/game/AggressorAI.cpp @@ -106,7 +106,7 @@ void AggressorAI::EnterEvadeMode() if (!m_creature->isCharmed()) { - m_creature->RemoveAllAuras(); + m_creature->RemoveAllAurasOnEvade(); // Remove ChaseMovementGenerator from MotionMaster stack list, and add HomeMovementGenerator instead if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) diff --git a/src/game/CreatureEventAI.cpp b/src/game/CreatureEventAI.cpp index 62c88d1f629..d3549cf4e24 100644 --- a/src/game/CreatureEventAI.cpp +++ b/src/game/CreatureEventAI.cpp @@ -909,7 +909,7 @@ void CreatureEventAI::JustReachedHome() void CreatureEventAI::EnterEvadeMode() { - m_creature->RemoveAllAuras(); + m_creature->RemoveAllAurasOnEvade(); m_creature->DeleteThreatList(); m_creature->CombatStop(true); diff --git a/src/game/GuardAI.cpp b/src/game/GuardAI.cpp index 4f62de8cc83..3f17d75dfb6 100644 --- a/src/game/GuardAI.cpp +++ b/src/game/GuardAI.cpp @@ -93,7 +93,7 @@ void GuardAI::EnterEvadeMode() DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "Creature stopped attacking, victim out run him [guid=%u]", m_creature->GetGUIDLow()); } - m_creature->RemoveAllAuras(); + m_creature->RemoveAllAurasOnEvade(); m_creature->DeleteThreatList(); i_victimGuid.Clear(); m_creature->CombatStop(true); diff --git a/src/game/ReactorAI.cpp b/src/game/ReactorAI.cpp index f6d93c33460..c41a7c81434 100644 --- a/src/game/ReactorAI.cpp +++ b/src/game/ReactorAI.cpp @@ -109,7 +109,7 @@ ReactorAI::EnterEvadeMode() DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "Creature stopped attacking, victim %s [guid=%u]", victim->isAlive() ? "out run him" : "is dead", m_creature->GetGUIDLow()); } - m_creature->RemoveAllAuras(); + m_creature->RemoveAllAurasOnEvade(); m_creature->DeleteThreatList(); i_victimGuid.Clear(); m_creature->CombatStop(true); diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 8a01824b9ee..e9f9bcc8486 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -4981,6 +4981,23 @@ void Unit::RemoveAllAurasOnDeath() } } +void Unit::RemoveAllAurasOnEvade() +{ + // used when evading to remove all auras except some special auras + // Vehicle control auras should not be removed on evade - neither should linked auras + for (SpellAuraHolderMap::iterator iter = m_spellAuraHolders.begin(); iter != m_spellAuraHolders.end();) + { + SpellEntry const* proto = iter->second->GetSpellProto(); + if (!IsSpellHaveAura(proto, SPELL_AURA_CONTROL_VEHICLE)) + { + RemoveSpellAuraHolder(iter->second, AURA_REMOVE_BY_DEFAULT); + iter = m_spellAuraHolders.begin(); + } + else + ++iter; + } +} + void Unit::DelaySpellAuraHolder(uint32 spellId, int32 delaytime, ObjectGuid casterGuid) { SpellAuraHolderBounds bounds = GetSpellAuraHolderBounds(spellId); diff --git a/src/game/Unit.h b/src/game/Unit.h index 526b8285769..9ccaafdd5d1 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1560,6 +1560,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject void RemoveAllAuras(AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT); void RemoveArenaAuras(bool onleave = false); void RemoveAllAurasOnDeath(); + void RemoveAllAurasOnEvade(); // removing specific aura FROM stack by diff reasons and selections void RemoveAuraHolderFromStack(uint32 spellId, uint32 stackAmount = 1, ObjectGuid casterGuid = ObjectGuid(), AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 54a9b9d30f9..7e0d6df35d2 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "12315" + #define REVISION_NR "12316" #endif // __REVISION_NR_H__