aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp20
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp65
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp22
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h66
-rw-r--r--src/server/game/Server/WorldSession.h24
5 files changed, 138 insertions, 59 deletions
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index 0f98fd2f819..d2dcfcb79e4 100644
--- a/src/server/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
@@ -1357,26 +1357,6 @@ void WorldSession::HandleSetRaidDifficultyOpcode(WorldPacket& recvData)
}
}
-void WorldSession::HandleCancelMountAuraOpcode(WorldPacket& /*recvData*/)
-{
- TC_LOG_DEBUG("network", "WORLD: CMSG_CANCEL_MOUNT_AURA");
-
- //If player is not mounted, so go out :)
- if (!_player->IsMounted()) // not blizz like; no any messages on blizz
- {
- ChatHandler(this).SendSysMessage(LANG_CHAR_NON_MOUNTED);
- return;
- }
-
- if (_player->IsInFlight()) // not blizz like; no any messages on blizz
- {
- ChatHandler(this).SendSysMessage(LANG_YOU_IN_FLIGHT);
- return;
- }
-
- _player->RemoveAurasByType(SPELL_AURA_MOUNTED); // Calls Dismount()
-}
-
void WorldSession::HandleMoveSetCanFlyAckOpcode(WorldPacket& recvData)
{
// fly mode on/off
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index 39a7915eb4f..35c6ae898fb 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -32,6 +32,7 @@
#include "Spell.h"
#include "SpellAuraEffects.h"
#include "SpellMgr.h"
+#include "SpellPackets.h"
#include "Totem.h"
#include "TotemPackets.h"
#include "World.h"
@@ -432,23 +433,15 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
spell->prepare(targets);
}
-void WorldSession::HandleCancelCastOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleCancelCastOpcode(WorldPackets::Spells::CancelCast& cancelCast)
{
- uint32 spellId;
-
- recvPacket.read_skip<uint8>(); // counter, increments with every CANCEL packet, don't use for now
- recvPacket >> spellId;
-
if (_player->IsNonMeleeSpellCast(false))
- _player->InterruptNonMeleeSpells(false, spellId, false);
+ _player->InterruptNonMeleeSpells(false, cancelCast.SpellID, false);
}
-void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleCancelAuraOpcode(WorldPackets::Spells::CancelAura& cancelAura)
{
- uint32 spellId;
- recvPacket >> spellId;
-
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(cancelAura.SpellID);
if (!spellInfo)
return;
@@ -460,7 +453,7 @@ void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket)
if (spellInfo->IsChanneled())
{
if (Spell* curSpell = _player->GetCurrentSpell(CURRENT_CHANNELED_SPELL))
- if (curSpell->m_spellInfo->Id == spellId)
+ if (curSpell->m_spellInfo->Id == cancelAura.SpellID)
_player->InterruptSpell(CURRENT_CHANNELED_SPELL);
return;
}
@@ -472,7 +465,7 @@ void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket)
return;
// maybe should only remove one buff when there are multiple?
- _player->RemoveOwnedAura(spellId, ObjectGuid::Empty, 0, AURA_REMOVE_BY_CANCEL);
+ _player->RemoveOwnedAura(cancelAura.SpellID, ObjectGuid::Empty, 0, AURA_REMOVE_BY_CANCEL);
// If spell being removed is a resource tracker, see if player was tracking both (herbs / minerals) and remove the other
if (sWorld->getBoolConfig(CONFIG_ALLOW_TRACK_BOTH_RESOURCES) && spellInfo->HasAura(SPELL_AURA_TRACK_RESOURCES))
@@ -494,32 +487,26 @@ void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket)
}
}
-void WorldSession::HandlePetCancelAuraOpcode(WorldPacket& recvPacket)
+void WorldSession::HandlePetCancelAuraOpcode(WorldPackets::Spells::PetCancelAura& packet)
{
- ObjectGuid guid;
- uint32 spellId;
-
- recvPacket >> guid;
- recvPacket >> spellId;
-
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(packet.SpellID);
if (!spellInfo)
{
- TC_LOG_ERROR("network", "WORLD: unknown PET spell id %u", spellId);
+ TC_LOG_ERROR("network", "WORLD: unknown PET spell id %u", packet.SpellID);
return;
}
- Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid);
+ Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, packet.PetGUID);
if (!pet)
{
- TC_LOG_ERROR("network", "HandlePetCancelAura: Attempt to cancel an aura for non-existant %s by player '%s'", guid.ToString().c_str(), GetPlayer()->GetName().c_str());
+ TC_LOG_ERROR("network", "HandlePetCancelAura: Attempt to cancel an aura for non-existant %s by player '%s'", packet.PetGUID.ToString().c_str(), GetPlayer()->GetName().c_str());
return;
}
if (pet != GetPlayer()->GetGuardianPet() && pet != GetPlayer()->GetCharmed())
{
- TC_LOG_ERROR("network", "HandlePetCancelAura: %s is not a pet of player '%s'", guid.ToString().c_str(), GetPlayer()->GetName().c_str());
+ TC_LOG_ERROR("network", "HandlePetCancelAura: %s is not a pet of player '%s'", packet.PetGUID.ToString().c_str(), GetPlayer()->GetName().c_str());
return;
}
@@ -529,22 +516,36 @@ void WorldSession::HandlePetCancelAuraOpcode(WorldPacket& recvPacket)
return;
}
- pet->RemoveOwnedAura(spellId, ObjectGuid::Empty, 0, AURA_REMOVE_BY_CANCEL);
+ pet->RemoveOwnedAura(packet.SpellID, ObjectGuid::Empty, 0, AURA_REMOVE_BY_CANCEL);
}
-void WorldSession::HandleCancelGrowthAuraOpcode(WorldPacket& /*recvPacket*/) { }
+void WorldSession::HandleCancelGrowthAuraOpcode(WorldPackets::Spells::CancelGrowthAura& /*cancelGrowthAura*/)
+{
+ _player->RemoveAurasByType(SPELL_AURA_MOD_SCALE, [](AuraApplication const* aurApp)
+ {
+ SpellInfo const* spellInfo = aurApp->GetBase()->GetSpellInfo();
+ return !spellInfo->HasAttribute(SPELL_ATTR0_CANT_CANCEL) && spellInfo->IsPositive() && !spellInfo->IsPassive();
+ });
+}
-void WorldSession::HandleCancelAutoRepeatSpellOpcode(WorldPacket& /*recvPacket*/)
+void WorldSession::HandleCancelMountAuraOpcode(WorldPackets::Spells::CancelMountAura& /*cancelMountAura*/)
+{
+ _player->RemoveAurasByType(SPELL_AURA_MOUNTED, [](AuraApplication const* aurApp)
+ {
+ SpellInfo const* spellInfo = aurApp->GetBase()->GetSpellInfo();
+ return !spellInfo->HasAttribute(SPELL_ATTR0_CANT_CANCEL) && spellInfo->IsPositive() && !spellInfo->IsPassive();
+ });
+}
+
+void WorldSession::HandleCancelAutoRepeatSpellOpcode(WorldPackets::Spells::CancelAutoRepeatSpell& /*cancelAutoRepeatSpell*/)
{
// may be better send SMSG_CANCEL_AUTO_REPEAT?
// cancel and prepare for deleting
_player->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);
}
-void WorldSession::HandleCancelChanneling(WorldPacket& recvData)
+void WorldSession::HandleCancelChanneling(WorldPackets::Spells::CancelChannelling& /*cancelChanneling*/)
{
- recvData.read_skip<uint32>(); // spellid, not used
-
// ignore for remote control state (for player case)
Unit* mover = _player->GetUnitBeingMoved();
if (mover != _player && mover->GetTypeId() == TYPEID_PLAYER)
diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp
index c2df32cda9c..c5ce5c8f412 100644
--- a/src/server/game/Server/Packets/SpellPackets.cpp
+++ b/src/server/game/Server/Packets/SpellPackets.cpp
@@ -20,6 +20,28 @@
#include "Spell.h"
#include "SpellInfo.h"
+void WorldPackets::Spells::CancelCast::Read()
+{
+ _worldPacket >> CastID;
+ _worldPacket >> SpellID;
+}
+
+void WorldPackets::Spells::CancelAura::Read()
+{
+ _worldPacket >> SpellID;
+}
+
+void WorldPackets::Spells::PetCancelAura::Read()
+{
+ _worldPacket >> PetGUID;
+ _worldPacket >> SpellID;
+}
+
+void WorldPackets::Spells::CancelChannelling::Read()
+{
+ _worldPacket >> ChannelSpell;
+}
+
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellMissStatus const& spellMissStatus)
{
data << uint64(spellMissStatus.TargetGUID);
diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h
index 798a816b301..4e8282b12ae 100644
--- a/src/server/game/Server/Packets/SpellPackets.h
+++ b/src/server/game/Server/Packets/SpellPackets.h
@@ -28,6 +28,72 @@ namespace WorldPackets
{
namespace Spells
{
+ class CancelCast final : public ClientPacket
+ {
+ public:
+ CancelCast(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_CAST, std::move(packet)) { }
+
+ void Read() override;
+
+ uint8 CastID = 0;
+ uint32 SpellID = 0;
+ };
+
+ class CancelAura final : public ClientPacket
+ {
+ public:
+ CancelAura(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_AURA, std::move(packet)) { }
+
+ void Read() override;
+
+ uint32 SpellID = 0;
+ };
+
+ class PetCancelAura final : public ClientPacket
+ {
+ public:
+ PetCancelAura(WorldPacket&& packet) : ClientPacket(CMSG_PET_CANCEL_AURA, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid PetGUID;
+ uint32 SpellID = 0;
+ };
+
+ class CancelGrowthAura final : public ClientPacket
+ {
+ public:
+ CancelGrowthAura(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_GROWTH_AURA, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class CancelMountAura final : public ClientPacket
+ {
+ public:
+ CancelMountAura(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_MOUNT_AURA, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class CancelAutoRepeatSpell final : public ClientPacket
+ {
+ public:
+ CancelAutoRepeatSpell(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_AUTO_REPEAT_SPELL, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class CancelChannelling final : public ClientPacket
+ {
+ public:
+ CancelChannelling(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_CHANNELLING, std::move(packet)) { }
+
+ void Read() override;
+
+ uint32 ChannelSpell = 0;
+ };
+
struct SpellMissStatus
{
ObjectGuid TargetGUID;
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 2cbf308a612..c91f6124849 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -147,6 +147,16 @@ namespace WorldPackets
{
class QueryQuestInfo;
}
+ namespace Spells
+ {
+ class CancelCast;
+ class CancelAura;
+ class PetCancelAura;
+ class CancelGrowthAura;
+ class CancelMountAura;
+ class CancelAutoRepeatSpell;
+ class CancelChannelling;
+ }
namespace Totem
{
class TotemDestroyed;
@@ -773,7 +783,6 @@ class TC_GAME_API WorldSession
void HandleItemTextQuery(WorldPacket& recvData);
void HandleMailCreateTextItem(WorldPacket& recvData);
void HandleQueryNextMailTime(WorldPacket& recvData);
- void HandleCancelChanneling(WorldPacket& recvData);
void HandleSplitItemOpcode(WorldPacket& recvPacket);
void HandleSwapInvItemOpcode(WorldPacket& recvPacket);
@@ -801,10 +810,12 @@ class TC_GAME_API WorldSession
void HandleOpenItemOpcode(WorldPacket& recvPacket);
void HandleOpenWrappedItemCallback(uint16 pos, ObjectGuid itemGuid, PreparedQueryResult result);
void HandleCastSpellOpcode(WorldPacket& recvPacket);
- void HandleCancelCastOpcode(WorldPacket& recvPacket);
- void HandleCancelAuraOpcode(WorldPacket& recvPacket);
- void HandleCancelGrowthAuraOpcode(WorldPacket& recvPacket);
- void HandleCancelAutoRepeatSpellOpcode(WorldPacket& recvPacket);
+ void HandleCancelCastOpcode(WorldPackets::Spells::CancelCast& cancelCast);
+ void HandleCancelAuraOpcode(WorldPackets::Spells::CancelAura& cancelAura);
+ void HandleCancelGrowthAuraOpcode(WorldPackets::Spells::CancelGrowthAura& cancelGrowthAura);
+ void HandleCancelMountAuraOpcode(WorldPackets::Spells::CancelMountAura& cancelMountAura);
+ void HandleCancelAutoRepeatSpellOpcode(WorldPackets::Spells::CancelAutoRepeatSpell& cancelAutoRepeatSpell);
+ void HandleCancelChanneling(WorldPackets::Spells::CancelChannelling& cancelChanneling);
void HandleLearnTalentOpcode(WorldPacket& recvPacket);
void HandleLearnPreviewTalents(WorldPacket& recvPacket);
@@ -880,7 +891,7 @@ class TC_GAME_API WorldSession
void HandlePetSetAction(WorldPacket& recvData);
void HandlePetAbandon(WorldPacket& recvData);
void HandlePetRename(WorldPacket& recvData);
- void HandlePetCancelAuraOpcode(WorldPacket& recvPacket);
+ void HandlePetCancelAuraOpcode(WorldPackets::Spells::PetCancelAura& packet);
void HandlePetSpellAutocastOpcode(WorldPacket& recvPacket);
void HandlePetCastSpellOpcode(WorldPacket& recvPacket);
void HandlePetLearnTalent(WorldPacket& recvPacket);
@@ -970,7 +981,6 @@ class TC_GAME_API WorldSession
void HandleAreaSpiritHealerQueryOpcode(WorldPacket& recvData);
void HandleAreaSpiritHealerQueueOpcode(WorldPacket& recvData);
- void HandleCancelMountAuraOpcode(WorldPacket& recvData);
void HandleSelfResOpcode(WorldPacket& recvData);
void HandleComplainOpcode(WorldPacket& recvData);
void HandleRequestPetInfoOpcode(WorldPacket& recvData);