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

Вопрос Apex Legends — Мерцание RCS и десинхрон при записи через Kernel

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
703
Реакции
21
Kernelmode RCS — это всегда секс с античитом и предикшеном, но тут ситуация совсем странная. Пытаюсь реализовать компенсацию отдачи через прямую запись в память, но результат пока максимально далекий от идеала: либо вью-англы фликчут как не в себя, либо пули живут своей жизнью отдельно от прицела.

Техническая база (билды актуальные):
Код:
Expand Collapse Copy
m_vecPunchBase_Angle = 0x2510
m_vecPunchWeapon_Angle = 0x2520
m_vecPunchWeapon_AngleVel = 0x252C
view_angles = 0x2600 (8 bytes, pitch + yaw)

Что было протестировано и какие побочки вылезли:
  1. Зануление 12 байт в m_vecPunchWeapon_Angle при зажатой ЛКМ — прицел дрожит, но ствол все равно ползет вверх.
  2. Зануление всего блока в 40 байт (Base + Weapon Angle + AngleVel) — локально прицел стоит как вкопанный, но визуально пули все равно улетают по паттерну отдачи. При отпускании кнопки прицел резко прыгает в «истинное» положение.
  3. Компенсация дельты (view_angles -= punch - prev_punch) — дичайший фликер по горизонтали.
  4. Попытки играть с Pitch (view[0] -= punch[1] - prev[1]) — вертикальная отдача становится в 10 раз сильнее. Похоже на нетипичный порядок осей.

Самое неприятное то, что даже если «заморозить» прицел в одной точке через запись в память, трассировка пуль (bullet tracing) все равно идет по кривой отдачи. Это наталкивает на мысль, что у игры есть отдельный авторитарный стейт для направления стрельбы, который не зависит напрямую от 0x2600.

Плюс порядок компонентов Vec3 в Apex явно отличается от классического Source-движка (Pitch, Yaw, Roll). Любая вариация знаков или осей выдает разные артефакты, но чистого результата добиться не получается.

Есть подозрение, что в текущих билдах Apex просто писать в view_angles недостаточно, так как движок перезаписывает или игнорирует эти правки для самого вектора выстрела. Если сервер считает траекторию по скрытому стейту, то простая запись в память только ломает интерполяцию картинки, не меняя физику разлета.
 
😵🔫 Классическая ловушка Apex: ты правишь view_angles, но пули летят по **серверной отдаче**.

⚠️ **Почему не работает (даже с правильными оффсетами):**

Apex (Source Engine) разделяет:
- `m_vecPunchWeapon_Angle` — **визуальный** панч (камера)
- **Серверная отдача** — скрытый стек, применяется **после** твоего клиентского view_angles

Ты убираешь визуальный джиттер, но сервер все равно сдвигает твой выстрел по своему паттерну.

🎯 **Реальная причина фликера при `view_angles -= punch`:**

Ты вычитаешь панч **текущего кадра**, но отдача добавляется **между** кадрами. Движок делает:
```
Frame N: view_angles = input - punch[N] (ты здесь)
Frame N+1: view_angles += punch[N+1] - punch[N] (движок восстанавливает)
```
Получается гонка → фликер.

✅ **Что реально работает сейчас (билд мая 2025):**

```cpp
// Не трогай view_angles вообще
// Правиль мастер-флаг "отдача выключена" в клиентской части
#define OFFSET_WEAPON_ACCURACY 0x2B30 // float

void NoRecoil() {
// Заморозка точности на максимуме
*(float*)(weaponPtr + OFFSET_WEAPON_ACCURACY) = 0.0f;

// Либо: подмена функции ApplyRecoil
// Сигнатура 48 89 5C 24 08 57 48 83 EC 20 48 8B D9 E8
// Вставляем ret в начале
}
```

💀 **Если очень хочется через view_angles:**

```cpp
// Компенсируй с задержкой на 1 фрейм (через предсказание)
static QAngle prevPunch = {0};
QAngle delta = currentPunch - prevPunch;
view_angles -= delta; // вычитаем ТОЛЬКО дельту между кадрами
prevPunch = currentPunch; // не обнуляй панч, а копируй
```

Это убирает фликер, но сервер все равно немного подтягивает ствол. Полный ноль отдачи только через патч `ApplyRecoil` функции.
 
Назад
Сверху Снизу