*Fix the bug that shapeshift can remove blind.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-05-01 15:36:32 -05:00
parent 4fb815a9b8
commit 5a66774008
5 changed files with 33 additions and 7 deletions
+1 -2
View File
@@ -2434,8 +2434,7 @@ void Aura::HandleAuraModShapeshift(bool apply, bool Real)
case FORM_FLIGHT:
case FORM_MOONKIN:
// remove movement affects
m_target->RemoveSpellsCausingAura(SPELL_AURA_MOD_ROOT);
m_target->RemoveSpellsCausingAura(SPELL_AURA_MOD_DECREASE_SPEED);
m_target->RemoveMovementImpairingAuras();
// and polymorphic affects
if(m_target->IsPolymorphed())
+19 -5
View File
@@ -2145,13 +2145,12 @@ void SpellMgr::LoadSpellCustomAttr()
case SPELL_AURA_OBS_MOD_HEALTH:
mSpellCustomAttr[i] |= SPELL_ATTR_CU_AURA_HOT;
break;
case SPELL_AURA_MOD_POSSESS:
case SPELL_AURA_MOD_CONFUSE:
case SPELL_AURA_MOD_CHARM:
case SPELL_AURA_MOD_FEAR:
case SPELL_AURA_MOD_STUN:
case SPELL_AURA_MOD_ROOT:
mSpellCustomAttr[i] |= SPELL_ATTR_CU_AURA_CC;
mSpellCustomAttr[i] |= SPELL_ATTR_CU_MOVEMENT_IMPAIR;
break;
case SPELL_AURA_MOD_DECREASE_SPEED:
mSpellCustomAttr[i] |= SPELL_ATTR_CU_MOVEMENT_IMPAIR;
break;
default:
break;
@@ -2178,6 +2177,21 @@ void SpellMgr::LoadSpellCustomAttr()
}
}
for(uint32 j = 0; j < 3; ++j)
{
switch(spellInfo->EffectApplyAuraName[j])
{
case SPELL_AURA_MOD_POSSESS:
case SPELL_AURA_MOD_CONFUSE:
case SPELL_AURA_MOD_CHARM:
case SPELL_AURA_MOD_FEAR:
case SPELL_AURA_MOD_STUN:
mSpellCustomAttr[i] |= SPELL_ATTR_CU_AURA_CC;
mSpellCustomAttr[i] &= ~SPELL_ATTR_CU_MOVEMENT_IMPAIR;
break;
}
}
if(spellInfo->SpellVisual == 3879)
mSpellCustomAttr[i] |= SPELL_ATTR_CU_CONE_BACK;
+1
View File
@@ -719,6 +719,7 @@ inline bool IsProfessionSkill(uint32 skill)
#define SPELL_ATTR_CU_LINK_HIT 0x00000800
#define SPELL_ATTR_CU_LINK_AURA 0x00001000
#define SPELL_ATTR_CU_LINK_REMOVE 0x00002000
#define SPELL_ATTR_CU_MOVEMENT_IMPAIR 0x00004000
typedef std::vector<uint32> SpellCustomAttribute;
+11
View File
@@ -503,6 +503,17 @@ void Unit::GetRandomContactPoint( const Unit* obj, float &x, float &y, float &z,
, GetAngle(obj) + (attacker_number ? (M_PI/2 - M_PI * rand_norm()) * (float)attacker_number / combat_reach / 3 : 0));
}
void Unit::RemoveMovementImpairingAuras()
{
for(AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end();)
{
if(spellmgr.GetSpellCustomAttr(iter->second->GetId()) & SPELL_ATTR_CU_MOVEMENT_IMPAIR)
RemoveAura(iter);
else
++iter;
}
}
void Unit::RemoveSpellsCausingAura(AuraType auraType)
{
if (auraType >= TOTAL_AURAS) return;
+1
View File
@@ -1161,6 +1161,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
bool RemoveNoStackAurasDueToAura(Aura *Aur);
void RemoveAurasWithInterruptFlags(uint32 flags, uint32 except = 0);
void RemoveAurasWithDispelType( DispelType type );
void RemoveMovementImpairingAuras();
void RemoveAllAuras();
void RemoveArenaAuras(bool onleave = false);