- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 505
- Реакции
- 13
Наткнулся на занятную реализацию кастомизации киллфида в TF2. Если планируете допилить свою пасту или просто хотите добавить щепотку троллинга в паблик-чит — этот метод для вас. Суть заключается в хуке CTFHudDeathNotice_OnGameEvent и прямой манипуляции данными в памяти перед их отрисовкой.
Техническая база
Работа идет через
В коде ниже используется сигнатура для поиска функции и последующий перехват через
Автор явно вдохновлялся наработками Ateris, так что структура знакомая.
Актуальная сигнатура:
Сам хук с логикой подмены:
В примере иконка меняется на таран бампер-картом, а в киллфид добавляется кастомный префикс. Метод простой, но эффективный для тех, кто пишет Internal софт.
Кто уже пробовал другие иконки подставлять, какие ID сейчас самые актуальные?
Техническая база
Работа идет через
Код:
client.dll
Код:
MAKE_HOOK
Актуальная сигнатура:
Код:
hud_kill_feed_event = memory::find_signature<QWORD>("client.dll", "48 89 5C 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B F2");
Сам хук с логикой подмены:
Код:
MAKE_HOOK(CTFHudDeathNotice_OnGameEvent, signature::hud_kill_feed_event, void, __fastcall, void* rcx, IGameEvent* event, int death_notice_msg) {
if (!i::engine_client->is_connected() || !tf2::local)
return CALL_ORIGINAL(rcx, event, death_notice_msg);
int attacker_id = i::engine_client->get_player_for_user_id(event->GetInt("attacker"));
// Разбор структур из IDA:
// 79 * 8 = 632
// 432 is sizeof(DeathNoticeItem)
auto thispointer = reinterpret_cast<std::uintptr_t>(rcx);
auto list = *reinterpret_cast<std::uintptr_t*>(thispointer + 632);
auto message = list + 432 * death_notice_msg;
if (attacker_id == tf2::local->entidx()) {
*reinterpret_cast<std::uint32_t*>(message + 64) = 0; // m_iTeam -> TEAM_UNASSIGNED
wchar_t* wzInfoText = reinterpret_cast<wchar_t*>(message + 168); // Текст уведомления
char* szIcon = reinterpret_cast<char*>(message + 136); // Иконка убийства
wcscpy(wzInfoText, L"[PASTER]");
strcpy(szIcon, "d_bumper_kart"); // Выставляем иконку бампер-карта
event->SetInt("customkill", 60);
}
CALL_ORIGINAL(rcx, event, death_notice_msg);
}
- Офсет 632 — выход на список уведомлений в текущем указателе.
- Офсет 136 — указатель на строку с названием иконки (szIcon).
- Офсет 168 — указатель на строку с дополнительным текстом (wzInfoText).
- Размер структуры DeathNoticeItem составляет 432 байта.
В примере иконка меняется на таран бампер-картом, а в киллфид добавляется кастомный префикс. Метод простой, но эффективный для тех, кто пишет Internal софт.
Кто уже пробовал другие иконки подставлять, какие ID сейчас самые актуальные?