From ceb0fbb8499dded944b1de6e10caedec0b2a5d3e Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Tue, 10 May 2022 22:24:45 -0700 Subject: [PATCH] show connection messages on proxy server --- src/ProxyCommands.cc | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/ProxyCommands.cc b/src/ProxyCommands.cc index 84ad5e4d..d550d9b6 100644 --- a/src/ProxyCommands.cc +++ b/src/ProxyCommands.cc @@ -63,6 +63,28 @@ static void check_implemented_subcommand(uint64_t id, const string& data) { +static void send_text_message_to_client( + ProxyServer::LinkedSession& session, + uint8_t command, + const std::string& message) { + StringWriter w; + w.put({0, 0}); + if (session.version == GameVersion::PC) { + auto decoded = decode_sjis(message); + w.write(decoded.data(), decoded.size() * sizeof(decoded[0])); + w.put_u16l(0); + } else { + w.write(message); + w.put_u8(0); + } + while (w.size() & 3) { + w.put_u8(0); + } + session.send_to_end(false, command, 0x00, w.str()); +} + + + // Command handlers. These are called to preprocess or react to specific // commands in either direction. If they return true, the command (which the // function may have modified) is forwarded to the other end; if they return @@ -248,9 +270,14 @@ static bool process_server_dc_pc_gc_04(shared_ptr, // session, then the client never received a guild card number from newserv // anyway, so we can let the client see the number from the remote server. bool had_guild_card_number = (session.remote_guild_card_number != 0); - session.remote_guild_card_number = cmd.guild_card_number; - session.log(INFO, "Remote guild card number set to %" PRIu32, - session.remote_guild_card_number); + if (session.remote_guild_card_number != cmd.guild_card_number) { + session.remote_guild_card_number = cmd.guild_card_number; + session.log(INFO, "Remote guild card number set to %" PRIu32, + session.remote_guild_card_number); + send_text_message_to_client(session, 0x11, string_printf( + "The remote server\nhas assigned your\nGuild Card number as\n\tC6%" PRIu32, + session.remote_guild_card_number)); + } if (session.license) { cmd.guild_card_number = session.license->serial_number; } @@ -776,6 +803,10 @@ static bool process_client_dc_pc_gc_A0_A1(shared_ptr s, session.send_to_end(false, 0x69, leaving_id, &cmd, sizeof(cmd)); } + string encoded_name = encode_sjis(s->name); + send_text_message_to_client(session, 0x11, string_printf( + "You\'ve returned to\n\tC6%s", encoded_name.c_str())); + // Restore newserv_client_config, so the login server gets the client flags S_UpdateClientConfig_DC_PC_GC_04 update_client_config_cmd = { 0x00010000,