aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-06-12 18:48:45 +0200
committerShauren <shauren.trinity@gmail.com>2020-06-12 18:48:45 +0200
commitdacb1e58025b69f61a965a78ffbe89c55a61e34b (patch)
treecb068c667cd6f0ce892a01e6f8d1b8be4252c1ed /src/server/game/Handlers
parentf2f4fc921ee8bc8d258d9d9d1fb2c2a57c9857aa (diff)
Core/Spells: Prevent manual cancelling of channelled spells that have SPELL_ATTR0_CANT_CANCEL
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);
}