Index: src/game/Player.cpp =================================================================== --- src/game/Player.cpp (revision 5467) +++ src/game/Player.cpp (working copy) @@ -1878,23 +1878,15 @@ //TODO: exist also swimming mobs, and function must be symmetric to enter/leave water m_isInWater = apply; - // form update - if(apply) + // remove auras that need water/land + uint32 auraInterruptFlag = (apply ? AURA_INTERRUPT_FLAG_NOT_ABOVEWATER : AURA_INTERRUPT_FLAG_NOT_UNDERWATER); + for (AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end(); ) { - // remove travel forms - if(m_form == FORM_TRAVEL || m_form == FORM_GHOSTWOLF) - RemoveAurasDueToSpell(m_ShapeShiftForm); - - // remove mounts, check flight mounts also (flying=swimming in air :D) - if(IsMounted() && !IsFlying()) - RemoveSpellsCausingAura(SPELL_AURA_MOUNTED); + if (iter->second->GetSpellProto()->AuraInterruptFlags & auraInterruptFlag) + RemoveAura(iter); + else + ++iter; } - else - { - // remove aqua form - if(m_form == FORM_AQUA) - RemoveAurasDueToSpell(m_ShapeShiftForm); - } getHostilRefManager().updateThreatTables(); } Index: src/game/Unit.h =================================================================== --- src/game/Unit.h (revision 5467) +++ src/game/Unit.h (working copy) @@ -58,8 +58,12 @@ enum SpellAuraInterruptFlags { - AURA_INTERRUPT_FLAG_DAMAGE = 0x00000002, - AURA_INTERRUPT_FLAG_NOT_SEATED = 0x00040000 + AURA_INTERRUPT_FLAG_DAMAGE = 0x00000002, + AURA_INTERRUPT_FLAG_NOT_MOUNTED = 0x00000040, + AURA_INTERRUPT_FLAG_NOT_ABOVEWATER = 0x00000080, + AURA_INTERRUPT_FLAG_NOT_UNDERWATER = 0x00000100, + AURA_INTERRUPT_FLAG_NOT_SHEATHED = 0x00000200, + AURA_INTERRUPT_FLAG_NOT_SEATED = 0x00040000 }; enum SpellModOp