Index: src/game/Player.cpp =================================================================== --- src/game/Player.cpp (revision 5136) +++ src/game/Player.cpp (working copy) @@ -13782,17 +13782,20 @@ AuraMap const& auras = GetAuras(); for(AuraMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) { - // skip all auras from spell that apply at cast SPELL_AURA_MOD_SHAPESHIFT or SPELL_AURA_MOD_STEALTH auras. - // or need a shapeshift SpellEntry const *spellInfo = itr->second->GetSpellProto(); + + //skip all auras from spells that are passive or need a shapeshift + if (itr->second->IsPassive() || itr->second->IsRemovedOnShapeLost()) + continue; + uint8 i; + // or apply at cast SPELL_AURA_MOD_SHAPESHIFT or SPELL_AURA_MOD_STEALTH auras for (i = 0; i < 3; i++) if (spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MOD_SHAPESHIFT || - spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MOD_STEALTH || - spellInfo->Stances) + spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MOD_STEALTH) break; - if (i == 3 && !itr->second->IsPassive()) + if (i == 3) { CharacterDatabase.PExecute("DELETE FROM `character_aura` WHERE `guid` = '%u' and `spell` = '%u' and `effect_index`= '%u'",GetGUIDLow(),(uint32)(*itr).second->GetId(), (uint32)(*itr).second->GetEffIndex()); CharacterDatabase.PExecute("INSERT INTO `character_aura` (`guid`,`caster_guid`,`spell`,`effect_index`,`amount`,`maxduration`,`remaintime`,`remaincharges`) " Index: src/game/SpellAuras.cpp =================================================================== --- src/game/SpellAuras.cpp (revision 5136) +++ src/game/SpellAuras.cpp (working copy) @@ -305,7 +305,7 @@ m_procCharges(0), m_spellmod(NULL), m_spellId(spellproto->Id), m_effIndex(eff), m_caster_guid(0), m_target(target), m_timeCla(1000), m_castItemGuid(castItem?castItem->GetGUID():0), m_auraSlot(MAX_AURAS), m_positive(false), m_permanent(false), m_isPeriodic(false), m_isTrigger(false), m_isAreaAura(false), m_isPersistent(false), -m_periodicTimer(0), m_PeriodicEventId(0), m_updated(false), m_removeOnDeath(false),m_fearMoveAngle(0) +m_periodicTimer(0), m_PeriodicEventId(0), m_updated(false), m_removeOnDeath(false),m_fearMoveAngle(0), m_isRemovedOnShapeLost(true) { assert(target); @@ -393,6 +393,9 @@ } else m_procCharges = -1; + + m_isRemovedOnShapeLost = (m_caster_guid==m_target->GetGUID() && m_spellProto->Stances && + !(m_spellProto->AttributesEx2 & 0x80000) && !(m_spellProto->Attributes & 0x10000)); } Aura::~Aura() @@ -3886,7 +3889,7 @@ if(itr->second->state == PLAYERSPELL_REMOVED) continue; if(itr->first==spellId || itr->first==spellId2) continue; SpellEntry const *spellInfo = sSpellStore.LookupEntry(itr->first); - if (!spellInfo || !IsPassiveSpell(itr->first)) continue; + if (!spellInfo || !(spellInfo->Attributes & ((1<<6) | (1<<7)))) continue; if (spellInfo->Stances & (1<CastSpell(m_target, itr->first, true, NULL, this); } @@ -3918,17 +3921,14 @@ Unit::AuraMap& tAuras = m_target->GetAuras(); for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end();) { - // not removed at form lost - if(itr->second->GetModifier()->m_auraname==SPELL_AURA_RETAIN_COMBO_POINTS) + if (itr->second->IsRemovedOnShapeLost()) { - ++itr; - continue; + m_target->RemoveAura(itr); } - - if (itr->second->GetSpellProto()->Stances & uint32(1<RemoveAura(itr); else + { ++itr; + } } } Index: src/game/SpellAuras.h =================================================================== --- src/game/SpellAuras.h (revision 5136) +++ src/game/SpellAuras.h (working copy) @@ -240,6 +240,7 @@ bool IsPassive() const { return m_isPassive; } bool IsPersistent() const { return m_isPersistent; } bool IsDeathPersistent() const { return m_isDeathPersist; } + bool IsRemovedOnShapeLost() const { return m_isRemovedOnShapeLost; } virtual void Update(uint32 diff); void ApplyModifier(bool apply, bool Real = false); @@ -283,6 +284,7 @@ bool m_isPassive; bool m_isPersistent; bool m_isDeathPersist; + bool m_isRemovedOnShapeLost; int32 m_periodicTimer; uint32 m_PeriodicEventId;