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
|
|
@ -3599,8 +3599,9 @@ void Spell::EffectDispel(uint32 i)
|
||||||
if (positive == unitTarget->IsFriendlyTo(m_caster))
|
if (positive == unitTarget->IsFriendlyTo(m_caster))
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Add aura to dispel list
|
// Add aura to dispel list (all stack cases)
|
||||||
dispel_list.push_back(aur);
|
for(int k = 0; k < aur->GetStackAmount(); ++k)
|
||||||
|
dispel_list.push_back(aur);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Ok if exist some buffs for dispel try dispel it
|
// Ok if exist some buffs for dispel try dispel it
|
||||||
|
|
@ -3618,7 +3619,10 @@ void Spell::EffectDispel(uint32 i)
|
||||||
for (int32 count=0; count < damage && list_size > 0; ++count)
|
for (int32 count=0; count < damage && list_size > 0; ++count)
|
||||||
{
|
{
|
||||||
// Random select buff for dispel
|
// Random select buff for dispel
|
||||||
Aura *aur = dispel_list[urand(0, list_size-1)];
|
std::vector<Aura*>::iterator dispel_itr = dispel_list.begin();
|
||||||
|
std::advance(dispel_itr,urand(0, list_size-1));
|
||||||
|
|
||||||
|
Aura *aur = *dispel_itr;
|
||||||
|
|
||||||
SpellEntry const* spellInfo = aur->GetSpellProto();
|
SpellEntry const* spellInfo = aur->GetSpellProto();
|
||||||
// Base dispel chance
|
// Base dispel chance
|
||||||
|
|
@ -3632,21 +3636,12 @@ void Spell::EffectDispel(uint32 i)
|
||||||
}
|
}
|
||||||
// Try dispel
|
// Try dispel
|
||||||
if (roll_chance_i(miss_chance))
|
if (roll_chance_i(miss_chance))
|
||||||
fail_list.push_back(aur->GetId());
|
fail_list.push_back(spellInfo->Id);
|
||||||
else
|
else
|
||||||
success_list.push_back(std::pair<uint32,uint64>(aur->GetId(),aur->GetCasterGUID()));
|
success_list.push_back(std::pair<uint32,uint64>(aur->GetId(),aur->GetCasterGUID()));
|
||||||
// Remove buff from list for prevent doubles
|
|
||||||
for (std::vector<Aura *>::iterator j = dispel_list.begin(); j != dispel_list.end(); )
|
// remove entry from dispel_list
|
||||||
{
|
dispel_list.erase(dispel_itr);
|
||||||
Aura *dispeled = *j;
|
|
||||||
if (dispeled->GetId() == aur->GetId() && dispeled->GetCasterGUID() == aur->GetCasterGUID())
|
|
||||||
{
|
|
||||||
j = dispel_list.erase(j);
|
|
||||||
--list_size;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
++j;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Send success log and really remove auras
|
// Send success log and really remove auras
|
||||||
if (!success_list.empty())
|
if (!success_list.empty())
|
||||||
|
|
@ -3655,7 +3650,7 @@ void Spell::EffectDispel(uint32 i)
|
||||||
WorldPacket data(SMSG_SPELLDISPELLOG, 8+8+4+1+4+count*5);
|
WorldPacket data(SMSG_SPELLDISPELLOG, 8+8+4+1+4+count*5);
|
||||||
data.append(unitTarget->GetPackGUID()); // Victim GUID
|
data.append(unitTarget->GetPackGUID()); // Victim GUID
|
||||||
data.append(m_caster->GetPackGUID()); // Caster GUID
|
data.append(m_caster->GetPackGUID()); // Caster GUID
|
||||||
data << uint32(m_spellInfo->Id); // Dispell spell id
|
data << uint32(m_spellInfo->Id); // Dispel spell id
|
||||||
data << uint8(0); // not used
|
data << uint8(0); // not used
|
||||||
data << uint32(count); // count
|
data << uint32(count); // count
|
||||||
for (std::list<std::pair<uint32,uint64> >::iterator j = success_list.begin(); j != success_list.end(); ++j)
|
for (std::list<std::pair<uint32,uint64> >::iterator j = success_list.begin(); j != success_list.end(); ++j)
|
||||||
|
|
@ -3663,7 +3658,7 @@ void Spell::EffectDispel(uint32 i)
|
||||||
SpellEntry const* spellInfo = sSpellStore.LookupEntry(j->first);
|
SpellEntry const* spellInfo = sSpellStore.LookupEntry(j->first);
|
||||||
data << uint32(spellInfo->Id); // Spell Id
|
data << uint32(spellInfo->Id); // Spell Id
|
||||||
data << uint8(0); // 0 - dispeled !=0 cleansed
|
data << uint8(0); // 0 - dispeled !=0 cleansed
|
||||||
unitTarget->RemoveAurasDueToSpellByDispel(spellInfo->Id, j->second, m_caster);
|
unitTarget->RemoveSingleAuraDueToSpellByDispel(spellInfo->Id, j->second, m_caster);
|
||||||
}
|
}
|
||||||
m_caster->SendMessageToSet(&data, true);
|
m_caster->SendMessageToSet(&data, true);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 (Aura* dotAura = GetAura(SPELL_AURA_PERIODIC_DAMAGE,SPELLFAMILY_WARLOCK,UI64LIT(0x010000000000),0x00000000,casterGUID))
|
||||||
if (aur->GetId() == spellId && aur->GetCasterGUID() == casterGUID)
|
|
||||||
{
|
{
|
||||||
// Custom dispel case
|
int32 damage = dotAura->GetModifier()->m_amount*9;
|
||||||
// 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();
|
|
||||||
|
|
||||||
// Remove aura
|
// Remove spell auras from stack
|
||||||
RemoveAura(iter, AURA_REMOVE_BY_DISPEL);
|
RemoveSingleSpellAurasByCasterSpell(spellId, casterGUID, AURA_REMOVE_BY_DISPEL);
|
||||||
|
|
||||||
// backfire damage and silence
|
// backfire damage and silence
|
||||||
dispeler->CastCustomSpell(dispeler, 31117, &damage, NULL, NULL, true, NULL, NULL,caster_guid);
|
dispeler->CastCustomSpell(dispeler, 31117, &damage, NULL, NULL, true, NULL, NULL,casterGUID);
|
||||||
|
|
||||||
iter = m_Auras.begin(); // iterator can be invalidate at cast if self-dispel
|
|
||||||
}
|
|
||||||
else
|
|
||||||
RemoveAura(iter, AURA_REMOVE_BY_DISPEL);
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
++iter;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
RemoveSingleSpellAurasByCasterSpell(spellId, casterGUID, AURA_REMOVE_BY_DISPEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit *stealer)
|
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));
|
AuraMap::iterator iter = m_Auras.find(spellEffectPair(spellId, effindex));
|
||||||
if(iter != m_Auras.end())
|
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))
|
Aura *aur = iter->second;
|
||||||
RemoveAura(iter);
|
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)
|
void Unit::RemoveAurasDueToSpell(uint32 spellId, Aura* except)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1235,31 +1235,42 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
|
||||||
|
|
||||||
bool AddAura(Aura *aur);
|
bool AddAura(Aura *aur);
|
||||||
|
|
||||||
|
// removing specific aura stack
|
||||||
void RemoveAura(Aura* aura, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT);
|
void RemoveAura(Aura* aura, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT);
|
||||||
void RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT);
|
void RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT);
|
||||||
void RemoveAura(uint32 spellId, uint32 effindex, Aura* except = NULL);
|
void RemoveAura(uint32 spellId, uint32 effindex, Aura* except = NULL);
|
||||||
void RemoveSingleSpellAurasFromStack(uint32 spellId);
|
|
||||||
void RemoveSingleAuraFromStack(uint32 spellId, uint32 effindex);
|
// removing specific aura stacks by diff reasons and selections
|
||||||
void RemoveAurasDueToSpell(uint32 spellId, Aura* except = NULL);
|
void RemoveAurasDueToSpell(uint32 spellId, Aura* except = NULL);
|
||||||
void RemoveAurasDueToItemSpell(Item* castItem,uint32 spellId);
|
void RemoveAurasDueToItemSpell(Item* castItem,uint32 spellId);
|
||||||
void RemoveAurasByCasterSpell(uint32 spellId, uint64 casterGUID);
|
void RemoveAurasByCasterSpell(uint32 spellId, uint64 casterGUID);
|
||||||
void RemoveAurasByCasterSpell(uint32 spellId, uint32 effindex, uint64 casterGUID);
|
void RemoveAurasByCasterSpell(uint32 spellId, uint32 effindex, uint64 casterGUID);
|
||||||
void RemoveAurasDueToSpellByDispel(uint32 spellId, uint64 casterGUID, Unit *dispeler);
|
|
||||||
void RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit *stealer);
|
void RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit *stealer);
|
||||||
void RemoveAurasDueToSpellByCancel(uint32 spellId);
|
void RemoveAurasDueToSpellByCancel(uint32 spellId);
|
||||||
void RemoveAurasAtChanneledTarget(SpellEntry const* spellInfo);
|
void RemoveAurasAtChanneledTarget(SpellEntry const* spellInfo);
|
||||||
|
|
||||||
|
// removing unknown aura stacks by diff reasons and selections
|
||||||
void RemoveNotOwnSingleTargetAuras(uint32 newPhase = 0x0);
|
void RemoveNotOwnSingleTargetAuras(uint32 newPhase = 0x0);
|
||||||
void RemoveAurasAtMechanicImmunity(uint32 mechMask, uint32 exceptSpellId, bool non_positive = false);
|
void RemoveAurasAtMechanicImmunity(uint32 mechMask, uint32 exceptSpellId, bool non_positive = false);
|
||||||
|
|
||||||
void RemoveSpellsCausingAura(AuraType auraType);
|
void RemoveSpellsCausingAura(AuraType auraType);
|
||||||
void RemoveRankAurasDueToSpell(uint32 spellId);
|
void RemoveRankAurasDueToSpell(uint32 spellId);
|
||||||
bool RemoveNoStackAurasDueToAura(Aura *Aur);
|
bool RemoveNoStackAurasDueToAura(Aura *Aur);
|
||||||
void RemoveAurasWithInterruptFlags(uint32 flags);
|
void RemoveAurasWithInterruptFlags(uint32 flags);
|
||||||
void RemoveAurasWithDispelType( DispelType type );
|
void RemoveAurasWithDispelType( DispelType type );
|
||||||
|
|
||||||
void RemoveAllAuras(AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT);
|
void RemoveAllAuras(AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT);
|
||||||
void RemoveArenaAuras(bool onleave = false);
|
void RemoveArenaAuras(bool onleave = false);
|
||||||
void RemoveAllAurasOnDeath();
|
void RemoveAllAurasOnDeath();
|
||||||
|
|
||||||
|
// removing specific aura FROM stack
|
||||||
|
void RemoveSingleAuraFromStack(uint32 spellId, uint32 effindex, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT);
|
||||||
|
void RemoveSingleAuraFromStack(AuraMap::iterator &i, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT);
|
||||||
|
|
||||||
|
// removing specific aura FROM stack by diff reasons and selections
|
||||||
|
void RemoveSingleSpellAurasFromStack(uint32 spellId, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT);
|
||||||
|
void RemoveSingleSpellAurasByCasterSpell(uint32 spellId, uint64 casterGUID, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT);
|
||||||
|
void RemoveSingleAuraByCasterSpell(uint32 spellId, uint32 effindex, uint64 casterGUID, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT);
|
||||||
|
void RemoveSingleAuraDueToSpellByDispel(uint32 spellId, uint64 casterGUID, Unit *dispeler);
|
||||||
|
|
||||||
void DelayAura(uint32 spellId, uint32 effindex, int32 delaytime);
|
void DelayAura(uint32 spellId, uint32 effindex, int32 delaytime);
|
||||||
|
|
||||||
float GetResistanceBuffMods(SpellSchools school, bool positive) const { return GetFloatValue(positive ? UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+school : UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+school ); }
|
float GetResistanceBuffMods(SpellSchools school, bool positive) const { return GetFloatValue(positive ? UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+school : UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+school ); }
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "8904"
|
#define REVISION_NR "8905"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue