diff --git a/dDatabase/GameDatabase/MySQL/Tables/Mail.cpp b/dDatabase/GameDatabase/MySQL/Tables/Mail.cpp index 74acb54f..51355080 100644 --- a/dDatabase/GameDatabase/MySQL/Tables/Mail.cpp +++ b/dDatabase/GameDatabase/MySQL/Tables/Mail.cpp @@ -62,6 +62,7 @@ std::optional MySQLDatabase::GetMail(const uint64_t mailId) { } uint32_t MySQLDatabase::GetUnreadMailCount(const uint32_t characterId) { + LOG("Getting unread mail count for character %i", characterId); auto res = ExecuteSelect("SELECT COUNT(*) AS number_unread FROM mail WHERE receiver_id=? AND was_read=0;", characterId); if (!res->next()) { diff --git a/dGame/dUtilities/Mail.cpp b/dGame/dUtilities/Mail.cpp index db660916..e1c7dbd0 100644 --- a/dGame/dUtilities/Mail.cpp +++ b/dGame/dUtilities/Mail.cpp @@ -34,28 +34,29 @@ namespace { } namespace Mail { - std::map(const SystemAddress&, Entity* const)>> handlers = { - {eMessageID::SendRequest, [](const SystemAddress& sysAddr, Entity* const player) { + std::map()>> g_Handlers = { + {eMessageID::SendRequest, []() { return std::make_unique(); }}, - {eMessageID::DataRequest, [](const SystemAddress& sysAddr, Entity* const player) { + {eMessageID::DataRequest, []() { return std::make_unique(); }}, - {eMessageID::AttachmentCollectRequest, [](const SystemAddress& sysAddr, Entity* const player) { + {eMessageID::AttachmentCollectRequest, []() { return std::make_unique(); }}, - {eMessageID::DeleteRequest, [](const SystemAddress& sysAddr, Entity* const player) { + {eMessageID::DeleteRequest, []() { return std::make_unique(); }}, - {eMessageID::ReadRequest, [](const SystemAddress& sysAddr, Entity* const player) { + {eMessageID::ReadRequest, []() { return std::make_unique(); }}, - {eMessageID::NotificationRequest, [](const SystemAddress& sysAddr, Entity* const player) { + {eMessageID::NotificationRequest, []() { return std::make_unique(); }}, }; void MailLUBitStream::Serialize(RakNet::BitStream& bitStream) const { + LOG("Writing %s", StringifiedEnum::ToString(messageID).data()); bitStream.Write(messageID); } @@ -160,28 +161,32 @@ namespace Mail { void NotificationResponse::Serialize(RakNet::BitStream& bitStream) const { MailLUBitStream::Serialize(bitStream); + LOG("notification: %s", StringifiedEnum::ToString(notification).data()); bitStream.Write(notification); bitStream.Write(0); // unused bitStream.Write(0); // unused + LOG("auctionID: %llu", auctionID); bitStream.Write(auctionID); bitStream.Write(0); // unused + LOG("mailCount: %i", mailCount); bitStream.Write(mailCount); } void DataRequest::Handle() { - auto playerMail = Database::Get()->GetMailForPlayer(player->GetObjectID(), 20); - - if (playerMail.size() > 0) { - DataResponse response; - response.playerMail = playerMail; - response.Send(sysAddr); - } + LOG("DataRequest::Handle()"); + auto playerMail = Database::Get()->GetMailForPlayer(static_cast(player->GetObjectID()), 20); + LOG("DataRequest::Handle() - Got %i mail", playerMail.size()); + DataResponse response; + response.playerMail = playerMail; + response.Send(sysAddr); } void DataResponse::Serialize(RakNet::BitStream& bitStream) const { MailLUBitStream::Serialize(bitStream); - + LOG("throtttled: %i", throttled); bitStream.Write(this->throttled); + + LOG("playerMail.size(): %i", this->playerMail.size()); bitStream.Write(this->playerMail.size()); bitStream.Write(0); // packing for (const auto& mail : this->playerMail) { @@ -269,7 +274,13 @@ namespace Mail { } void NotificationRequest::Handle() { - auto unreadMailCount = Database::Get()->GetUnreadMailCount(player->GetObjectID()); + auto character = player->GetCharacter(); + if (!character) { + NotificationResponse(eNotificationResponse::UnknownError, 0).Send(sysAddr); + return; + } + + auto unreadMailCount = Database::Get()->GetUnreadMailCount(character->GetID()); if (unreadMailCount > 0) NotificationResponse(eNotificationResponse::NewMail, unreadMailCount).Send(sysAddr); } } @@ -282,9 +293,11 @@ void Mail::HandleMail(RakNet::BitStream& inStream, const SystemAddress& sysAddr, return; } - auto it = handlers.find(data.messageID); - if (it != handlers.end()) { - auto request = it->second(sysAddr, player); + auto it = g_Handlers.find(data.messageID); + if (it != g_Handlers.end()) { + auto request = it->second(); + request->sysAddr = sysAddr; + request->player = player; if (!request->Deserialize(inStream)) { LOG_DEBUG("Error Reading Mail Request: %s", StringifiedEnum::ToString(data.messageID).data()); return; diff --git a/dGame/dUtilities/Mail.h b/dGame/dUtilities/Mail.h index 42980ce4..ab60c201 100644 --- a/dGame/dUtilities/Mail.h +++ b/dGame/dUtilities/Mail.h @@ -89,12 +89,11 @@ namespace Mail { struct MailLUBitStream : public LUBitStream { eMessageID messageID = eMessageID::UnknownError; - const SystemAddress sysAddr = UNASSIGNED_SYSTEM_ADDRESS; - Entity* const player = nullptr; + SystemAddress sysAddr = UNASSIGNED_SYSTEM_ADDRESS; + Entity* player = nullptr; MailLUBitStream() = default; MailLUBitStream(eMessageID _messageID) : LUBitStream(eConnectionType::CLIENT, MessageType::Client::MAIL), messageID{_messageID} {}; - MailLUBitStream(const SystemAddress& _sysAddr, Entity* const _player) : sysAddr(_sysAddr), player(_player) {}; virtual void Serialize(RakNet::BitStream& bitStream) const override; virtual bool Deserialize(RakNet::BitStream& bitStream) override; @@ -119,13 +118,13 @@ namespace Mail { eNotificationResponse notification = eNotificationResponse::UnknownError; LWOOBJID auctionID = LWOOBJID_EMPTY; uint32_t mailCount = 1; - NotificationResponse(eNotificationResponse _notification) : MailLUBitStream(eMessageID::NotificationResponse), notification{_notification} {}; NotificationResponse(eNotificationResponse _notification, uint32_t _mailCount) : MailLUBitStream(eMessageID::NotificationResponse), notification{_notification}, mailCount{_mailCount} {}; void Serialize(RakNet::BitStream& bitStream) const override; }; struct DataRequest : public MailLUBitStream { + bool Deserialize(RakNet::BitStream& bitStream) override { return true; }; void Handle() override; }; @@ -190,6 +189,7 @@ namespace Mail { struct NotificationRequest : public MailLUBitStream { NotificationRequest() : MailLUBitStream(eMessageID::NotificationRequest) {}; + bool Deserialize(RakNet::BitStream& bitStream) override { return true; }; void Handle() override; }; diff --git a/dGame/dUtilities/SlashCommands/GMZeroCommands.cpp b/dGame/dUtilities/SlashCommands/GMZeroCommands.cpp index 09267694..6b9e6201 100644 --- a/dGame/dUtilities/SlashCommands/GMZeroCommands.cpp +++ b/dGame/dUtilities/SlashCommands/GMZeroCommands.cpp @@ -217,7 +217,7 @@ namespace GMZeroCommands { } void RequestMailCount(Entity* entity, const SystemAddress& sysAddr, const std::string args) { - Mail::NotificationResponse(Mail::eNotificationResponse::NewMail, Database::Get()->GetUnreadMailCount(entity->GetObjectID())).Send(sysAddr); + Mail::NotificationResponse(Mail::eNotificationResponse::NewMail, Database::Get()->GetUnreadMailCount(entity->GetCharacter()->GetID())).Send(sysAddr); } void InstanceInfo(Entity* entity, const SystemAddress& sysAddr, const std::string args) { diff --git a/dMasterServer/MasterServer.cpp b/dMasterServer/MasterServer.cpp index 89ecef05..fcac8143 100644 --- a/dMasterServer/MasterServer.cpp +++ b/dMasterServer/MasterServer.cpp @@ -348,7 +348,7 @@ int main(int argc, char** argv) { StartChatServer(); Game::im->GetInstance(0, false, 0); - Game::im->GetInstance(1000, false, 0); + Game::im->GetInstance(1100, false, 0); StartAuthServer(); } diff --git a/dNet/BitStreamUtils.cpp b/dNet/BitStreamUtils.cpp index 64142e99..8fc5d20d 100644 --- a/dNet/BitStreamUtils.cpp +++ b/dNet/BitStreamUtils.cpp @@ -1,6 +1,7 @@ #include "BitStreamUtils.h" #include "dServer.h" #include "BitStream.h" +#include "PacketUtils.h" void LUBitStream::WriteHeader(RakNet::BitStream& bitStream) const { @@ -25,5 +26,7 @@ void LUBitStream::Send(const SystemAddress& sysAddr) const { RakNet::BitStream bitStream; this->WriteHeader(bitStream); this->Serialize(bitStream); + LOG("%s", sysAddr.ToString(true)); + PacketUtils::SavePacket("mailv2", reinterpret_cast(bitStream.GetData()), bitStream.GetNumberOfBytesUsed()); Game::server->Send(bitStream, sysAddr, sysAddr == UNASSIGNED_SYSTEM_ADDRESS); } diff --git a/dNet/CMakeLists.txt b/dNet/CMakeLists.txt index 84ba7e3f..67c2ea1f 100644 --- a/dNet/CMakeLists.txt +++ b/dNet/CMakeLists.txt @@ -3,6 +3,7 @@ set(DNET_SOURCES "AuthPackets.cpp" "ChatPackets.cpp" "ClientPackets.cpp" "dServer.cpp" + "MailInfo.cpp" "MasterPackets.cpp" "PacketUtils.cpp" "WorldPackets.cpp" diff --git a/dNet/MailInfo.cpp b/dNet/MailInfo.cpp index 687fee2e..6ca1de47 100644 --- a/dNet/MailInfo.cpp +++ b/dNet/MailInfo.cpp @@ -3,22 +3,26 @@ #include "DluAssert.h" void MailInfo::Serialize(RakNet::BitStream& bitStream) const { + LOG("Writing MailInfo"); + LOG("ID: %llu", id); bitStream.Write(id); - + LOG("Subject: %s", subject.c_str()); const LUWString subject(this->subject, 50); bitStream.Write(subject); - + LOG("Body: %s", body.c_str()); const LUWString body(this->body, 400); bitStream.Write(body); - + LOG("Sender: %s", senderUsername.c_str()); const LUWString sender(this->senderUsername, 32); bitStream.Write(sender); bitStream.Write(0); // packing bitStream.Write(0); // attachedCurrency + LOG("ItemID: %llu", itemID); bitStream.Write(itemID); LOT lot = itemLOT; + LOG("ItemLOT: %u", lot); if (lot <= 0) bitStream.Write(LOT_NULL); else bitStream.Write(lot); bitStream.Write(0); // packing diff --git a/dNet/MailInfo.h b/dNet/MailInfo.h index 75100d36..2159c071 100644 --- a/dNet/MailInfo.h +++ b/dNet/MailInfo.h @@ -26,8 +26,8 @@ struct MailInfo { LWOOBJID itemSubkey{}; }; - void Serialize(RakNet::BitStream& bitStream) const {} - bool Deserialize(RakNet::BitStream& bitStream) { return true; } + void Serialize(RakNet::BitStream& bitStream) const; + bool Deserialize(RakNet::BitStream& bitStream); }; #endif // __MAILINFO_H__