diff --git a/src/ProxyCommands.cc b/src/ProxyCommands.cc index ee812f81..9255f954 100644 --- a/src/ProxyCommands.cc +++ b/src/ProxyCommands.cc @@ -1377,6 +1377,14 @@ static asio::awaitable S_G_B9(shared_ptr c, Channel::Mess co_return (c->version() == Version::GC_EP3) ? HandlerResult::FORWARD : HandlerResult::SUPPRESS; } +static asio::awaitable C_G_B9(shared_ptr c, Channel::Message& msg) { + if (c->proxy_session->suppress_next_ep3_media_update_confirmation) { + c->proxy_session->suppress_next_ep3_media_update_confirmation = false; + co_return HandlerResult::SUPPRESS; + } + co_return HandlerResult::FORWARD; +} + static asio::awaitable S_G_EF(shared_ptr c, Channel::Message& msg) { if (is_ep3(c->version())) { if (c->check_flag(Client::Flag::PROXY_EP3_INFINITE_MESETA_ENABLED)) { @@ -2216,7 +2224,7 @@ static on_message_t handlers[0x100][NUM_VERSIONS][2] = { /* B6 */ {{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}}, /* B7 */ {{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_G_B7, nullptr}, {S_G_B7, nullptr}, {S_G_B7, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}}, /* B8 */ {{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_G_B8, nullptr}, {S_G_B8, nullptr}, {S_G_B8, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}}, -/* B9 */ {{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_G_B9, nullptr}, {S_G_B9, nullptr}, {S_G_B9, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}}, +/* B9 */ {{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_G_B9, C_G_B9}, {S_G_B9, C_G_B9}, {S_G_B9, C_G_B9}, {S_invalid, nullptr}, {S_invalid, nullptr}}, /* BA */ {{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_G_BA, nullptr}, {S_G_BA, nullptr}, {S_G_BA, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}}, /* BB */ {{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_invalid, nullptr}}, /* BC */ {{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}}, diff --git a/src/ProxySession.hh b/src/ProxySession.hh index af9e2980..9f3f151d 100644 --- a/src/ProxySession.hh +++ b/src/ProxySession.hh @@ -43,6 +43,7 @@ struct ProxySession { Episode lobby_episode = Episode::EP1; uint32_t lobby_random_seed = 0; uint64_t server_ping_start_time = 0; + bool suppress_next_ep3_media_update_confirmation = false; int64_t remote_guild_card_number = -1; parray remote_client_config_data; diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index a360693d..6ade7ea7 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -433,10 +433,6 @@ asio::awaitable start_proxy_session(shared_ptr c, const string& ho if (!s->proxy_allow_save_files) { c->clear_flag(Client::Flag::PROXY_SAVE_FILES); } - if (c->version() == Version::GC_EP3) { - send_ep3_media_update(c, 4, 0, ""); - c->clear_flag(Client::Flag::HAS_EP3_MEDIA_UPDATES); - } string netloc_str = std::format("{}:{}", host, port); c->log.info_f("Connecting to {}", netloc_str); @@ -484,6 +480,13 @@ asio::awaitable start_proxy_session(shared_ptr c, const string& ho phosg::TerminalFormat::FG_RED); c->proxy_session = make_shared(channel, pc); + if (c->version() == Version::GC_EP3) { + send_ep3_media_update(c, 4, 0, ""); + c->clear_flag(Client::Flag::HAS_EP3_MEDIA_UPDATES); + c->proxy_session->suppress_next_ep3_media_update_confirmation = true; + } + send_change_event(c, 0x00); + c->log.info_f("Server channel connected"); asio::co_spawn(*s->io_context, handle_proxy_server_commands(c, c->proxy_session, channel), asio::detached); } diff --git a/src/SendCommands.cc b/src/SendCommands.cc index 5c764705..08b62cbe 100644 --- a/src/SendCommands.cc +++ b/src/SendCommands.cc @@ -3292,11 +3292,7 @@ void send_ep3_card_list_update(shared_ptr c) { } } -void send_ep3_media_update( - shared_ptr c, - uint32_t type, - uint32_t which, - const string& compressed_data) { +void send_ep3_media_update(shared_ptr c, uint32_t type, uint32_t which, const string& compressed_data) { phosg::StringWriter w; w.put({type, which, compressed_data.size(), 0}); w.write(compressed_data);