mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 01:37:00 +00:00
[8905] Dispel work with aura stacks fixes.
* Implement set of remove aura functions for remove single aura from stack. Also some order function declarations for more clear show different aura remove functions. * Change Spell::EffectDispel to dispel single aura instead all similar auras from caster.
This commit is contained in:
parent
d63e4798b2
commit
03e16dd08b
4 changed files with 77 additions and 53 deletions
|
|
@ -3863,34 +3863,27 @@ void Unit::RemoveAurasByCasterSpell(uint32 spellId, uint32 effindex, uint64 cast
|
|||
}
|
||||
}
|
||||
|
||||
void Unit::RemoveAurasDueToSpellByDispel(uint32 spellId, uint64 casterGUID, Unit *dispeler)
|
||||
void Unit::RemoveSingleAuraDueToSpellByDispel(uint32 spellId, uint64 casterGUID, Unit *dispeler)
|
||||
{
|
||||
for (AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end(); )
|
||||
SpellEntry const* spellEntry = sSpellStore.LookupEntry(spellId);
|
||||
|
||||
// Custom dispel case
|
||||
// Unstable Affliction
|
||||
if(spellEntry->SpellFamilyName == SPELLFAMILY_WARLOCK && (spellEntry->SpellFamilyFlags & UI64LIT(0x010000000000)))
|
||||
{
|
||||
Aura *aur = iter->second;
|
||||
if (aur->GetId() == spellId && aur->GetCasterGUID() == casterGUID)
|
||||
if (Aura* dotAura = GetAura(SPELL_AURA_PERIODIC_DAMAGE,SPELLFAMILY_WARLOCK,UI64LIT(0x010000000000),0x00000000,casterGUID))
|
||||
{
|
||||
// Custom dispel case
|
||||
// Unstable Affliction
|
||||
if (aur->GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK && (aur->GetSpellProto()->SpellFamilyFlags & UI64LIT(0x010000000000)))
|
||||
{
|
||||
int32 damage = aur->GetModifier()->m_amount*9;
|
||||
uint64 caster_guid = aur->GetCasterGUID();
|
||||
int32 damage = dotAura->GetModifier()->m_amount*9;
|
||||
|
||||
// Remove aura
|
||||
RemoveAura(iter, AURA_REMOVE_BY_DISPEL);
|
||||
// Remove spell auras from stack
|
||||
RemoveSingleSpellAurasByCasterSpell(spellId, casterGUID, AURA_REMOVE_BY_DISPEL);
|
||||
|
||||
// backfire damage and silence
|
||||
dispeler->CastCustomSpell(dispeler, 31117, &damage, NULL, NULL, true, NULL, NULL,caster_guid);
|
||||
|
||||
iter = m_Auras.begin(); // iterator can be invalidate at cast if self-dispel
|
||||
}
|
||||
else
|
||||
RemoveAura(iter, AURA_REMOVE_BY_DISPEL);
|
||||
// backfire damage and silence
|
||||
dispeler->CastCustomSpell(dispeler, 31117, &damage, NULL, NULL, true, NULL, NULL,casterGUID);
|
||||
}
|
||||
else
|
||||
++iter;
|
||||
}
|
||||
else
|
||||
RemoveSingleSpellAurasByCasterSpell(spellId, casterGUID, AURA_REMOVE_BY_DISPEL);
|
||||
}
|
||||
|
||||
void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit *stealer)
|
||||
|
|
@ -3960,21 +3953,46 @@ void Unit::RemoveAurasWithDispelType( DispelType type )
|
|||
}
|
||||
}
|
||||
|
||||
void Unit::RemoveSingleAuraFromStack(uint32 spellId, uint32 effindex)
|
||||
void Unit::RemoveSingleAuraFromStack(AuraMap::iterator &i, AuraRemoveMode mode)
|
||||
{
|
||||
if (i->second->modStackAmount(-1))
|
||||
RemoveAura(i,mode);
|
||||
}
|
||||
|
||||
|
||||
void Unit::RemoveSingleAuraFromStack(uint32 spellId, uint32 effindex, AuraRemoveMode mode)
|
||||
{
|
||||
AuraMap::iterator iter = m_Auras.find(spellEffectPair(spellId, effindex));
|
||||
if(iter != m_Auras.end())
|
||||
RemoveSingleAuraFromStack(iter,mode);
|
||||
}
|
||||
|
||||
void Unit::RemoveSingleSpellAurasFromStack(uint32 spellId, AuraRemoveMode mode)
|
||||
{
|
||||
for (int i=0; i<3; ++i)
|
||||
RemoveSingleAuraFromStack(spellId, i, mode);
|
||||
}
|
||||
|
||||
void Unit::RemoveSingleSpellAurasByCasterSpell(uint32 spellId, uint64 casterGUID, AuraRemoveMode mode)
|
||||
{
|
||||
for (int i=0; i<3; ++i)
|
||||
RemoveSingleAuraByCasterSpell(spellId, i, casterGUID, mode);
|
||||
}
|
||||
|
||||
void Unit::RemoveSingleAuraByCasterSpell(uint32 spellId, uint32 effindex, uint64 casterGUID, AuraRemoveMode mode)
|
||||
{
|
||||
spellEffectPair spair = spellEffectPair(spellId, effindex);
|
||||
for(AuraMap::iterator iter = m_Auras.lower_bound(spair); iter != m_Auras.upper_bound(spair); ++iter)
|
||||
{
|
||||
if (iter->second->modStackAmount(-1))
|
||||
RemoveAura(iter);
|
||||
Aura *aur = iter->second;
|
||||
if (aur->GetId() == spellId && aur->GetCasterGUID() == casterGUID)
|
||||
{
|
||||
RemoveSingleAuraFromStack(iter,mode);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Unit::RemoveSingleSpellAurasFromStack(uint32 spellId)
|
||||
{
|
||||
for (int i=0; i<3; ++i)
|
||||
RemoveSingleAuraFromStack(spellId, i);
|
||||
}
|
||||
|
||||
void Unit::RemoveAurasDueToSpell(uint32 spellId, Aura* except)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue