*Remove aura type by caster in some cases. New function RemoveAuraTypeByCaster.
--HG-- branch : trunk
This commit is contained in:
+2
-2
@@ -19129,8 +19129,8 @@ void Player::StopCastingBindSight()
|
||||
{
|
||||
if (WorldObject* fTarget = GetFarsightTarget())
|
||||
{
|
||||
if (fTarget->isType(TYPEMASK_PLAYER | TYPEMASK_UNIT))
|
||||
((Unit*)fTarget)->RemoveSpellsCausingAura(SPELL_AURA_BIND_SIGHT);
|
||||
if (fTarget->isType(TYPEMASK_UNIT))
|
||||
((Unit*)fTarget)->RemoveAuraTypeByCaster(SPELL_AURA_BIND_SIGHT, GetGUID());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -914,10 +914,9 @@ class TRINITY_DLL_SPEC Player : public Unit
|
||||
|
||||
void SetViewport(uint64 guid, bool movable);
|
||||
void StopCastingCharm() { Uncharm(); }
|
||||
void StopBindSight();
|
||||
void StopCastingBindSight();
|
||||
WorldObject* GetFarsightTarget() const;
|
||||
void ClearFarsight();
|
||||
void StopCastingBindSight();
|
||||
void SetFarsightTarget(WorldObject* target);
|
||||
// Controls if vision is currently on farsight object, updated in FAR_SIGHT opcode
|
||||
void SetFarsightVision(bool apply) { m_farsightVision = apply; }
|
||||
|
||||
+2
-2
@@ -2141,11 +2141,11 @@ void Spell::cancel()
|
||||
{
|
||||
Unit* unit = m_caster->GetGUID()==(*ihit).targetGUID ? m_caster : ObjectAccessor::GetUnit(*m_caster, ihit->targetGUID);
|
||||
if( unit && unit->isAlive() )
|
||||
unit->RemoveAurasDueToCasterSpell(m_spellInfo->Id, m_caster->GetGUID());
|
||||
unit->RemoveAurasByCasterSpell(m_spellInfo->Id, m_caster->GetGUID());
|
||||
}
|
||||
}
|
||||
|
||||
m_caster->RemoveAurasDueToCasterSpell(m_spellInfo->Id, m_caster->GetGUID());
|
||||
m_caster->RemoveAurasByCasterSpell(m_spellInfo->Id, m_caster->GetGUID());
|
||||
SendChannelUpdate(0);
|
||||
SendInterrupted(0);
|
||||
SendCastResult(SPELL_FAILED_INTERRUPTED);
|
||||
|
||||
@@ -418,7 +418,7 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
|
||||
if( (*i)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK && ((*i)->GetSpellProto()->SpellFamilyFlags & 4) &&
|
||||
(*i)->GetCasterGUID()==m_caster->GetGUID() )
|
||||
{
|
||||
unitTarget->RemoveAurasDueToCasterSpell((*i)->GetId(), m_caster->GetGUID());
|
||||
unitTarget->RemoveAurasByCasterSpell((*i)->GetId(), m_caster->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -2437,7 +2437,7 @@ void Spell::SpellDamageHeal(uint32 /*i*/)
|
||||
}
|
||||
}
|
||||
addhealth += tickheal * tickcount;
|
||||
unitTarget->RemoveAurasDueToCasterSpell(targetAura->GetId(), targetAura->GetCasterGUID());
|
||||
unitTarget->RemoveAurasByCasterSpell(targetAura->GetId(), targetAura->GetCasterGUID());
|
||||
|
||||
//addhealth += tickheal * tickcount;
|
||||
//addhealth = caster->SpellHealingBonus(m_spellInfo, addhealth,HEAL, unitTarget);
|
||||
|
||||
+38
-19
@@ -535,6 +535,26 @@ void Unit::RemoveSpellsCausingAura(AuraType auraType)
|
||||
}
|
||||
}
|
||||
|
||||
void Unit::RemoveAuraTypeByCaster(AuraType auraType, uint64 casterGUID)
|
||||
{
|
||||
if (auraType >= TOTAL_AURAS) return;
|
||||
AuraList::iterator iter, next;
|
||||
for(iter = m_modAuras[auraType].begin(); iter != m_modAuras[auraType].end(); ++iter)
|
||||
{
|
||||
next = iter;
|
||||
++next;
|
||||
|
||||
if (*iter)
|
||||
{
|
||||
RemoveAurasByCasterSpell((*iter)->GetId(), casterGUID);
|
||||
if (!m_modAuras[auraType].empty())
|
||||
next = m_modAuras[auraType].begin();
|
||||
else
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Unit::RemoveAurasWithInterruptFlags(uint32 flag, uint32 except)
|
||||
{
|
||||
if(!(m_interruptMask & flag))
|
||||
@@ -4454,6 +4474,24 @@ void Unit::RemoveAura(uint32 spellId, uint32 effindex, Aura* except)
|
||||
}
|
||||
}
|
||||
|
||||
void Unit::RemoveAurasByCasterSpell(uint32 spellId, uint64 casterGUID)
|
||||
{
|
||||
for(int k = 0; k < 3; ++k)
|
||||
{
|
||||
spellEffectPair spair = spellEffectPair(spellId, k);
|
||||
for (AuraMap::iterator iter = m_Auras.lower_bound(spair); iter != m_Auras.upper_bound(spair);)
|
||||
{
|
||||
if (iter->second->GetCasterGUID() == casterGUID)
|
||||
{
|
||||
RemoveAura(iter);
|
||||
iter = m_Auras.upper_bound(spair); // overwrite by more appropriate
|
||||
}
|
||||
else
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Unit::RemoveAurasDueToSpellByDispel(uint32 spellId, uint64 casterGUID, Unit *dispeler)
|
||||
{
|
||||
for (AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end(); )
|
||||
@@ -4596,25 +4634,6 @@ void Unit::RemoveAurasDueToSpell(uint32 spellId, Aura* except)
|
||||
RemoveAura(spellId,i,except);
|
||||
}
|
||||
|
||||
void Unit::RemoveAurasDueToCasterSpell(uint32 spellId, uint64 guid)
|
||||
{
|
||||
for (int k=0; k < 3; ++k)
|
||||
{
|
||||
spellEffectPair spair = spellEffectPair(spellId, k);
|
||||
for (AuraMap::iterator iter = m_Auras.lower_bound(spair); iter != m_Auras.upper_bound(spair);)
|
||||
{
|
||||
if (iter->second->GetCasterGUID() == guid)
|
||||
{
|
||||
RemoveAura(iter);
|
||||
break;
|
||||
//iter = m_Auras.upper_bound(spair); // overwrite by more appropriate
|
||||
}
|
||||
else
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Unit::RemoveAurasDueToItemSpell(Item* castItem,uint32 spellId)
|
||||
{
|
||||
for (int k=0; k < 3; ++k)
|
||||
|
||||
+2
-1
@@ -1127,7 +1127,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
||||
void RemoveSingleAuraFromStack(uint32 spellId, uint32 effindex);
|
||||
void RemoveAurasDueToSpell(uint32 spellId, Aura* except = NULL);
|
||||
void RemoveAurasDueToItemSpell(Item* castItem,uint32 spellId);
|
||||
void RemoveAurasDueToCasterSpell(uint32 spellId, uint64 guid);
|
||||
void RemoveAurasByCasterSpell(uint32 spellId, uint64 casterGUID);
|
||||
void RemoveAurasDueToSpellByDispel(uint32 spellId, uint64 casterGUID, Unit *dispeler);
|
||||
void RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit *stealer);
|
||||
void RemoveAurasDueToSpellByCancel(uint32 spellId);
|
||||
@@ -1135,6 +1135,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
||||
void RemoveNotOwnSingleTargetAuras();
|
||||
|
||||
void RemoveSpellsCausingAura(AuraType auraType);
|
||||
void RemoveAuraTypeByCaster(AuraType auraType, uint64 casterGUID);
|
||||
void RemoveRankAurasDueToSpell(uint32 spellId);
|
||||
bool RemoveNoStackAurasDueToAura(Aura *Aur);
|
||||
void RemoveAurasWithInterruptFlags(uint32 flags, uint32 except = 0);
|
||||
|
||||
Reference in New Issue
Block a user