diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index db278d6c0..a780a1e7a 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1690,6 +1690,17 @@ void WorldSession::HandleShowTradeSkill(WorldPackets::Misc::ShowTradeSkill& pack //_player->SendDirectMessage(response.Write()); } +void WorldSession::HandleSetStopConversation(WorldPackets::Misc::SetStopConversation& setStopConversation) +{ + Conversation* conversation = ObjectAccessor::GetConversation(*_player, setStopConversation.ConversationGUID); + if (!conversation) + return; + + // Conversations are private objects owned by the player they play for; only that owner may stop one. + if (conversation->GetPrivateObjectOwner() == _player->GetGUID()) + conversation->Remove(); +} + void WorldSession::HandleRafClaimNextReward(WorldPackets::RaF::RafClaimNextReward& /*packet*/) { //LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_RAF_CLAIMED_ALL); diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index f6ce70450..c23d2416f 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -1069,4 +1069,10 @@ WorldPacket const* WarfrontComplete::Write() return &_worldPacket; } + +void SetStopConversation::Read() +{ + _worldPacket >> ConversationGUID; +} + } diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index d6c46c79c..b1c9bd912 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -1436,6 +1436,15 @@ namespace WorldPackets uint8 Winner = 0; }; + class SetStopConversation final : public ClientPacket + { + public: + explicit SetStopConversation(WorldPacket&& packet) : ClientPacket(CMSG_SET_STOP_CONVERSATION, std::move(packet)) {} + + void Read() override; + + ObjectGuid ConversationGUID; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 5d9f819b2..4be3f1517 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1044,7 +1044,7 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_SET_SELECTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetSelectionOpcode); DEFINE_HANDLER(CMSG_SET_SHEATHED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetSheathedOpcode); DEFINE_HANDLER(CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetSortBagsRightToLeft); - DEFINE_HANDLER(CMSG_SET_STOP_CONVERSATION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_SET_STOP_CONVERSATION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetStopConversation); DEFINE_HANDLER(CMSG_SET_TAXI_BENCHMARK_MODE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetTaxiBenchmark); DEFINE_HANDLER(CMSG_SET_TITLE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetTitleOpcode); DEFINE_HANDLER(CMSG_SET_TRADE_CURRENCY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTradeCurrencyOpcode); @@ -1123,7 +1123,7 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_UNACCEPT_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUnacceptTradeOpcode); DEFINE_HANDLER(CMSG_UNDELETE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharUndeleteOpcode); DEFINE_HANDLER(CMSG_UNLEARN_SKILL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUnlearnSkillOpcode); - DEFINE_HANDLER(CMSG_UNLEARN_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_UNLEARN_SPECIALIZATION, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUnlearnSpecializationOpcode); DEFINE_HANDLER(CMSG_UPDATE_AADC_STATUS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChatUpdateAADCStatus); DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_BANK_TAB_SETTINGS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateBankTabSettings); DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateAccountData); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 747a0440f..19924750d 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -895,6 +895,7 @@ namespace WorldPackets class ConversationCinematicReady; class IslandQueue; class ShowTradeSkill; + class SetStopConversation; } namespace MajorFactions @@ -1229,7 +1230,6 @@ namespace WorldPackets namespace Transmogrification { class TransmogrifyItems; - class UnlearnSpecialization; class TransmogOutfitNew; class TransmogOutfitUpdateInfo; class TransmogOutfitUpdateSituations; @@ -1716,7 +1716,8 @@ public: void HandleConversationCinematicReady(WorldPackets::Misc::ConversationCinematicReady& packet); void HandleIslandQueue(WorldPackets::Misc::IslandQueue& packet); void HandleShowTradeSkill(WorldPackets::Misc::ShowTradeSkill& packet); - + void HandleSetStopConversation(WorldPackets::Misc::SetStopConversation& setStopConversation); + // Inspect void HandleInspectOpcode(WorldPackets::Inspect::Inspect& inspect); void HandleQueryInspectAchievements(WorldPackets::Inspect::QueryInspectAchievements& inspect);