From 92e95ddf558db5fdcdf3c54ecd1d694da92c3a44 Mon Sep 17 00:00:00 2001 From: xinef1 Date: Sat, 4 Feb 2017 20:21:12 +0100 Subject: Core/Spells: Fixed spell effect 93 (SPELL_EFFECT_FORCE_DESELECT) (#19001) (cherrypicked from 9e1b286984c63b801561a67dd4eae7910ec1af10) --- src/server/game/Spells/SpellEffects.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'src/server/game/Spells/SpellEffects.cpp') diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 9a93e2358a5..2abc32d1619 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -22,6 +22,7 @@ #include "Battleground.h" #include "BattlegroundMgr.h" #include "BattlePetMgr.h" +#include "CellImpl.h" #include "CombatLogPackets.h" #include "CombatPackets.h" #include "Common.h" @@ -36,6 +37,7 @@ #include "GameObjectAI.h" #include "Garrison.h" #include "GossipDef.h" +#include "GridNotifiers.h" #include "Group.h" #include "Guild.h" #include "InstanceScript.h" @@ -4089,9 +4091,28 @@ void Spell::EffectForceDeselect(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; + float dist = m_caster->GetVisibilityRange(); + + // clear focus + WorldPackets::Combat::BreakTarget breakTarget; + breakTarget.UnitGUID = m_caster->GetGUID(); + Trinity::MessageDistDelivererToHostile notifierBreak(m_caster, breakTarget.Write(), dist); + Cell::VisitWorldObjects(m_caster, notifierBreak, dist); + + // and selection WorldPackets::Spells::ClearTarget clearTarget; clearTarget.Guid = m_caster->GetGUID(); - m_caster->SendMessageToSet(clearTarget.Write(), true); + Trinity::MessageDistDelivererToHostile notifierClear(m_caster, clearTarget.Write(), dist); + Cell::VisitWorldObjects(m_caster, notifierClear, dist); + + // 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*/) -- cgit v1.2.3