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);