diff --git a/src/ProxyCommands.cc b/src/ProxyCommands.cc index 1978d148..8bc2420d 100644 --- a/src/ProxyCommands.cc +++ b/src/ProxyCommands.cc @@ -36,6 +36,10 @@ using namespace std; +static constexpr uint16_t encode_xrgb1555(uint32_t xrgb8888) { + return ((xrgb8888 >> 9) & 0x7C00) | ((xrgb8888 >> 6) & 0x03E0) | ((xrgb8888 >> 3) & 0x001F); +} + struct HandlerResult { enum class Type { FORWARD = 0, @@ -1033,6 +1037,10 @@ static HandlerResult C_GXB_61(shared_ptr, pd.disp.visual.name_color = 0x00000000; modified = true; } + if (!session.challenge_rank_title_override.empty()) { + pd.records.challenge.title_color = encode_xrgb1555(session.challenge_rank_color_override); + pd.records.challenge.rank_title = encrypt_challenge_rank_text(session.challenge_rank_title_override); + } } else { C_CharacterData_V3_61_98* pd; @@ -1066,6 +1074,10 @@ static HandlerResult C_GXB_61(shared_ptr, pd->disp.visual.name_color = 0x00000000; modified = true; } + if (!session.challenge_rank_title_override.empty()) { + pd->records.challenge.title_color = encode_xrgb1555(session.challenge_rank_color_override); + pd->records.challenge.rank_title = encrypt_challenge_rank_text(session.challenge_rank_title_override); + } } return modified ? HandlerResult::Type::MODIFIED : HandlerResult::Type::FORWARD; diff --git a/src/ProxyServer.hh b/src/ProxyServer.hh index c4bb9228..1fe1e0ff 100644 --- a/src/ProxyServer.hh +++ b/src/ProxyServer.hh @@ -65,6 +65,8 @@ public: std::string login_command_bb; ClientOptions options; + uint32_t challenge_rank_color_override; + std::string challenge_rank_title_override; int64_t remote_guild_card_number; parray remote_client_config_data; ClientConfigBB newserv_client_config; diff --git a/src/ServerShell.cc b/src/ServerShell.cc index f29b499c..1d168e33 100644 --- a/src/ServerShell.cc +++ b/src/ServerShell.cc @@ -720,6 +720,14 @@ Proxy session commands:\n\ session->options.override_lobby_number = lobby_type_for_name(command_args); } + } else if (command_name == "set-challenge-rank-title") { + auto session = this->get_proxy_session(session_name); + session->challenge_rank_title_override = command_args; + + } else if (command_name == "set-challenge-rank-color") { + auto session = this->get_proxy_session(session_name); + session->challenge_rank_color_override = stoul(command_args, nullptr, 16); + } else if (command_name == "set-chat-filter") { auto session = this->get_proxy_session(session_name); set_boolean(&session->options.enable_chat_filter, command_args);