aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorGiuseppe Montesanto <montesanto.giuseppe@live.it>2012-02-05 21:22:01 +0100
committerGiuseppe Montesanto <montesanto.giuseppe@live.it>2012-02-05 21:22:01 +0100
commit9a3a6c76419e4e21e29b6ac45ca6452073a18764 (patch)
tree38883b8e62ef5cb9c5b971a5d3de378f5facdeed /src/server/game/Entities
parent5019e9d353793691d0684f249d04cce511e85e84 (diff)
Fix a bug introdouced in recent commit.
Diffstat (limited to 'src/server/game/Entities')
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp21
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.h4
2 files changed, 15 insertions, 10 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 96e8978ed33..945b239c5dd 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -516,22 +516,27 @@ bool Unit::HasAuraTypeWithFamilyFlags(AuraType auraType, uint32 familyName, uint
return false;
}
-bool Unit::HasBreakableByDamageAuraType(AuraType type) const
+bool Unit::HasBreakableByDamageAuraType(AuraType type, uint32 excludeAura) const
{
AuraEffectList const& auras = GetAuraEffectsByType(type);
for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
- if ((*itr)->GetSpellInfo()->Attributes & SPELL_ATTR0_BREAKABLE_BY_DAMAGE || (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE)
+ if ((!excludeAura || excludeAura != (*itr)->GetSpellInfo()->Id) && //Avoid self interrupt of channeled Crowd Control spells like Seduction
+ ((*itr)->GetSpellInfo()->Attributes & SPELL_ATTR0_BREAKABLE_BY_DAMAGE || (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE))
return true;
return false;
}
-bool Unit::HasBreakableByDamageCrowdControlAura() const
+bool Unit::HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel) const
{
- return ( HasBreakableByDamageAuraType(SPELL_AURA_MOD_CONFUSE)
- || HasBreakableByDamageAuraType(SPELL_AURA_MOD_FEAR)
- || HasBreakableByDamageAuraType(SPELL_AURA_MOD_STUN)
- || HasBreakableByDamageAuraType(SPELL_AURA_MOD_ROOT)
- || HasBreakableByDamageAuraType(SPELL_AURA_TRANSFORM));
+ uint32 excludeAura = 0;
+ if (Spell* currentChanneledSpell = excludeCasterChannel ? excludeCasterChannel->GetCurrentSpell(CURRENT_CHANNELED_SPELL) : NULL)
+ excludeAura = currentChanneledSpell->GetSpellInfo()->Id; //Avoid self interrupt of channeled Crowd Control spells like Seduction
+
+ return ( HasBreakableByDamageAuraType(SPELL_AURA_MOD_CONFUSE, excludeAura)
+ || HasBreakableByDamageAuraType(SPELL_AURA_MOD_FEAR, excludeAura)
+ || HasBreakableByDamageAuraType(SPELL_AURA_MOD_STUN, excludeAura)
+ || HasBreakableByDamageAuraType(SPELL_AURA_MOD_ROOT, excludeAura)
+ || HasBreakableByDamageAuraType(SPELL_AURA_TRANSFORM, excludeAura));
}
void Unit::DealDamageMods(Unit* victim, uint32 &damage, uint32* absorb)
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index abcdf13c49b..423f83844d3 100755
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1555,8 +1555,8 @@ class Unit : public WorldObject
bool HasAuraTypeWithFamilyFlags(AuraType auraType, uint32 familyName, uint32 familyFlags) const;
bool virtual HasSpell(uint32 /*spellID*/) const { return false; }
- bool HasBreakableByDamageAuraType(AuraType type) const;
- bool HasBreakableByDamageCrowdControlAura() const;
+ bool HasBreakableByDamageAuraType(AuraType type, uint32 excludeAura = 0) const;
+ bool HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel = NULL) const;
bool HasStealthAura() const { return HasAuraType(SPELL_AURA_MOD_STEALTH); }
bool HasInvisibilityAura() const { return HasAuraType(SPELL_AURA_MOD_INVISIBILITY); }