Читерство в шутерах от первого лица остаётся одной из самых болезненных проблем для онлайн-сервисов. Стандартные подходы — сигнатурный анализ, контроль целостности клиентов, ручной мониторинг — либо легко обходятся, либо требуют огромных трудозатрат. В то же время методы машинного обучения, особенно при грамотном feature engineering’е, способны автоматизировать выявление аномалий с высокой точностью и минимумом ложных срабатываний.

В этой статье мы разберём конкретный, проверенный на практике подход из научной работы Luca Galli с соавторами CIG’11, посвящённой обнаружению читерства в Unreal Tournament III. Несмотря на возраст игры, методология полностью актуальна для современных шутеров — особенно если вы строите собственную систему античита на основе поведенческого анализа.


🏗️ Архитектура: сбор → обработка → вывод

Авторы реализовали трёхзвенную систему:

  1. Расширенный игровой сервер — модифицированный через Unreal Script, собирает сырые игровые события с частотой около 5 Гц.
  2. Backend обработки — отвечает за агрегацию, feature extraction и применение моделей машинного обучения.
  3. Frontend — консольные утилиты для мониторинга в реальном времени и переобучения моделей.

Ключевое решение — разделение сбора и анализа. Это позволяет запускать аналитику на выделенном Linux-сервере (например, в облаке), не нагружая игровой инстанс и не привязываясь к его ОС.


📥 Сырые данные: что логировать?

На каждом тике сервер сохраняет для игрока и его целевого противника:

  • Позицию: X, Y, Z
  • Углы прицеливания: Pitch, Yaw, Roll
  • Состояние: HP, щит, текущее оружие, факт стрельбы/прыжка
  • Скорость и ускорение (в движковых единицах)
  • Флаг видимости противника (EnemyVisible)
  • Временну́ю метку и идентификатор игрока

Целевой противник определяется динамически:
- Если противники не видны — ближайший по расстоянию.
- Если видны — тот, в которого игрок прицеливается точнее всего (на основе углов и позиции цели).

Это позволяет фокусироваться на поведении именно в контексте ведения боя, а не на общем перемещении по карте.


⚙️ Feature Engineering: 45 признаков на 30-секундный фрейм

Сырые данные агрегируются в фреймы по 30 секунд. Для каждого фрейма вычисляется 45 высокоуровневых признаков, сгруппированных в несколько логических блоков.

1. Боевая эффективность

  • FiringOnVisible — доля времени стрельбы при видимой цели.
  • AimingScoreOnFiring — средняя точность прицеливания во время выстрелов.
  • avgInstantWeapon — доля использования оружия мгновенного поражения (снайперки, штурмовой винтовки и т.п.).

2. Динамика цели

  • avg∆HPTarget, var∆HPTarget — среднее и дисперсия изменения HP противника при стрельбе. Аномально высокий урон за короткое время — красный флаг.

3. Поведение прицела (ключевой блок!)

Для каждого угла — Pitch, Yaw, Roll — рассчитываются четыре статистики:
- avgAngle — среднее значение угла
- varAngle — дисперсия угла
- avg∆Angle — среднее изменение угла между тиками (аналог скорости поворота)
- var∆Angle — дисперсия этого изменения

Итого 12 признаков, описывающих стабильность, плавность и скорость наведения. Например:
- Аимбот с «slow aim» → низкая var∆Yaw, умеренная avg∆Yaw
- Ручное прицеливание → высокая var∆Pitch/Yaw из-за микродрожаний

4. Пространственные паттерны

  • avgDist, varDist — расстояние до цели и его изменчивость
  • Компоненты по осям: avgDistX/Y/Z и их дисперсии
  • avg∆Dist — средняя скорость сближения/удаления
  • avg∆DistInv — то же самое, но только когда цель НЕ видна

💡 Эта последняя фича — мощный детектор радара или ESP: если игрок уворачивается, отступает или преследует невидимую цель — его поведение статистически отличается от случайного.

5. Движение игрока

  • avgAccel, varAccel — ускорение и его вариативность. Читеры часто «прилипают» к поверхности или перемещаются предсказуемо.

🧠 Модели и обучение

Авторы сравнили пять алгоритмов обучения с учителем:

Модель Конфигурация
Naive Bayes С коррекцией Лапласа
Decision Tree RapidMiner (аналог C4.5), критерий — gain ratio
Random Forest 10 деревьев, бутстрэп, gain ratio
Neural Network 1 скрытый слой, 24 нейрона, сигмоид, backpropagation
SVM Линейное ядро (dot kernel), реализация JMySVMLearner

Обучение проводилось на 250 фреймах (125 читеров / 125 честных), собранных от двух игроков на двух картах.


🎯 Результаты: точность и ложные срабатывания

Тестирование выполнено на 39 фреймах, включающих нового игрока и новую карту — то есть проверялась обобщаемость.

Модель Точность Ложные положительные (FP)
Naive Bayes 97.44% 0
SVM 97.44% 1
Random Forest 94.87% 1
Decision Tree 92.31% 2
Neural Network 89.74% 4

Ключевой вывод:

Несмотря на простоту, Naive Bayes показал наилучшую практическую применимость — ни одного случая, когда честный игрок был ошибочно заблокирован.

Для античита это критически важно: ложное срабатывание = потеря доверия, возможные компенсации, негатив в комьюнити. А вот пропуск одного читера — менее катастрофичен, особенно если система работает в связке с другими методами.


💡 Практические рекомендации для разработки античита

  1. Не гонитесь за сложностью модели. Хороший feature engineering + простая модель (Naive Bayes, RF) часто эффективнее нейросети с сырыми данными.
  2. Фокусируйтесь на «невидимом» поведении. Фичи вроде avg∆DistInv — ваш главный инструмент против радаров и ESP.
  3. Агрегируйте по времени. Однотиковые аномалии — шум. 15–30-секундные паттерны — сигнал.
  4. Тестируйте на unseen-данных. Обязательно включайте в валидацию новые карты и новых игроков.
  5. Контролируйте конфигурацию читов в сборе данных. Без этого ваши метки будут «грязными», а модели — неинтерпретируемыми.

Эта работа — отличный пример того, как поведенческий анализ + машинное обучение могут решить задачу, которую не берут ни сигнатуры, ни клиентская защита. Главный вывод для практиков: античит будущего — это не детектор бинарников, а детектор стиля игры.

Если вы строите систему на основе ML — начните с фич, описанных выше. Они проверены, интерпретируемы и работают даже на «простых» моделях. А это значит — быстрое прототипирование, понятная отладка и доверие со стороны операторов.

P.S. Полный набор фич и архитектурных решений можно взять за основу при проектировании собственного pipeline’а. Особенно если вы используете Python, AirFlow и ClickHouse — всё это легко масштабируется под современные инфраструктуры геймдева.