Гайд на Internal Glow.
далее просто вызываем initialize_glow_hook в dll main
для реализации glow обводки нам понадобится:
структура c_glow_property:
///////////////////////
minhook в вашем проекте.
актуальные паттерны для is_glow(E8 ? ? ? ? 33 DB 84 C0 0F 84 ? ? ? ? 48 8B 4F client.dll) и glow_color(48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC ? 48 8B F2 48 8B F9 48 8B 54 24 client.dll).
структура c_glow_property:
class c_glow_property{public: char pad[0x18]; c_entity_instance* m_owner; };///////////////////////
minhook в вашем проекте.
актуальные паттерны для is_glow(E8 ? ? ? ? 33 DB 84 C0 0F 84 ? ? ? ? 48 8B 4F client.dll) и glow_color(48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC ? 48 8B F2 48 8B F9 48 8B 54 24 client.dll).
Создаем typedef:
Создаем сам хук:
хук glow_color:
using hk_is_glow = bool(__fastcall*)(c_glow_property*);hk_is_glow fn_is_glow = nullptr;using hk_glow_color = void(__fastcall*)(c_glow_property*, c_color);hk_glow_color fn_glow_color = nullptr;Создаем сам хук:
auto hooks::is_glow(c_glow_property* glow_property) -> bool // этот хук будет применять glow на игроков, но тут мы не можем менять цвет(для смены цвета у нас будет хук glow_color){ auto original = is_glow_hook.get_original<decltype(&is_glow)>(); if (!glow_property) return false; auto local_pawn = g_globals->local_player_pawn; if (!local_pawn) return false; if (!glow_property->m_owner) return false; auto pawn = reinterpret_cast<c_cs_player_pawn*>(glow_property->m_owner); if (!pawn || pawn->m_health() <= 0) // если убрать pawn->m_health() <= 0 то у вас будет glow накладываться на мертвых игроков return false; if (g_globals->local_player_pawn->m_team_num() == pawn->m_team_num()) return false; // это проверка на команду, что бы не накладывать glow на тиммейтов(можно убрать) if (!pawn->is_player_pawn()) return false; // накладывает glow только на игроков return true; // если все проверки прошли glow возвращает true и накладывает glow}хук glow_color:
auto hooks::glow_color(c_glow_property* glow_property, c_color color) -> void // c_color - это r, g, b, a (1.f, 1.f, 1.f, 1.f){ static auto original = glow_color_hook.get_original<decltype(&glow_color)>(); // получаем оригинал if (!glow_property) return original(glow_property, color); if (!g_globals->local_player_pawn) return original(glow_property, color); auto owner = reinterpret_cast<c_cs_player_pawn*>(glow_property->m_owner); if (!owner || owner == g_globals->local_player_pawn) // если owner == g_globals->local_player_pawn тогда пропускаем локального игрока return original(glow_property, color); if (owner->m_health() <= 0) // проверка на здоровье return original(glow_property, color); if (g_globals->local_player_pawn->m_team_num() == owner->m_team_num()) // так же пропускаем локальную команду return original(glow_property, color); color.r = g_cfg->visuals.m_glow_color.r; // тут мы применяем цвет для glow color.g = g_cfg->visuals.m_glow_color.g; color.b = g_cfg->visuals.m_glow_color.b; color.a = g_cfg->visuals.m_glow_color.a;}void initialize_glow_hook(){ MH_Initialize(); auto is_glow_addr = utils::absolute(utils::pattern_scan("client.dll","E8 ? ? ? ? 33 DB 84 C0 0F 84 ? ? ? ? 48 8B 4F"), 0x1); auto glow_color_addr = utils::pattern_scan("client.dll", "48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC ? 48 8B F2 48 8B F9 48 8B 54 24"); MH_CreateHook(reinterpret_cast<void*>(is_glow_addr),&hooks::is_glow,reinterpret_cast<void**>(&fn_is_glow)); MH_CreateHook(reinterpret_cast<void*>(glow_color_addr),&hooks::glow_color ,reinterpret_cast<void**>(&fn_glow_color)); MH_EnableHook(reinterpret_cast<void*>(is_glow_addr)); MH_EnableHook(reinterpret_cast<void*>(glow_color_addr));}далее просто вызываем initialize_glow_hook в dll main