#include #include "loader/component_loader.hpp" #include "game/game.hpp" #include "auth.hpp" #include #include namespace colors { namespace { utils::hook::detour cl_get_client_name_hook; std::optional get_color_for_xuid(const uint64_t xuid) { if (xuid == 0xCD02AF6448291209 || xuid == 0x10F0C433E08E1357 || xuid == 0x60E0FEFE42341715) { return 2; } return {}; } std::optional get_color_for_client(const int client_num) { const auto xuid = auth::get_guid(static_cast(client_num)); return get_color_for_xuid(xuid); } template void patch_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t a = 255) { auto* color_table = reinterpret_cast(0x142FEFE20_g); auto* g_color_table = reinterpret_cast(0x142FB5CF0_g); uint8_t color_int[4]; color_int[0] = r; color_int[1] = g; color_int[2] = b; color_int[3] = a; utils::hook::copy(color_table + index * 4, color_int, sizeof(color_int)); float color_float[4]; color_float[0] = static_cast(r) / 255.0f; color_float[1] = static_cast(g) / 255.0f; color_float[2] = static_cast(b) / 255.0f; color_float[3] = static_cast(a) / 255.0f; utils::hook::copy(g_color_table + index * 4, color_float, sizeof(color_float)); } bool cl_get_client_name_stub(const int local_client_num, const int index, char* buf, const int size, const bool add_clan_name) { const auto res = cl_get_client_name_hook.invoke(local_client_num, index, buf, size, add_clan_name); if (_ReturnAddress() == reinterpret_cast(0x1406A7B56_g)) { return res; } const auto color = get_color_for_client(index); if (!color) { return res; } const auto val = utils::string::va("^%d%s", *color, buf); utils::string::copy(buf, size, val); return res; } /*const char* get_gamer_tag_stub(const uint32_t num) { const auto color = get_color_for_xuid(steam::SteamUser()->GetSteamID().bits); const auto name = reinterpret_cast(0x141EC6E80)(num) + 8; if (!color || num) { return name; } return utils::string::va("^1%s", *color, name); }*/ } struct component final : client_component { void post_unpack() override { patch_color<1>(255, 49, 49); // 1 - Red patch_color<2>(134, 192, 0); // 2 - Green patch_color<3>(255, 173, 34); // 3 - Yellow patch_color<4>(0, 135, 193); // 4 - Blue patch_color<5>(32, 197, 255); // 5 - Light Blue patch_color<6>(151, 80, 221); // 6 - Pink // Old addresses cl_get_client_name_hook.create(game::CL_GetClientName, cl_get_client_name_stub); //utils::hook::jump(0x141EC72E0_g, get_gamer_tag_stub); } }; } REGISTER_COMPONENT(colors::component)