From 3018312f292a6e7aded1b2b98383195e03fa72fc Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Wed, 30 Sep 2026 06:41:52 -0500 Subject: [PATCH] test(capture): decoders cover the matchmaking chat packets; position fields are under update Co-Authored-By: Claude Opus 5.5 --- dNet/PacketFields.inc | 33 +++++++++++++++++++ .../dNetTests/PacketCaptureTests.cpp | 2 +- .../dNetTests/PacketDecoderCoverageTests.cpp | 2 +- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/dNet/PacketFields.inc b/dNet/PacketFields.inc index ec6e9636b..bea09296c 100644 --- a/dNet/PacketFields.inc +++ b/dNet/PacketFields.inc @@ -40,6 +40,8 @@ json ToJson(const ChatPackets::GuildKick& m); json ToJson(const ChatPackets::GuildSetRank& m); json ToJson(const ChatPackets::GuildDisband& m); json ToJson(const ChatPackets::GuildStatus& m); +json ToJson(const ChatPackets::MatchRequest& m); +json ToJson(const ChatPackets::MatchTransfer& m); json ToJson(const ChatPackets::Client::GeneralChatMessage& m); json ToJson(const ChatPackets::Client::PrivateChatMessage& m); json ToJson(const ClientPackets::LoginResponse& m); @@ -481,6 +483,33 @@ json ToJson(const ChatPackets::GuildStatus& m) { j["guildName"] = ToJson(m.guildName); return j; } +json ToJson(const ChatPackets::MatchRequest& m) { + json j = json::object(); + j["playerID"] = ToJson(m.playerID); + j["type"] = ToJson(m.type); + j["value"] = ToJson(m.value); + j["activityID"] = ToJson(m.activityID); + j["playerName"] = ToJson(m.playerName); + j["playerChoices"] = ToJson(m.playerChoices); + j["instanceMapID"] = ToJson(m.instanceMapID); + j["minTeams"] = ToJson(m.minTeams); + j["maxTeams"] = ToJson(m.maxTeams); + j["minTeamSize"] = ToJson(m.minTeamSize); + j["maxTeamSize"] = ToJson(m.maxTeamSize); + j["waitTime"] = ToJson(m.waitTime); + j["startDelay"] = ToJson(m.startDelay); + return j; +} +json ToJson(const ChatPackets::MatchTransfer& m) { + json j = json::object(); + j["activityID"] = ToJson(m.activityID); + j["zoneID"] = ToJson(m.zoneID); + j["serverIP"] = ToJson(m.serverIP); + j["serverPort"] = ToJson(m.serverPort); + j["mythranShift"] = ToJson(m.mythranShift); + j["players"] = ToJson(m.players); + return j; +} json ToJson(const ChatPackets::Client::GeneralChatMessage& m) { json j = json::object(); j["unknown"] = ToJson(m.unknown); @@ -1057,6 +1086,7 @@ json ToJson(const MasterPackets::ServerListResponse::Instance& m) { j["port"] = ToJson(m.port); j["isPrivate"] = ToJson(m.isPrivate); j["state"] = ToJson(m.state); + j["outdated"] = ToJson(m.outdated); return j; } json ToJson(const MasterPackets::ServerListResponse::Endpoint& m) { @@ -1524,6 +1554,7 @@ json ToJson(const WorldFilesStatus::Instance& m) { j["players"] = ToJson(m.players); j["stale"] = ToJson(m.stale); j["reloading"] = ToJson(m.reloading); + j["outdated"] = ToJson(m.outdated); return j; } json ToJson(const WorldFilesStatus::Zone& m) { @@ -1771,6 +1802,8 @@ const std::vector& Entries() { { ServiceType::CHAT, static_cast(MessageType::Chat::GUILD_SET_RANK), "GuildSetRank", false, &ReadWith }, { ServiceType::CHAT, static_cast(MessageType::Chat::GUILD_DISBAND), "GuildDisband", false, &ReadWith }, { ServiceType::CHAT, static_cast(MessageType::Chat::GUILD_GET_STATUS), "GuildStatus", false, &ReadWith }, + { ServiceType::CHAT, static_cast(MessageType::Chat::MATCH_REQUEST), "MatchRequest", false, &ReadWith }, + { ServiceType::CHAT, static_cast(MessageType::Chat::MATCH_TRANSFER), "MatchTransfer", false, &ReadWith }, { ServiceType::CHAT, static_cast(MessageType::Chat::GENERAL_CHAT_MESSAGE), "GeneralChatMessage", false, &ReadWith }, { ServiceType::CHAT, static_cast(MessageType::Chat::PRIVATE_CHAT_MESSAGE), "PrivateChatMessage", false, &ReadWith }, { ServiceType::CLIENT, static_cast(MessageType::Client::LOGIN_RESPONSE), "LoginResponse", false, &ReadWith }, diff --git a/tests/dGameTests/dNetTests/PacketCaptureTests.cpp b/tests/dGameTests/dNetTests/PacketCaptureTests.cpp index 1ef827d6c..ca7f479b8 100644 --- a/tests/dGameTests/dNetTests/PacketCaptureTests.cpp +++ b/tests/dGameTests/dNetTests/PacketCaptureTests.cpp @@ -337,7 +337,7 @@ TEST(PacketDecoderTests, NamesEveryService) { EXPECT_EQ(decoded.service, "WORLD"); EXPECT_EQ(decoded.name, "POSITION_UPDATE"); ASSERT_TRUE(decoded.fields); - EXPECT_FLOAT_EQ((*decoded.fields)["position"][1].get(), 2.0f); + EXPECT_FLOAT_EQ((*decoded.fields)["update"]["position"][1].get(), 2.0f); const auto where = PacketDecoder::Position(bytes); ASSERT_TRUE(where); EXPECT_FLOAT_EQ(where->z, 3.0f); diff --git a/tests/dGameTests/dNetTests/PacketDecoderCoverageTests.cpp b/tests/dGameTests/dNetTests/PacketDecoderCoverageTests.cpp index a1e1dd349..2fbd8dcb9 100644 --- a/tests/dGameTests/dNetTests/PacketDecoderCoverageTests.cpp +++ b/tests/dGameTests/dNetTests/PacketDecoderCoverageTests.cpp @@ -46,7 +46,7 @@ namespace { "CHAT TEAM_MISSED_INVITE_CHECK", "CHAT BLUEPRINT_MODERATED", "CHAT BLUEPRINT_MODEL_READY", "CHAT PROPERTY_READY_FOR_APPROVAL", "CHAT PROPERTY_MODERATION_CHANGED", "CHAT PROPERTY_BUILDMODE_CHANGED", "CHAT PROPERTY_BUILDMODE_CHANGED_REPORT", "CHAT WORLD_INSTANCE_LOCATION_REQUEST", "CHAT REPUTATION_UPDATE", "CHAT SEND_CANNED_TEXT", "CHAT CHARACTER_NAME_CHANGE_REQUEST", - "CHAT CSR_REQUEST", "CHAT CSR_REPLY", "CHAT GM_KICK", "CHAT ACTIVITY_UPDATE", "CHAT GET_ZONE_POPULATIONS", "CHAT MATCH_REQUEST", + "CHAT CSR_REQUEST", "CHAT CSR_REPLY", "CHAT GM_KICK", "CHAT ACTIVITY_UPDATE", "CHAT GET_ZONE_POPULATIONS", "CHAT UGCMANIFEST_REPORT_MISSING_FILE", "CHAT UGCMANIFEST_REPORT_DONE_FILE", "CHAT UGCMANIFEST_REPORT_DONE_BLUEPRINT", "CHAT UGCC_REQUEST", "CHAT WORLD_PLAYERS_PET_MODERATED_ACKNOWLEDGE", "CHAT GM_CLOSE_PRIVATE_CHAT_WINDOW", "CHAT PLAYER_READY", "CHAT GET_DONATION_TOTAL", "CHAT UPDATE_DONATION", "CHAT PRG_CSR_COMMAND", "CHAT HEARTBEAT_REQUEST_FROM_WORLD",