diff options
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 20 | ||||
-rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 65 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 66 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 24 |
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); |