aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers')
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index 740f4144d3b..c3ac4582ad4 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -544,13 +544,25 @@ void WorldSession::HandleCancelAutoRepeatSpellOpcode(WorldPackets::Spells::Cance
_player->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);
}
-void WorldSession::HandleCancelChanneling(WorldPackets::Spells::CancelChannelling& /*cancelChanneling*/)
+void WorldSession::HandleCancelChanneling(WorldPackets::Spells::CancelChannelling& cancelChanneling)
{
// ignore for remote control state (for player case)
Unit* mover = _player->GetUnitBeingMoved();
if (mover != _player && mover->GetTypeId() == TYPEID_PLAYER)
return;
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(cancelChanneling.ChannelSpell);
+ if (!spellInfo)
+ return;
+
+ // not allow remove spells with attr SPELL_ATTR0_CANT_CANCEL
+ if (spellInfo->HasAttribute(SPELL_ATTR0_CANT_CANCEL))
+ return;
+
+ Spell* spell = mover->GetCurrentSpell(CURRENT_CHANNELED_SPELL);
+ if (!spell || spell->GetSpellInfo()->Id != spellInfo->Id)
+ return;
+
mover->InterruptSpell(CURRENT_CHANNELED_SPELL);
}