[10199] Fix 33763 and ranks final heal and mana return on dispel and on expire

This commit is contained in:
Laise 2010-07-16 21:34:05 +03:00
parent 2284df7868
commit ae51168ffc
6 changed files with 54 additions and 34 deletions

View file

@ -597,8 +597,7 @@ void Spell::EffectSchoolDMG(SpellEffectIndex effect_idx)
}
if (needConsume)
for (uint32 i = 0; i < doses; ++i)
unitTarget->RemoveSingleAuraHolderFromStack(spellId, m_caster->GetGUID());
unitTarget->RemoveAuraHolderFromStack(spellId, doses, m_caster->GetGUID());
damage *= doses;
damage += int32(((Player*)m_caster)->GetTotalAttackPowerValue(BASE_ATTACK) * 0.09f * doses);
@ -4073,7 +4072,7 @@ void Spell::EffectDispel(SpellEffectIndex eff_idx)
// Ok if exist some buffs for dispel try dispel it
if (!dispel_list.empty())
{
std::list < std::pair<uint32,uint64> > success_list;// (spell_id,casterGuid)
std::list<std::pair<SpellAuraHolder* ,uint32> > success_list;// (spell_id,casterGuid)
std::list < uint32 > fail_list; // spell_id
// some spells have effect value = 0 and all from its by meaning expect 1
@ -4109,7 +4108,20 @@ void Spell::EffectDispel(SpellEffectIndex eff_idx)
if (roll_chance_i(miss_chance))
fail_list.push_back(spellInfo->Id);
else
success_list.push_back(std::pair<uint32,uint64>(holder->GetId(),holder->GetCasterGUID()));
{
bool foundDispelled = false;
for (std::list<std::pair<SpellAuraHolder* ,uint32> >::iterator success_iter = success_list.begin(); success_iter != success_list.end(); ++success_iter)
{
if (success_iter->first->GetId() == holder->GetId() && success_iter->first->GetCasterGUID() == holder->GetCasterGUID())
{
success_iter->second += 1;
foundDispelled = true;
break;
}
}
if (!foundDispelled)
success_list.push_back(std::pair<SpellAuraHolder* ,uint32>(holder, 1));
}
}
// Send success log and really remove auras
if (!success_list.empty())
@ -4121,12 +4133,12 @@ void Spell::EffectDispel(SpellEffectIndex eff_idx)
data << uint32(m_spellInfo->Id); // Dispel spell id
data << uint8(0); // not used
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<SpellAuraHolder* ,uint32> >::iterator j = success_list.begin(); j != success_list.end(); ++j)
{
SpellEntry const* spellInfo = sSpellStore.LookupEntry(j->first);
data << uint32(spellInfo->Id); // Spell Id
SpellAuraHolder* dispelledHolder = j->first;
data << uint32(dispelledHolder->GetId()); // Spell Id
data << uint8(0); // 0 - dispeled !=0 cleansed
unitTarget->RemoveSingleAuraHolderDueToSpellByDispel(spellInfo->Id, j->second, m_caster);
unitTarget->RemoveAuraHolderDueToSpellByDispel(dispelledHolder->GetId(), j->second, dispelledHolder->GetCasterGUID(), m_caster);
}
m_caster->SendMessageToSet(&data, true);
@ -5434,7 +5446,7 @@ void Spell::EffectScriptEffect(SpellEffectIndex eff_idx)
return;
}
case 24590: // Brittle Armor - need remove one 24575 Brittle Armor aura
unitTarget->RemoveSingleAuraHolderFromStack(24575);
unitTarget->RemoveAuraHolderFromStack(24575);
return;
case 26275: // PX-238 Winter Wondervolt TRAP
{
@ -5453,7 +5465,7 @@ void Spell::EffectScriptEffect(SpellEffectIndex eff_idx)
return;
}
case 26465: // Mercurial Shield - need remove one 26464 Mercurial Shield aura
unitTarget->RemoveSingleAuraHolderFromStack(26464);
unitTarget->RemoveAuraHolderFromStack(26464);
return;
case 25140: // Orb teleport spells
case 25143: