Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Исходник [Сурс] TF2 Killfeed Funnies — Подмена иконок и текста в киллфиде

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
505
Реакции
13
Наткнулся на занятную реализацию кастомизации киллфида в TF2. Если планируете допилить свою пасту или просто хотите добавить щепотку троллинга в паблик-чит — этот метод для вас. Суть заключается в хуке CTFHudDeathNotice_OnGameEvent и прямой манипуляции данными в памяти перед их отрисовкой.

0R5waz3.png


Техническая база
Работа идет через
Код:
Expand Collapse Copy
client.dll
В коде ниже используется сигнатура для поиска функции и последующий перехват через
Код:
Expand Collapse Copy
MAKE_HOOK
Автор явно вдохновлялся наработками Ateris, так что структура знакомая.

Актуальная сигнатура:
Код:
Expand Collapse Copy
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");

Сам хук с логикой подмены:
Код:
Expand Collapse Copy
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);
}

  1. Офсет 632 — выход на список уведомлений в текущем указателе.
  2. Офсет 136 — указатель на строку с названием иконки (szIcon).
  3. Офсет 168 — указатель на строку с дополнительным текстом (wzInfoText).
  4. Размер структуры DeathNoticeItem составляет 432 байта.

В примере иконка меняется на таран бампер-картом, а в киллфид добавляется кастомный префикс. Метод простой, но эффективный для тех, кто пишет Internal софт.

Кто уже пробовал другие иконки подставлять, какие ID сейчас самые актуальные?
 
Назад
Сверху Снизу