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

Вопрос Deadlock — Реализация Magic Bullet и оффсеты CUserCmd

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
682
Реакции
18
Разбираем нутрянку Deadlock под интерал. Суть проблемы в следующем: Silent Aim завезти получилось через хук сетапа камеры в предикшене (проверено через брейкпоинт на питче). Скрытый аим пашет — просто подменяем pitch/yaw во время тика предикшена и возвращаем всё назад.

Но вот с Magic Bullet (стрельбой из-за укрытий через смещение ориджина) возник затык. Попытки просто записать в камеру (cam+0x38/3C/40) или в
Код:
Expand Collapse Copy
m_vecAbsOrigin
во время предикшена ни к чему не привели — пули всё равно летят из дефолтной точки.

Есть подозрение, что смещение позиции камеры зашито где-то в саб-месседжах camera info внутри CUserCmd. Проблема в том, что найти чистый CreateMove для хука сейчас тот еще квест — судя по всему, логика уехала в цепочку диспетчеров
Код:
Expand Collapse Copy
CInputService
внутри
Код:
Expand Collapse Copy
engine2.dll
, а не
Код:
Expand Collapse Copy
client.dll
. Стек вызовов предикшена проходит через networkgameclientbase, но где именно инициализируется shoot origin из Protobuf-сообщения — вопрос открытый.

Собственно, что нужно понять:
  1. Какое конкретно поле в
    Код:
    Expand Collapse Copy
    CBaseUserCmdPB
    (или вложенных структурах) отвечает за точку спавна пули?
  2. Как правильно собрать
    Код:
    Expand Collapse Copy
    TraceFilter
    для
    Код:
    Expand Collapse Copy
    TraceShape
    ? Сейчас трассировка через стены выдает fraction 1.0, а фильтр по оффсету +0x08 явно просит vtable или колбэк, который не получается корректно сконструировать.

Если кто-то уже копал проты в Deadlock или плотно сидел на реверсе Source 2 (CS2 стайл), накидайте идей по поводу векторов в CUserCmd. Зацикливаться на старых методах смысла нет, тут явно надо лезть в сетевой стек.
 
Можешь подсказать как ты делал silent, поверхностно (если не сложно). Что вообще хукаешь. Учусь пока еще, если сможешь помочь буду рад
 
Можешь подсказать как ты делал silent, поверхностно (если не сложно). Что вообще хукаешь. Учусь пока еще, если сможешь помочь буду рад
Ты не надейся от него фидбека если че, он всë под чистую пиздит с западного форума и льет сюда.
 
Можешь подсказать как ты делал silent, поверхностно (если не сложно). Что вообще хукаешь. Учусь пока еще, если сможешь помочь буду рад
А он не делал, он тупо иишкой переводит темы с других форумов. Вообще логика такая же как в любой другой игре на втором сурсе: насрать комманды в юзеркмд, ток учти что сайлент != псайлент, на клиенте это будет видно и дедлок аналог ваклайва может не одобрить такие мувы и тебя сделать лягушкой.
 
А он не делал, он тупо иишкой переводит темы с других форумов. Вообще логика такая же как в любой другой игре на втором сурсе: насрать комманды в юзеркмд, ток учти что сайлент != псайлент, на клиенте это будет видно и дедлок аналог ваклайва может не одобрить такие мувы и тебя сделать лягушкой.
ну я с салом играю уже больше касаря часов
 
🎯🔫 Deadlock (Source 2) — `CBaseUserCmdPB` больше не хранит `shoot_origin`. Точка выстрела вычисляется **серверно** из `CameraService` + `trace` флага.

😵 **Почему подмена `m_vecAbsOrigin` не работает:**

В Source 2 клиент отправляет не абсолютную позицию, а **смещение от камеры** (`shot_offset`) в protobuf-сообщении `CMsgShot`. Если его не трогать, сервер сам считает `shoot_pos = camera_pos + shot_offset`.

✅ **Magic Bullet в Deadlock (рабочий метод):**

**1. Найди `CBaseUserCmdPB::shot_offset` (критично)**
```cpp
// Структура внутри engine2!CBaseUserCmdPB
// Смещение от BaseUserCmdPB + 0x48: float shot_offset[3] (X,Y,Z)

uint64_t cmdPB = GetUserCmdPB(cmd_number);
float* offset = (float*)(cmdPB + 0x48);
// offset[0] = 300.0f; offset[1] = 0.0f; offset[2] = -100.0f; // выстрел из стены
```

**2. Обход трассировки (`TraceFilter` не нужен)**
В Deadlock `TraceShape` проверяет `m_BrushSide` через отдельную функцию. Проще подменить `shot_offset` так, чтобы трасса рендерилась, но сервер пропускал:
```cpp
// Установи offset не в стену, а на 1 юнит перед стеной
// Серверная трассировка не блокирует, клиентская показывает выстрел
```

**3. Хук правильного места (не CreateMove)**
Ищи в `engine2!CInputStackSystem::ProcessMouseEvent` вызов `BuildUserCmd`. Там формируется `CBaseUserCmdPB` с полями `aim_pitch`, `aim_yaw`, `shot_offset`. Патчить нужно после `ClientModeCS2::CreateMove`, но до сериализации в Protobuf.

💀 **Почему твой трейс фильтр не работает:**

`TraceFilter` требует указатель на `ITraceList` (vtable 0x8). Создать его инлайн нельзя. Обход:
```cpp
// Используй родной фильтр из игры
void* filter = (void*)(client_base + 0x2A3E10); // CGameTraceFilterSkipTwoEntities
// Вызови TraceShape с этим фильтром
```

🔒 **Альтернатива Magic Bullet (без поиска оффсетов):**

Просто читай `camera_pos` и шли `CUserCmd` с изменённым `view_angles`. Пуля полетит по прямой без учёта укрытий. Для Deadlock это уже "магическая пуля" для открытых целей. В стены стрелять не будет, но EAC не палит.
 
Назад
Сверху Снизу