diff --git a/src/game/Server/Opcodes.cpp b/src/game/Server/Opcodes.cpp index 8cbd56ff6..b199c7786 100644 --- a/src/game/Server/Opcodes.cpp +++ b/src/game/Server/Opcodes.cpp @@ -1252,7 +1252,7 @@ void InitializeOpcodes() //OPCODE(CMSG_REMOVE_GLYPH, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRemoveGlyphOpcode ); //OPCODE(CMSG_DUMP_OBJECTS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //OPCODE(SMSG_DUMP_OBJECTS_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - OPCODE(CMSG_DISMISS_CRITTER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + OPCODE(CMSG_DISMISS_CRITTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDismissCritter); //OPCODE(SMSG_NOTIFY_DEST_LOC_SPELL_CAST, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); OPCODE(CMSG_AUCTION_LIST_PENDING_SALES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionListPendingSales ); OPCODE(SMSG_AUCTION_LIST_PENDING_SALES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); diff --git a/src/game/Server/Opcodes.h b/src/game/Server/Opcodes.h index 449bcebd3..c86c1afee 100644 --- a/src/game/Server/Opcodes.h +++ b/src/game/Server/Opcodes.h @@ -1236,7 +1236,7 @@ enum Opcodes CMSG_REMOVE_GLYPH = 0x0000, CMSG_DUMP_OBJECTS = 0x0000, SMSG_DUMP_OBJECTS_DATA = 0x0000, - CMSG_DISMISS_CRITTER = 0x0000, + CMSG_DISMISS_CRITTER = 0x4227, // 4.3.4 15595 SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x0000, CMSG_AUCTION_LIST_PENDING_SALES = 0x2C17, // 4.3.4 15595 SMSG_AUCTION_LIST_PENDING_SALES = 0x6A27, // 4.3.4 15595 diff --git a/src/game/Server/WorldSession.h b/src/game/Server/WorldSession.h index 66db9ded7..1c7f0935d 100644 --- a/src/game/Server/WorldSession.h +++ b/src/game/Server/WorldSession.h @@ -766,6 +766,7 @@ class WorldSession void HandlePetCastSpellOpcode(WorldPacket& recvPacket); void HandlePetLearnTalent(WorldPacket& recvPacket); void HandleLearnPreviewTalentsPet(WorldPacket& recvPacket); + void HandleDismissCritter(WorldPacket& recvData); void HandleSetActionBarTogglesOpcode(WorldPacket& recv_data); diff --git a/src/game/WorldHandlers/PetHandler.cpp b/src/game/WorldHandlers/PetHandler.cpp index ce5eaeaac..02bb7c439 100644 --- a/src/game/WorldHandlers/PetHandler.cpp +++ b/src/game/WorldHandlers/PetHandler.cpp @@ -768,3 +768,24 @@ void WorldSession::HandleLearnPreviewTalentsPet(WorldPacket& recv_data) _player->SendTalentsInfoData(true); } + +void WorldSession::HandleDismissCritter(WorldPacket& recvData) +{ + ObjectGuid guid; + recvData >> guid; + + DEBUG_LOG("WORLD: Received CMSG_DISMISS_CRITTER for %s", guid.GetString().c_str()); + Unit* pet = _player->GetMap()->GetAnyTypeCreature(guid); + if (!pet) + { + DEBUG_LOG("Vanitypet %s does not exist - Player %s (guid %u, account: %u) attempted to dismiss it (possibly lagged out)", + guid.GetString().c_str(), GetPlayer()->GetName(), GetPlayer()->GetGUIDLow(), GetAccountId()); + return; + } + + if (_player->GetCritterGuid() == guid) + { + if (pet->GetTypeId() == TYPEID_UNIT && ((Creature*)pet)->IsTemporarySummon()) + ((TemporarySummon*)pet)->UnSummon(); + } +} \ No newline at end of file