From d98441695b48e81d2b712f871a5feb3288df79df Mon Sep 17 00:00:00 2001 From: Ovahlord <18347559+Ovahlord@users.noreply.github.com> Date: Fri, 22 Aug 2025 20:42:27 +0200 Subject: [PATCH] Core/Packets: converted CMSG_DISMISS_CRITTER to packet class and moved its handling to SummonInfo API --- .../Creature/SummonInfo/SummonInfo.cpp | 1 + src/server/game/Handlers/PetHandler.cpp | 27 +++++-------------- src/server/game/Server/Packets/PetPackets.cpp | 5 ++++ src/server/game/Server/Packets/PetPackets.h | 10 +++++++ src/server/game/Server/WorldSession.h | 7 ++++- 5 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/server/game/Entities/Creature/SummonInfo/SummonInfo.cpp b/src/server/game/Entities/Creature/SummonInfo/SummonInfo.cpp index c195992b07..64e91769e3 100644 --- a/src/server/game/Entities/Creature/SummonInfo/SummonInfo.cpp +++ b/src/server/game/Entities/Creature/SummonInfo/SummonInfo.cpp @@ -168,6 +168,7 @@ void SummonInfo::HandlePostSummonActions() { summoner->SetMinionGUID(_summonedCreature->GetGUID()); + // Enable player control over the summon if (Player* playerSummoner = summoner->ToPlayer()) { _summonedCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 974c089fe3..2b475830ce 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -15,7 +15,6 @@ * with this program. If not, see . */ -#include "WorldSession.h" #include "CharmInfo.h" #include "Common.h" #include "CreatureAI.h" @@ -27,37 +26,25 @@ #include "ObjectMgr.h" #include "Opcodes.h" #include "Pet.h" -#include "PetPackets.h" #include "PetAI.h" +#include "PetPackets.h" #include "Player.h" #include "Spell.h" #include "SpellHistory.h" #include "SpellInfo.h" #include "SpellMgr.h" +#include "SummonInfo.h" #include "Util.h" #include "WorldPacket.h" +#include "WorldSession.h" -void WorldSession::HandleDismissCritter(WorldPacket& recvData) +void WorldSession::HandleDismissCritter(WorldPackets::Pet::DismissCritter& dismissCritter) { - ObjectGuid guid; - recvData >> guid; - - TC_LOG_DEBUG("network.opcode", "WORLD: Received CMSG_DISMISS_CRITTER for %s", guid.ToString().c_str()); - - Unit* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid); - - if (!pet) - { - TC_LOG_DEBUG("entities.pet", "Vanitypet (%s) does not exist - player '%s' (guid: %u / account: %u) attempted to dismiss it (possibly lagged out)", - guid.ToString().c_str(), GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().GetCounter(), GetAccountId()); + if (dismissCritter.CritterGUID.IsEmpty() || _player->GetCritterGUID() != dismissCritter.CritterGUID) return; - } - if (_player->GetCritterGUID() == pet->GetGUID()) - { - if (pet->GetTypeId() == TYPEID_UNIT && pet->IsSummon()) - pet->ToTempSummon()->UnSummon(); - } + if (SummonInfo* summonInfo = _player->GetSummonInSlot(SummonPropertiesSlot::Critter)) + summonInfo->GetSummonedCreature()->DespawnOrUnsummon(); } void WorldSession::HandlePetAction(WorldPacket& recvData) diff --git a/src/server/game/Server/Packets/PetPackets.cpp b/src/server/game/Server/Packets/PetPackets.cpp index 689f692f2c..b88fe2a2d5 100644 --- a/src/server/game/Server/Packets/PetPackets.cpp +++ b/src/server/game/Server/Packets/PetPackets.cpp @@ -111,3 +111,8 @@ WorldPacket const* WorldPackets::Pet::PetSpells::Write() return &_worldPacket; } + +void WorldPackets::Pet::DismissCritter::Read() +{ + _worldPacket >> CritterGUID; +} diff --git a/src/server/game/Server/Packets/PetPackets.h b/src/server/game/Server/Packets/PetPackets.h index 171854113d..90f78b74b9 100644 --- a/src/server/game/Server/Packets/PetPackets.h +++ b/src/server/game/Server/Packets/PetPackets.h @@ -122,6 +122,16 @@ namespace WorldPackets std::vector Actions; std::vector Cooldowns; }; + + class DismissCritter final : public ClientPacket + { + public: + DismissCritter(WorldPacket&& packet) : ClientPacket(CMSG_DISMISS_CRITTER, std::move(packet)) { } + + void Read() override; + + ObjectGuid CritterGUID; + }; } } diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 60bff9c95f..6bef844522 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -193,6 +193,11 @@ namespace WorldPackets class TrainerBuySpell; } + namespace Pet + { + class DismissCritter; + } + namespace Party { class SetEveryoneIsAssistant; @@ -1075,7 +1080,7 @@ class TC_GAME_API WorldSession void HandleSetActionBarToggles(WorldPacket& recvData); void HandleTotemDestroyed(WorldPackets::Totem::TotemDestroyed& packet); - void HandleDismissCritter(WorldPacket& recvData); + void HandleDismissCritter(WorldPackets::Pet::DismissCritter& packet); //Battleground void HandleBattlemasterHelloOpcode(WorldPacket& recvData);