diff --git a/CMakeLists.txt b/CMakeLists.txt index ec259971..a914153d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,4 +32,4 @@ include_directories(PUBLIC ${CMAKE_SOURCE_DIR}/ExternalLibraries) add_subdirectory(Common) add_subdirectory(AuthServer) add_subdirectory(CastServer) -add_subdirectory(MainServer) +add_subdirectory(MainServer) \ No newline at end of file diff --git a/MainServer/include/Handlers/Item/GeneralItemHandler.h b/MainServer/include/Handlers/Item/GeneralItemHandler.h index d33a5785..8c14d5c9 100644 --- a/MainServer/include/Handlers/Item/GeneralItemHandler.h +++ b/MainServer/include/Handlers/Item/GeneralItemHandler.h @@ -56,7 +56,7 @@ namespace Main const auto& userItems = session->getPlayer().getItems(); if (auto it = userItems.find(boxData.serialInfo.itemNumber); it != userItems.end()) { - const Main::Structures::Item& boxItem = it->second; + const Main::Structures::Item boxItem = it->second; if (auto callbackIt = generalItemCallbacks.find(boxItem.itemId.itemId); callbackIt != generalItemCallbacks.end()) { // "normal" general item, e.g. K/D reset, battery @@ -80,11 +80,11 @@ namespace Main { if (auto callbackIt = cashItemCallbacks.find(currentWonItemId); callbackIt != cashItemCallbacks.end()) { // cash item: mp/coin/coupon - callbackIt->second(session); if (!session->deleteItem(boxItem.serialInfo, "The item was deleted after being used (example: MP/coin/coupon items")) { session->sendMessage("Debug) Error while deleting opened cash item"); } + callbackIt->second(session); } else { // normal won item diff --git a/MainServer/include/Handlers/Room/MatchLeaveHandler.h b/MainServer/include/Handlers/Room/MatchLeaveHandler.h index 73ffa219..bd3c39e6 100644 --- a/MainServer/include/Handlers/Room/MatchLeaveHandler.h +++ b/MainServer/include/Handlers/Room/MatchLeaveHandler.h @@ -95,6 +95,8 @@ namespace Main room->setStateFor(uniqueId, Common::Enums::STATE_WAITING); } } + + session->flushPendingFriendRequests(); } } } diff --git a/MainServer/include/Network/MainSession.h b/MainServer/include/Network/MainSession.h index f650ae89..6df04d91 100644 --- a/MainServer/include/Network/MainSession.h +++ b/MainServer/include/Network/MainSession.h @@ -222,9 +222,12 @@ namespace Main void acceptFriendRequest(std::shared_ptr senderSession, const Main::Structures::Friend& target, const std::uint8_t* const data); + void flushPendingFriendRequests(); + bool removeBossBattleTicket(); private: + std::vector m_pendingFriendRequestsQueue{}; void handleOfflineFriendRequest(const AccountInfo& accountInfo, const char* nickname); void handleOnlineFriendRequest(std::shared_ptr targetSession, const AccountInfo& accountInfo); diff --git a/MainServer/src/Network/MainSession.cpp b/MainServer/src/Network/MainSession.cpp index f324e8cc..8f04558a 100644 --- a/MainServer/src/Network/MainSession.cpp +++ b/MainServer/src/Network/MainSession.cpp @@ -351,7 +351,28 @@ namespace Main Main::Structures::Friend friendStruct{ accountInfo.uniqueId, accountInfo.accountID }; std::memcpy(friendStruct.targetNickname, m_player.getPlayerName(), 16); m_packet.setData(reinterpret_cast(&friendStruct), sizeof(friendStruct)); - targetSession->asyncWrite(m_packet); + + if (targetSession->getPlayer().isInMatch()) + { + targetSession->m_pendingFriendRequestsQueue.push_back(friendStruct); + } + else + { + targetSession->asyncWrite(m_packet); + } + } + + void Session::flushPendingFriendRequests() + { + if (m_pendingFriendRequestsQueue.empty()) return; + m_packet.setTcpHeader(m_id, Common::Enums::NO_ENCRYPTION); + m_packet.setCommand(61, 0, Main::Enums::AddFriendServerExtra::SEND_REQUEST_TO_TARGET, 2); + for (auto& friendStruct : m_pendingFriendRequestsQueue) + { + m_packet.setData(reinterpret_cast(&friendStruct), sizeof(friendStruct)); + asyncWrite(m_packet); + } + m_pendingFriendRequestsQueue.clear(); } bool Session::removeBossBattleTicket()