From fd39a89957666908fe02eceb1bc5e895afc30b16 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Wed, 2 Jul 2025 21:14:32 -0700 Subject: [PATCH] fix BB proxy bugs --- src/ProxyCommands.cc | 15 +++++++++------ src/ProxySession.hh | 1 + 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/ProxyCommands.cc b/src/ProxyCommands.cc index 59abc546..7fdc5fb5 100644 --- a/src/ProxyCommands.cc +++ b/src/ProxyCommands.cc @@ -424,10 +424,7 @@ static asio::awaitable S_V123_04(shared_ptr c, Channel::M // If there was previously a guild card number, assume we got the lobby server // init text instead of the port map init text. memcpy(c->proxy_session->remote_client_config_data.data(), - had_guild_card_number - ? "t Lobby Server. Copyright SEGA E" - : "t Port Map. Copyright SEGA Enter", - 0x20); + had_guild_card_number ? "t Lobby Server. Copyright SEGA E" : "t Port Map. Copyright SEGA Enter", 0x20); memcpy(c->proxy_session->remote_client_config_data.data(), &cmd.client_config, min(msg.data.size() - offsetof(S_UpdateClientConfig_V3_04, client_config), c->proxy_session->remote_client_config_data.bytes())); @@ -678,6 +675,12 @@ static asio::awaitable C_B3(shared_ptr c, Channel::Messag } } +static asio::awaitable C_B_E0(shared_ptr c, Channel::Message& msg) { + auto ret = c->proxy_session->bb_client_sent_E0 ? HandlerResult::FORWARD : HandlerResult::SUPPRESS; + c->proxy_session->bb_client_sent_E0 = true; + co_return ret; +} + static asio::awaitable S_B_E2(shared_ptr c, Channel::Message& msg) { if (c->check_flag(Client::Flag::PROXY_SAVE_FILES)) { string output_filename = std::format("system.{}.psosys", phosg::now()); @@ -1550,7 +1553,7 @@ template static asio::awaitable S_64(shared_ptr c, Channel::Message& msg) { CmdT* cmd; S_JoinGame_Ep3_64* cmd_ep3 = nullptr; - if (c->sub_version >= 0x40) { + if ((c->sub_version >= 0x40) && is_v3(c->version())) { cmd = &msg.check_size_t(sizeof(S_JoinGame_Ep3_64)); cmd_ep3 = &msg.check_size_t(); } else if (c->version() == Version::XB_V3) { @@ -2256,7 +2259,7 @@ static on_message_t handlers[0x100][NUM_VERSIONS][2] = { /* DE */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}}, /* DF */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}}, // CMD S_PC_PATCH C S_BB_PATCH C S_DC_NTE C S_DC_12_2000 C S_DC_V1 C S_DC_V2 C S_PC_NTE C S_PC_V2 C S_GC_NTE C S_GC_V3 C S_GC_EP3_NTE C S_GC_EP3 C S_XB_V3 C S_BB_V4 C -/* E0 */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}}, +/* E0 */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {S_invalid, nullptr}, {nullptr, C_B_E0}}, /* E1 */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}}, /* E2 */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {S_invalid, nullptr}, {S_B_E2, nullptr}}, /* E3 */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}}, diff --git a/src/ProxySession.hh b/src/ProxySession.hh index 22184d61..0e003393 100644 --- a/src/ProxySession.hh +++ b/src/ProxySession.hh @@ -22,6 +22,7 @@ struct ProxySession { uint32_t remote_ip_crc = 0; bool received_reconnect = false; bool enable_remote_ip_crc_patch = false; + bool bb_client_sent_E0 = false; struct LobbyPlayer { uint32_t guild_card_number = 0;