diff options
Diffstat (limited to 'src/server/game/Spells/SpellEffects.cpp')
| -rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index e557501c095..3c7390b54c6 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -46,6 +46,7 @@ #include "Util.h" #include "TemporarySummon.h" #include "GridNotifiers.h" +#include "CellImpl.h" #include "Formulas.h" #include "ScriptMgr.h" #include "SpellHistory.h" @@ -4562,9 +4563,28 @@ void Spell::EffectForceDeselect(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - WorldPacket data(SMSG_CLEAR_TARGET, 8); + float dist = m_caster->GetVisibilityRange(); + + // clear focus + WorldPacket data(SMSG_BREAK_TARGET, m_caster->GetPackGUID().size()); + data << m_caster->GetPackGUID(); + Trinity::MessageDistDelivererToHostile notifierBreak(m_caster, &data, dist); + m_caster->VisitNearbyWorldObject(dist, notifierBreak); + + // and selection + data.Initialize(SMSG_CLEAR_TARGET, 8); data << uint64(m_caster->GetGUID()); - m_caster->SendMessageToSet(&data, true); + Trinity::MessageDistDelivererToHostile notifierClear(m_caster, &data, dist); + m_caster->VisitNearbyWorldObject(dist, notifierClear); + + // we should also force pets to remove us from current target + Unit::AttackerSet attackerSet; + for (Unit::AttackerSet::const_iterator itr = m_caster->getAttackers().begin(); itr != m_caster->getAttackers().end(); ++itr) + if ((*itr)->GetTypeId() == TYPEID_UNIT && !(*itr)->CanHaveThreatList()) + attackerSet.insert(*itr); + + for (Unit::AttackerSet::const_iterator itr = attackerSet.begin(); itr != attackerSet.end(); ++itr) + (*itr)->AttackStop(); } void Spell::EffectSelfResurrect(SpellEffIndex effIndex) |
