aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/SpellEffects.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Spells/SpellEffects.cpp')
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp32
1 files changed, 21 insertions, 11 deletions
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index fb78807d15f..6c9bfba4953 100755
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -1363,7 +1363,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex)
}
//Any effect which causes you to lose control of your character will supress the starfall effect.
- if (m_caster->HasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_FLEEING | UNIT_STAT_ROOT | UNIT_STAT_CONFUSED))
+ if (m_caster->HasUnitState(UNIT_STAT_CONTROLLED))
return;
m_caster->CastSpell(unitTarget, damage, true);
@@ -3224,7 +3224,7 @@ void Spell::EffectDispel(SpellEffIndex effIndex)
// Ok if exist some buffs for dispel try dispel it
uint32 failCount = 0;
- DispelList success_list;
+ DispelChargesList success_list;
WorldPacket dataFail(SMSG_DISPEL_FAILED, 8+8+4+4+damage*4);
// dispel N = damage buffs (or while exist buffs for dispel)
for (int32 count = 0; count < damage && !dispel_list.empty();)
@@ -3244,7 +3244,17 @@ void Spell::EffectDispel(SpellEffIndex effIndex)
{
if (success)
{
- success_list.push_back(std::make_pair(itr->first->GetId(), itr->first->GetCasterGUID()));
+ bool alreadyListed = false;
+ for (DispelChargesList::iterator successItr = success_list.begin(); successItr != success_list.end(); ++successItr)
+ {
+ if (successItr->first->GetId() == itr->first->GetId())
+ {
+ ++successItr->second;
+ alreadyListed = true;
+ }
+ }
+ if (!alreadyListed)
+ success_list.push_back(std::make_pair(itr->first, 1));
--itr->second;
if (itr->second <= 0)
dispel_list.erase(itr);
@@ -3271,19 +3281,19 @@ void Spell::EffectDispel(SpellEffIndex effIndex)
if (success_list.empty())
return;
- WorldPacket dataSuccess(SMSG_SPELLDISPELLOG, 8+8+4+1+4+damage*5);
+ WorldPacket dataSuccess(SMSG_SPELLDISPELLOG, 8+8+4+1+4+success_list.size()*5);
// Send packet header
dataSuccess.append(unitTarget->GetPackGUID()); // Victim GUID
dataSuccess.append(m_caster->GetPackGUID()); // Caster GUID
dataSuccess << uint32(m_spellInfo->Id); // dispel spell id
dataSuccess << uint8(0); // not used
dataSuccess << uint32(success_list.size()); // count
- for (DispelList::iterator itr = success_list.begin(); itr != success_list.end(); ++itr)
+ for (DispelChargesList::iterator itr = success_list.begin(); itr != success_list.end(); ++itr)
{
// Send dispelled spell info
- dataSuccess << uint32(itr->first); // Spell Id
+ dataSuccess << uint32(itr->first->GetId()); // Spell Id
dataSuccess << uint8(0); // 0 - dispelled !=0 cleansed
- unitTarget->RemoveAurasDueToSpellByDispel(itr->first, itr->second, m_caster);
+ unitTarget->RemoveAurasDueToSpellByDispel(itr->first->GetId(), itr->first->GetCasterGUID(), m_caster, itr->second);
}
m_caster->SendMessageToSet(&dataSuccess, true);
@@ -6064,10 +6074,6 @@ void Spell::EffectKnockBack(SpellEffIndex effIndex)
if (!unitTarget)
return;
- // Instantly interrupt non melee spells being casted
- if (unitTarget->IsNonMeleeSpellCasted(true))
- unitTarget->InterruptNonMeleeSpells(true);
-
// Typhoon
if (m_spellInfo->SpellFamilyName == SPELLFAMILY_DRUID && m_spellInfo->SpellFamilyFlags[1] & 0x01000000)
{
@@ -6084,6 +6090,10 @@ void Spell::EffectKnockBack(SpellEffIndex effIndex)
return;
}
+ // Instantly interrupt non melee spells being casted
+ if (unitTarget->IsNonMeleeSpellCasted(true))
+ unitTarget->InterruptNonMeleeSpells(true);
+
float ratio = m_caster->GetCombatReach() / std::max(unitTarget->GetCombatReach(), 1.0f);
if (ratio < 1.0f)
ratio = ratio * ratio * ratio * 0.1f; // volume = length^3