diff --git a/src/CommandFormats.hh b/src/CommandFormats.hh index b2c60ba4..65fb26f3 100644 --- a/src/CommandFormats.hh +++ b/src/CommandFormats.hh @@ -1218,13 +1218,21 @@ struct C_RegisterV1_DC_92 { // 93 (C->S): Log in (DCv1) +template +struct C_Login_MeetUserExtension { + le_uint32_t menu_id; + le_uint32_t preferred_lobby_id; + parray unknown_a1; + ptext target_player_name; +}; + struct C_LoginV1_DC_93 { le_uint32_t player_tag; le_uint32_t guild_card_number; le_uint32_t unknown_a1; le_uint32_t unknown_a2; le_uint32_t sub_version; - uint8_t unknown_a3; // Probably is_extended + uint8_t is_extended; uint8_t language; parray unused1; ptext serial_number; @@ -1237,7 +1245,7 @@ struct C_LoginV1_DC_93 { }; struct C_LoginExtendedV1_DC_93 : C_LoginV1_DC_93 { - parray unused3; + C_Login_MeetUserExtension extension; }; // 93 (C->S): Log in (BB) @@ -1407,14 +1415,6 @@ struct C_Register_BB_9C { // selected the Meet User option, in which case it specifies the requested lobby // by its menu ID and item ID. -template -struct C_Login_MeetUserExtension { - le_uint32_t menu_id; - le_uint32_t preferred_lobby_id; - parray unknown_a1; - ptext target_player_name; -}; - struct C_Login_DC_PC_GC_9D { le_uint32_t player_tag; // 0x00010000 if guild card is set (via 04) le_uint32_t guild_card_number; // 0xFFFFFFFF if not set diff --git a/src/ProxyCommands.cc b/src/ProxyCommands.cc index 50f70210..2b5cf500 100644 --- a/src/ProxyCommands.cc +++ b/src/ProxyCommands.cc @@ -238,7 +238,7 @@ static HandlerResult process_server_dc_pc_v3_patch_02_17( cmd.unknown_a1 = 0; cmd.unknown_a2 = 0; cmd.sub_version = session.sub_version; - cmd.unknown_a3 = 0; + cmd.is_extended = 0; cmd.language = session.language; cmd.serial_number = string_printf("%08" PRIX32 "", session.license->serial_number); diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index 2d7c0041..e883a7a4 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -280,6 +280,13 @@ void process_login_3_dc_pc_v3(shared_ptr s, shared_ptr c, } } + if (cmd.is_extended) { + const auto& ext_cmd = check_size_t(data); + if (ext_cmd.extension.menu_id == MenuID::LOBBY) { + c->preferred_lobby_id = ext_cmd.extension.preferred_lobby_id; + } + } + send_update_client_config(c); process_login_complete(s, c);