Report System Design Document: система жалоб и борьбы с читерством в мультиплеерном extraction-шутере на примере S.T.A.L.K.E.R. 2

22-02-2026, 2:55
Просмотров: 2

Как сделать систему жалоб для борьбы с читерством в мультиплеерном extraction-шутере на примере S.T.A.L.K.E.R. 2 (Report System Design Document)

Время чтения: 50–70 минут
Тип документа: обзорный дизайн-документ (Game Design Document / Technical Design Document)
Уровень: от геймдизайнера до технического лида
Дата публикации: Февраль 2026

Этот документ описывает полную архитектуру системы репортов (жалоб) для многопользовательской игры в жанре extraction shooter с PvP/PvE-механиками. В качестве контекста используется вселенная S.T.A.L.K.E.R. 2 — с её аномалиями, артефактами, фракциями и хардкорной экономикой лута. Документ охватывает: типологию читов, UX подачи жалобы, серверную обработку, workflow модерации, систему санкций, апелляции, защиту от абьюза репортов, AI-ассистированную модерацию и специфику вселенной Зоны.

Документ написан как техническая спецификация, пригодная для передачи в разработку. Где необходимо — приводится псевдокод, структуры данных и ссылки на индустриальные практики.


Содержание

  1. Глава 1. Философия и принципы системы репортов
  2. Глава 2. Таксономия читов и нарушений
  3. Глава 3. Путь игрока при подаче репорта (Player Report Flow)
  4. Глава 4. Серверная обработка и конвейер жалоб (Report Processing Pipeline)
  5. Глава 5. Инструменты модератора и workflow ручной проверки
  6. Глава 6. Система санкций (Penalty Framework)
  7. Глава 7. Апелляции и защита от ложных жалоб
  8. Глава 8. AI и машинное обучение в системе репортов
  9. Глава 9. Специфика вселенной S.T.A.L.K.E.R. 2
  10. Глава 10. Античит-интеграция и серверная авторитетность
  11. Глава 11. Метрики и KPI системы репортов
  12. Глава 12. Коммуникация с сообществом
  13. Глава 13. Масштабирование и инфраструктура
  14. Глава 14. Ссылки и индустриальные практики



Глава 1. Философия и принципы системы репортов

1.1 Зачем нужна система репортов

В extraction-шутере ставки каждого рейда экстремально высоки. Игрок рискует снаряжением, собранным лутом, прогрессом персонажа. Один читер в лобби способен обесценить десятки часов игрового времени нескольких игроков. В отличие от классических аренных шутеров, где проигранный матч — это потеря рейтинга, в extraction-жанре проигранный рейд — это потеря реальных внутриигровых активов.

Система репортов выполняет несколько функций одновременно:

  • Канал обратной связи: игроки сигнализируют о проблемах, которые автоматика может пропустить.
  • Источник данных для античита: паттерны репортов помогают обнаруживать новые виды читов до того, как античит научится их детектить автоматически.
  • Психологический сдерживающий фактор: сама возможность пожаловаться снижает мотивацию к читерству (deterrence effect).
  • Инструмент доверия: игроки, видящие что их репорты приводят к результатам, сохраняют лояльность к игре.
  • Ловушка для false positives античита: если античит банит легитимного игрока, репорты (точнее, их отсутствие) могут служить дополнительным сигналом.

1.2 Ключевые принципы проектирования

Система репортов проектируется на основе следующих принципов:

Принцип 1: Presumption of Innocence (Презумпция невиновности). Ни один репорт сам по себе не является доказательством. Репорт — это сигнал, требующий верификации. Система никогда не наказывает на основании одного репорта без подтверждающих данных.

Принцип 2: Proportional Response (Пропорциональность санкций). Наказание соответствует тяжести нарушения и его повторности. Первое мелкое нарушение не приводит к перманентному бану.

Принцип 3: Transparency Within Limits (Прозрачность в разумных пределах). Игрок получает обратную связь о результатах своих репортов, но не получает деталей, которые могут помочь читерам обходить систему.

Принцип 4: Low Friction Reporting (Минимальное трение при подаче). Подача репорта должна занимать не более 15–30 секунд. Сложная форма = меньше репортов = меньше данных.

Принцип 5: Data-Driven Decisions (Решения на основе данных). Каждое решение модератора подкреплено объективными данными: серверными логами, реплеями, статистикой. Субъективное мнение модератора — последний фактор, а не первый.

Принцип 6: Abuse Resistance (Устойчивость к абьюзу). Система защищена от weaponized reporting — использования репортов как инструмента травли или манипуляции.

Принцип 7: Continuous Improvement (Непрерывное улучшение). Система собирает метрики о собственной эффективности и итерируется. Ложноположительные и ложноотрицательные решения анализируются и используются для калибровки.

1.3 Баланс между автоматикой и ручной модерацией

Индустриальная практика показывает, что оптимальная система использует трёхуровневую модель:

  1. Автоматический уровень (античит + ML): обрабатывает ~70–80% случаев. Очевидные читы (инъекция кода, модификация памяти) банятся автоматически без участия модератора. Время реакции: секунды–минуты.
  2. AI-ассистированный уровень: обрабатывает ~15–20% случаев. ML-модели анализируют поведение и статистику, формируют рекомендации для модераторов. Время реакции: минуты–часы.
  3. Ручная модерация: обрабатывает ~5–10% случаев. Сложные, неоднозначные ситуации, апелляции, новые типы читов. Время реакции: часы–дни.

Цель — минимизировать нагрузку на ручную модерацию без потери качества решений. Riot Games в своей системе для VALORANT сообщали, что автоматизация позволила сократить время от репорта до санкции с дней до часов (источник: Riot Games Tech Blog).




Глава 2. Таксономия читов и нарушений

Для extraction-шутера в сеттинге S.T.A.L.K.E.R. 2 актуальны следующие категории нарушений. Для каждой категории описано: механизм чита, как он выглядит глазами обычного игрока, почему он разрушителен, и какие данные помогают его обнаружить.

2.1 Аимбот (Aimbot)

Механизм: программа перехватывает управление прицелом и автоматически наводит его на хитбоксы противников. Варианты: hard aimbot (мгновенный snap на голову), soft aimbot (плавная коррекция прицела в радиусе N градусов), triggerbot (автоматический выстрел при наведении на хитбокс).

Глазами игрока: противник убивает с неестественной точностью. Каждый выстрел — хедшот. Прицел «прилипает» к голове даже при движении цели за укрытием. При просмотре killcam видно нечеловеческую реакцию: прицел мгновенно перескакивает с одной цели на другую.

Почему разрушителен: в extraction-шутере, где TTK (time-to-kill) и так низкий, аимбот делает любое столкновение безнадёжным. Игрок теряет снаряжение без шанса на контригру. Это самый деморализующий тип чита.

Данные для обнаружения:

  • Headshot rate значительно выше нормы (для данного оружия, дистанции, ранга)
  • Аномально низкий time-to-target (время от появления цели до первого попадания)
  • Паттерн движения прицела: отсутствие микрокоррекций, характерных для человека
  • Angular snap velocity — скорость поворота прицела при переключении между целями
  • Отсутствие «промахов» при стрельбе по движущимся целям

2.2 Wallhack / ESP (Extra Sensory Perception)

Механизм: чит отображает информацию, скрытую от обычного игрока: позиции противников через стены, их HP, оружие, содержимое контейнеров с лутом, позиции ценных артефактов. Технически реализуется через чтение памяти процесса или перехват рендеринга.

Глазами игрока: противник всегда знает, где вы находитесь. Он предварительно целится в точку, из-за которой вы выходите. Никогда не проверяет пустые углы — идёт напрямую к вам. В extraction-контексте: всегда находит самый ценный лут, идёт к контейнерам с редкими артефактами кратчайшим путём.

Почему разрушителен: в extraction-шутере информация — главный ресурс. Знание позиций противников и лута полностью уничтожает тактическую составляющую. В S.T.A.L.K.E.R. 2, где Зона полна скрытых опасностей, ESP превращает хардкорный survival в прогулку по парку.

Данные для обнаружения:

  • Pre-aim паттерны: игрок целится в стену на уровне головы противника за стеной
  • Аномально высокий процент «первых выстрелов» — игрок стреляет первым в большинстве перестрелок
  • Маршруты движения, коррелирующие с позициями скрытых объектов
  • Время нахождения лута значительно ниже среднего
  • Отсутствие «пустых» проверок помещений

2.3 Speedhack и Teleport

Механизм: манипуляция скоростью перемещения персонажа. Speedhack ускоряет движение (часто через модификацию game timer или скорости анимации). Teleport — мгновенное перемещение в произвольную точку карты через подмену координат.

Глазами игрока: противник перемещается с нечеловеческой скоростью или появляется из ниоткуда. В killcam видно, как он «пролетает» через карту. В extraction-контексте: мгновенно добирается до точки эвакуации с полным инвентарём.

Почему разрушителен: ломает всю тактическую составляющую позиционирования. В extraction-шутере контроль карты и маршрутов — ключевая механика. Speedhack делает невозможным засады, фланги, контроль чокпоинтов.

Данные для обнаружения:

  • Серверная валидация скорости перемещения (distance / time между тиками)
  • Телепортация: расстояние между двумя последовательными позициями превышает физически возможное
  • Аномально быстрое время прохождения рейда (от спавна до эвакуации)
  • Несоответствие клиентского и серверного времени (clock drift)

2.4 Дюп предметов (Item Duplication)

Механизм: эксплуатация ошибок в логике инвентаря или трейда для создания копий предметов. Типичные векторы: race condition при одновременном трейде и использовании предмета, манипуляция с disconnect/reconnect во время транзакции, эксплойт контейнеров (положить предмет → crash → предмет и в контейнере, и в инвентаре).

Глазами игрока: на рынке появляется аномальное количество редких предметов. Цены на артефакты падают. Новые аккаунты имеют снаряжение, которое невозможно получить за их игровое время.

Почему разрушителен: в extraction-шутере экономика — фундамент геймплея. Дюп обесценивает лут, уничтожает мотивацию к рейдам, разрушает экономический баланс. В S.T.A.L.K.E.R. 2 дюп редких артефактов (например, «Сердце Зоны» или аналогов) может сломать всю прогрессию.

Данные для обнаружения:

  • Экономические аномалии: резкий рост количества определённого предмета в обороте
  • Аудит транзакций: предмет с одним UUID существует в нескольких инвентарях
  • Паттерны disconnect/reconnect вокруг транзакций
  • Соотношение входящих и исходящих предметов у аккаунта

2.5 Эксплойты карты (Map Exploits)

Механизм: использование ошибок геометрии карты для получения нечестного преимущества. Включает: проникновение внутрь текстур (wallbreach), стрельбу через невидимые щели, доступ к недоступным зонам, использование позиций, где игрок невидим/неуязвим.

Глазами игрока: вас убивают из «стены» или из позиции, которая кажется недоступной. Противник стреляет, но его невозможно поразить в ответ. В S.T.A.L.K.E.R. 2: игрок находится внутри аномалии, которая должна наносить урон, но не наносит.

Почему разрушителен: создаёт позиции абсолютного преимущества. В extraction-контексте: игрок может безнаказанно контролировать точку эвакуации или зону с ценным лутом.

Данные для обнаружения:

  • Позиция игрока в невалидной геометрии (координаты вне navmesh)
  • Стрельба из позиции, где line-of-sight невозможен по геометрии карты
  • Длительное нахождение в зоне, наносящей урон, без получения урона
  • Heatmap позиций убийств — кластеры в аномальных точках

2.6 Тимкилл и гриферство (Teamkilling & Griefing)

Механизм: намеренное убийство союзников или саботаж команды. В extraction-шутере особенно болезненно: гриферство может включать кражу лута убитого союзника, намеренное привлечение мутантов/AI к позиции команды, блокировку выхода из помещения, использование гранат для нанесения урона союзникам.

Глазами игрока: союзник стреляет вам в спину после того, как вы нашли ценный артефакт. Или намеренно шумит, привлекая AI-врагов к вашей позиции. Или блокирует дверной проём, не давая выйти из здания.

Почему разрушителен: уничтожает доверие между игроками. В extraction-шутере, где кооперация критична для выживания, тимкилл делает групповую игру невозможной. Особенно токсично в S.T.A.L.K.E.R. 2, где потеря снаряжения перманентна.

Данные для обнаружения:

  • Friendly fire damage ratio (процент урона по союзникам от общего урона)
  • Kill-on-loot correlation: убийство союзника в радиусе N метров от ценного лута
  • Паттерн: убийство союзника → подбор его лута → эвакуация
  • Количество тимкиллов за сессию / за период

2.7 AFK-фарм и макросы

Механизм: автоматизация игровых действий для получения ресурсов без активного участия игрока. Макросы для автоматической стрельбы, движения по маршруту, сбора ресурсов. AFK-фарм: персонаж находится в безопасной зоне и получает пассивный доход (если механика это позволяет).

Глазами игрока: в рейде встречается игрок, который двигается по идеально повторяющемуся маршруту. Не реагирует на стимулы. Выполняет одни и те же действия с механической точностью.

Почему разрушителен: инфлирует экономику, занимает слоты в рейдах (другие игроки не могут зайти), обесценивает усилия честных игроков.

Данные для обнаружения:

  • Повторяемость маршрутов (entropy анализ траектории)
  • Отсутствие реакции на внешние стимулы (выстрелы, аномалии)
  • Идеально равные интервалы между действиями (отсутствие человеческой вариативности)
  • Аномально длинные сессии без перерывов

2.8 Нетворк-манипуляции (Lag Switch, Desync Abuse)

Механизм: намеренное создание задержки сетевого соединения для получения преимущества. Lag switch: физическое или программное прерывание соединения на короткий период, после чего сервер «проигрывает» накопленные действия. Desync abuse: эксплуатация разницы между клиентским и серверным состоянием.

Глазами игрока: противник «телепортируется» на короткие расстояния. Вы попадаете по нему, но урон не регистрируется. Он появляется за вашей спиной, хотя секунду назад был перед вами.

Почему разрушителен: делает перестрелки непредсказуемыми. Peeker’s advantage (преимущество атакующего из-за сетевой задержки) усиливается до абсурда.

Данные для обнаружения:

  • Паттерны пинга: резкие скачки с последующим возвратом к норме (характерно для lag switch)
  • Packet loss паттерны: периодические, а не случайные потери пакетов
  • Корреляция между скачками пинга и агрессивными действиями (убийствами)
  • Jitter analysis: стабильный пинг с периодическими «провалами» фиксированной длительности

2.9 Реальные деньги и RMT (Real Money Trading)

Механизм: продажа внутриигровых предметов, валюты или услуг (буст, carry) за реальные деньги вне официальных каналов. Часто связано с ботоводством и дюпом как источниками товара.

Глазами игрока: на сторонних сайтах продаются артефакты и снаряжение. В игре встречаются аккаунты с подозрительным поведением: передача больших объёмов ценных предметов между аккаунтами разного уровня.

Почему разрушителен: создаёт экономический стимул для всех остальных видов читерства. RMT — это «бизнес-модель» читеров. Без спроса на RMT мотивация к массовому читерству значительно снижается.

Данные для обнаружения:

  • Аномальные паттерны трейда: односторонние передачи ценных предметов
  • Графовый анализ: сети аккаунтов, связанных трейдами
  • Аккаунты-«мулы»: низкий уровень, минимальная активность, но большой объём трейдов
  • Корреляция с внешними данными: мониторинг RMT-сайтов

2.10 No-Recoil / No-Spread (Убирание отдачи и разброса)

Механизм: программная компенсация отдачи оружия и/или устранение разброса пуль. Реализуется через модификацию значений recoil pattern в памяти клиента или через макросы, автоматически компенсирующие отдачу движением мыши. Более продвинутые варианты — silent aim: пули летят в цель независимо от положения прицела на экране (серверная коррекция траектории).

Глазами игрока: противник стреляет длинными очередями с идеальной точностью. Оружие, которое в норме имеет сильную отдачу (например, автомат Калашникова), ведёт себя как лазер. При просмотре killcam прицел противника не поднимается при стрельбе или поднимается неестественно плавно.

Почему разрушителен: в тактическом шутере управление отдачей — один из ключевых навыков. No-recoil превращает любое оружие в снайперскую винтовку, обесценивая мастерство честных игроков. В S.T.A.L.K.E.R. 2, где оружие реалистично и имеет выраженную отдачу, эффект особенно заметен.

Данные для обнаружения:

  • Recoil compensation pattern: серверный анализ движения прицела во время стрельбы. У человека компенсация отдачи неидеальна и имеет вариативность. У чита — идеально зеркальная recoil pattern
  • Spread analysis: процент попаданий при длинных очередях значительно выше нормы для данного оружия
  • Burst accuracy: точность не деградирует с длиной очереди (у человека — деградирует)
  • Mouse movement correlation: движение мыши идеально коррелирует с recoil pattern оружия (для макросов)
  • Input timing: интервалы между корректирующими движениями мыши подозрительно равномерны

2.11 Radar Hack / Packet Sniffing

Механизм: перехват и декодирование сетевых пакетов между клиентом и сервером для извлечения информации о позициях других игроков, лута и событий. В отличие от классического wallhack, radar hack не модифицирует клиент игры — он работает как отдельное приложение (часто на втором устройстве), перехватывая трафик. Это делает его невидимым для клиентского античита.

Глазами игрока: идентично wallhack/ESP — противник всегда знает ваши позиции. Но radar hack сложнее обнаружить, потому что клиент игры не модифицирован. Часто используется на втором мониторе или даже на телефоне, отображая мини-карту с позициями всех игроков.

Почему разрушителен: radar hack стал главной проблемой Escape from Tarkov в 2022–2023 годах. Он даёт полную информацию о карте без риска обнаружения клиентским античитом. В extraction-шутере, где информация — ключевой ресурс, это катастрофично.

Данные для обнаружения:

  • Шифрование трафика: главная защита — полное шифрование клиент-серверного трафика (TLS/DTLS). Если трафик зашифрован, packet sniffing бесполезен
  • Server-side visibility culling: если сервер не отправляет данные о невидимых игроках, перехватывать нечего (см. главу 10)
  • Поведенческий анализ: те же паттерны, что и для wallhack (pre-aim, оптимальные маршруты к скрытому луту)
  • Сетевой анализ: детекция подозрительных процессов, перехватывающих сетевой трафик (на уровне kernel-level античита)
  • Packet integrity: добавление в пакеты checksum и sequence numbers, затрудняющих replay и injection

Критически важно: radar hack — единственный тип чита, от которого server-side visibility culling является не просто улучшением, а необходимым условием защиты. Без culling никакой античит не может полностью предотвратить radar hack.

2.12 Сводная таблица: читы, обнаружение, импакт

Тип нарушенияСложность обнаруженияИмпакт на игровой опытОсновной метод детекцииТипичная санкция
АимботСредняяКритическийСтатистика + MLПерманентный бан
Wallhack / ESPВысокаяКритическийПоведенческий анализПерманентный бан
SpeedhackНизкаяКритическийСерверная валидацияПерманентный бан
Дюп предметовСредняяКритический (экономика)Аудит транзакцийБан + откат
Map ExploitsСредняяВысокийПозиционная валидацияПредупреждение → бан
Тимкилл / ГриферствоНизкаяВысокийЛоги уронаПредупреждение → бан
AFK-фарм / МакросыСредняяСреднийПоведенческий анализПредупреждение → бан
Lag SwitchВысокаяВысокийСетевая телеметрияПредупреждение → бан
RMTВысокаяСредний (косвенный)Графовый анализ трейдовПерманентный бан
No-Recoil / No-SpreadСредняяВысокийRecoil pattern analysis + MLПерманентный бан
Radar HackОчень высокаяКритическийTraffic encryption + поведенческий анализПерманентный бан



Глава 3. Путь игрока при подаче репорта (Player Report Flow)

3.1 Точки входа в систему репортов

Игрок должен иметь возможность подать репорт из нескольких контекстов. Каждая точка входа оптимизирована под свой сценарий:

Точка входа 1: Во время рейда (In-Raid Report).

  • Доступ: через killcam после смерти или через меню паузы → список игроков в рейде
  • Контекст: игрок только что столкнулся с подозрительным поведением, эмоции свежие
  • Требование: минимальная форма, 2–3 нажатия. Не должна мешать геймплею (если игрок жив)
  • Автоматически прикрепляется: последние 60 секунд серверного реплея, killcam данные

Точка входа 2: Экран результатов рейда (Post-Raid Report).

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

Точка входа 3: Главное меню / Профиль игрока (Deferred Report).

  • Доступ: через историю матчей → выбор рейда → список участников → репорт. Или через поиск по никнейму
  • Контекст: игрок решил пожаловаться позже, возможно после просмотра реплея
  • Ограничение: репорт возможен в течение 72 часов после рейда
  • Автоматически прикрепляется: полный реплей доступен для просмотра перед подачей

Точка входа 4: Внешний канал (Out-of-Game Report).

  • Доступ: веб-форма на официальном сайте, интеграция с Discord-ботом
  • Контекст: для случаев, когда игрок не может подать репорт в игре (краш, технические проблемы) или хочет приложить внешние доказательства (видео)
  • Требование: авторизация через игровой аккаунт, указание match ID

3.2 Форма репорта: что заполняет игрок

Форма репорта состоит из обязательных и опциональных полей:

Обязательные поля:

  1. Reported Player — выбирается автоматически (из killcam) или вручную из списка участников рейда
  2. Category — категория нарушения (выбор из списка):
    • Cheating: Aimbot / Aim Assist
    • Cheating: Wallhack / ESP
    • Cheating: Speed / Teleport
    • Cheating: Item Duplication
    • Cheating: No-Recoil / No-Spread
    • Cheating: Radar / Information Hack
    • Exploiting: Map Glitch
    • Exploiting: Game Mechanic Abuse
    • Griefing: Teamkilling
    • Griefing: Intentional Sabotage
    • Griefing: AFK / Not Playing
    • Harassment: Voice Chat
    • Harassment: Text Chat
    • Other (requires description)

Опциональные поля:

  1. Description — свободное текстовое описание (до 500 символов). Подсказка: «Опишите, что произошло и почему вы считаете это нарушением»
  2. Timestamp Marker — игрок может отметить конкретный момент в реплее («Это произошло здесь»)
  3. Additional Evidence — загрузка скриншота или короткого видео (до 30 секунд, до 50 МБ)

Важный UX-принцип: категория — это единственное обязательное действие помимо нажатия кнопки «Report». Описание поощряется, но не требуется. Исследования Riot Games показали, что обязательное текстовое поле снижает количество репортов на 40%, при этом качество текстовых описаний в обязательных полях значительно ниже, чем в опциональных (источник: GDC 2023, «Player Behavior Systems at Scale»).

3.3 Автоматический сбор данных при подаче репорта

Помимо данных, введённых игроком, система автоматически собирает и прикрепляет к репорту:

  • Match ID — уникальный идентификатор рейда
  • Server Replay Segment — серверный реплей: 120 секунд до и 30 секунд после события (killcam или момента подачи репорта). Серверный реплей — авторитетный, не может быть модифицирован клиентом
  • Reporter Position & Reported Position — координаты обоих игроков на карте в момент события
  • Kill Event Data — если репорт связан с убийством: оружие, дистанция, часть тела, время между выстрелами
  • Reported Player Stats (this raid) — K/D, headshot %, damage dealt, loot collected, distance traveled
  • Reported Player Stats (historical) — агрегированная статистика за последние 50 рейдов
  • Network Telemetry — пинг, packet loss, jitter обоих игроков в момент события
  • Reporter Trust Score — текущий рейтинг доверия репортящего игрока (см. главу 7)
  • Anti-Cheat Flags — любые флаги, уже выставленные античитом на reported player
  • Chat Logs — логи текстового и голосового чата (если применимо) за последние 5 минут

3.4 Подтверждение и обратная связь игроку

После подачи репорта игрок видит:

  1. Немедленное подтверждение: «Your report has been submitted. Report ID: #RPT-2026-XXXXX»
  2. Ожидание: «We review every report. You’ll be notified if action is taken.»
  3. Результат (асинхронно): через систему уведомлений в игре: «Action has been taken against a player you reported. Thank you for helping keep the Zone fair.» — без деталей о конкретном наказании (privacy + anti-gaming)

Важно: игрок НЕ получает информацию о том, какое именно наказание было применено. Это стандартная практика (Riot Games, Blizzard, Bungie) — предотвращает «калибровку» репортов под конкретные пороги.

3.5 Структура данных репорта (псевдокод)

Report {
  report_id:          UUID
  created_at:         Timestamp
  status:             Enum [SUBMITTED, IN_REVIEW, RESOLVED, DISMISSED, APPEALED]

  // Участники
  reporter: {
    player_id:        UUID
    trust_score:      Float [0.0 - 1.0]
    account_age:      Duration
    total_reports_submitted: Int
    false_report_rate: Float
  }

  reported_player: {
    player_id:        UUID
    display_name:     String
    account_age:      Duration
    prior_offenses:   Int
    current_sanctions: List<Sanction>
    anti_cheat_flags:  List<ACFlag>
  }

  // Контекст
  match_context: {
    match_id:         UUID
    map:              String
    game_mode:        Enum [EXTRACTION, PVP_ARENA, PVE_RAID]
    match_duration:   Duration
    player_count:     Int
    server_region:    String
  }

  // Данные от игрока
  player_input: {
    category:         Enum [AIMBOT, WALLHACK, SPEEDHACK, DUPE, NO_RECOIL,
                            RADAR_HACK, MAP_EXPLOIT, MECHANIC_ABUSE,
                            TEAMKILL, SABOTAGE, AFK,
                            VOICE_HARASSMENT, TEXT_HARASSMENT, OTHER]
    description:      Optional<String>  // max 500 chars
    timestamp_marker: Optional<Timestamp>
    evidence_urls:    Optional<List<URL>>
  }

  // Автоматически собранные данные
  auto_collected: {
    replay_segment: {
      replay_id:      UUID
      start_time:     Timestamp  // event - 120s
      end_time:       Timestamp  // event + 30s
      server_tick_range: Range<Int>
    }
    kill_event:       Optional<KillEvent>
    positions: {
      reporter:       Vec3
      reported:       Vec3
    }
    reported_stats_raid: PlayerRaidStats
    reported_stats_historical: PlayerHistoricalStats
    network_telemetry: {
      reporter_ping:  Int  // ms
      reported_ping:  Int
      reported_packet_loss: Float
      reported_jitter: Float
    }
    chat_logs:        List<ChatMessage>
    anti_cheat_flags: List<ACFlag>
  }

  // Результат обработки
  resolution: Optional<{
    resolved_at:      Timestamp
    resolved_by:      Enum [AUTO, AI_ASSISTED, MODERATOR]
    moderator_id:     Optional<UUID>
    verdict:          Enum [CONFIRMED, INSUFFICIENT_EVIDENCE, FALSE_REPORT, DUPLICATE]
    sanction_applied: Optional<Sanction>
    internal_notes:   String
  }>
}



Глава 4. Серверная обработка и конвейер жалоб (Report Processing Pipeline)

4.1 Этап 1: Валидация и дедупликация

Каждый входящий репорт проходит первичную валидацию:

  • Проверка легитимности: reporter и reported player действительно были в одном рейде. Match ID существует и не старше 72 часов
  • Rate limiting: один игрок не может подать более 5 репортов за 24 часа (предотвращает спам)
  • Дедупликация: если на одного игрока в одном рейде подано несколько репортов, они объединяются в один кейс (case). Каждый дополнительный репорт увеличивает приоритет кейса
  • Self-report filter: игрок не может пожаловаться на самого себя
  • Cooldown: один игрок не может подать два репорта на одного и того же игрока в течение 24 часов
function validate_report(report):
  if report.match_context.match_id not in valid_matches:
    return REJECT("Invalid match ID")

  if time_since(report.match_context.end_time) > 72_HOURS:
    return REJECT("Report window expired")

  if report.reporter.player_id == report.reported_player.player_id:
    return REJECT("Cannot report yourself")

  if count_reports_last_24h(report.reporter.player_id) >= 5:
    return REJECT("Daily report limit reached")

  if has_recent_report(report.reporter.player_id,
                       report.reported_player.player_id, 24_HOURS):
    return REJECT("Cooldown active for this player pair")

  existing_case = find_case(report.reported_player.player_id,
                            report.match_context.match_id)
  if existing_case:
    existing_case.add_report(report)
    existing_case.recalculate_priority()
    return MERGE(existing_case)

  return ACCEPT(create_case(report))

4.2 Этап 2: Автоматическая приоритизация (Scoring)

Каждый кейс получает числовой приоритет (priority score), определяющий порядок обработки. Скоринг учитывает множество факторов:

function calculate_priority(case):
  score = 0.0

  // Фактор 1: Количество независимых репортов на этого игрока в этом рейде
  score += case.report_count * 15.0  // каждый доп. репорт = +15

  // Фактор 2: Trust Score репортящих
  avg_trust = average(r.reporter.trust_score for r in case.reports)
  score += avg_trust * 20.0  // высокий trust = высокий приоритет

  // Фактор 3: Категория нарушения (severity weight)
  severity_weights = {
    AIMBOT: 25, WALLHACK: 25, SPEEDHACK: 30, DUPE: 30,
    NO_RECOIL: 20, RADAR_HACK: 25,
    MAP_EXPLOIT: 15, MECHANIC_ABUSE: 15, TEAMKILL: 10,
    SABOTAGE: 10, AFK: 5, VOICE_HARASSMENT: 10,
    TEXT_HARASSMENT: 10, OTHER: 5
  }
  score += severity_weights[case.primary_category]

  // Фактор 4: Существующие флаги античита
  if case.reported_player.anti_cheat_flags:
    score += 30.0  // античит уже что-то заметил

  // Фактор 5: История нарушений reported player
  score += case.reported_player.prior_offenses * 10.0

  // Фактор 6: Количество репортов на этого игрока за последние 7 дней
  // (из разных рейдов, от разных игроков)
  recent_reports = count_unique_reporters_last_7d(case.reported_player.player_id)
  score += recent_reports * 8.0

  // Фактор 7: Статистические аномалии
  if case.reported_stats_historical.headshot_rate > percentile_99:
    score += 20.0
  if case.reported_stats_historical.kd_ratio > percentile_99:
    score += 15.0
  if case.reported_stats_historical.survival_rate > percentile_99:
    score += 10.0

  // Фактор 8: Возраст аккаунта (новые аккаунты подозрительнее)
  if case.reported_player.account_age < 7_DAYS:
    score += 15.0
  elif case.reported_player.account_age < 30_DAYS:
    score += 5.0

  return clamp(score, 0, 200)

Кейсы с приоритетом выше порога (например, 80) попадают в fast-track очередь. Кейсы с приоритетом ниже 20 помещаются в low-priority очередь и обрабатываются в фоновом режиме.

4.3 Этап 3: AI-предварительный анализ

Перед попаданием в очередь модерации кейс проходит через AI-анализатор, который формирует предварительное заключение:

  • Replay Analysis: ML-модель анализирует серверный реплей на предмет аномалий (см. главу 8)
  • Statistical Analysis: сравнение метрик reported player с распределением для его ранга/уровня
  • Text Analysis: NLP-анализ описания репорта (если есть) для извлечения ключевых деталей
  • Cross-Reference: проверка, не был ли этот игрок уже отмечен другими системами

AI формирует структурированный отчёт:

AIAnalysis {
  confidence:       Float [0.0 - 1.0]
  verdict_suggestion: Enum [LIKELY_CHEATING, SUSPICIOUS, INCONCLUSIVE, LIKELY_CLEAN]
  detected_anomalies: List<{
    type:           String  // "aim_snap", "pre_aim", "speed_violation", etc.
    timestamp:      Timestamp
    severity:       Float
    description:    String
  }>
  statistical_flags: List<{
    metric:         String
    player_value:   Float
    expected_range: Range<Float>
    percentile:     Float
  }>
  recommended_action: Enum [AUTO_BAN, ESCALATE_TO_MODERATOR, LOW_PRIORITY, DISMISS]
  reasoning:        String  // human-readable объяснение для модератора
}

Если AI-confidence > 0.95 и verdict = LIKELY_CHEATING, и категория — аимбот или speedhack, система может применить автоматический бан без участия модератора (с обязательной пометкой для последующего аудита). Это допустимо только для категорий, где false positive rate модели доказанно ниже 0.1%.

4.4 Этап 4: Маршрутизация в очередь модерации

Кейсы распределяются по очередям модерации на основе приоритета и категории:

  • Queue: Critical (priority > 100) — SLA: 2 часа. Назначается старшему модератору
  • Queue: High (priority 60–100) — SLA: 12 часов
  • Queue: Medium (priority 30–60) — SLA: 48 часов
  • Queue: Low (priority < 30) — SLA: 7 дней. Может обрабатываться AI без ручной проверки, если AI confidence > 0.8 и verdict = LIKELY_CLEAN

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

4.5 Полная схема конвейера (псевдокод)

function process_incoming_report(report):
  // Этап 1: Валидация
  validation_result = validate_report(report)
  if validation_result.status == REJECT:
    return notify_reporter(report.reporter, validation_result.reason)
  case = validation_result.case

  // Этап 2: Приоритизация
  case.priority = calculate_priority(case)

  // Этап 3: AI-анализ (асинхронный, но быстрый — target < 60s) ai_analysis = await ai_analyze(case) case.ai_analysis = ai_analysis // Автоматическое решение для очевидных случаев if ai_analysis.recommended_action == AUTO_BAN: if ai_analysis.confidence > 0.95:
      apply_sanction(case.reported_player, AUTO_BAN, requires_audit=True)
      case.status = RESOLVED
      case.resolution.resolved_by = AUTO
      notify_reporter(report.reporter, "Action taken")
      return

  if ai_analysis.recommended_action == DISMISS:
    if ai_analysis.confidence > 0.9 and case.priority < 20:
      case.status = DISMISSED
      case.resolution.resolved_by = AUTO
      return

  // Этап 4: Маршрутизация
  queue = determine_queue(case.priority, case.primary_category)
  enqueue(case, queue)
  assign_moderator(case, queue)



Глава 5. Инструменты модератора и workflow ручной проверки

5.1 Панель модератора: ключевые компоненты

Модератор работает в специализированном внутреннем инструменте (Admin Panel / Moderation Dashboard), который включает:

  • Case Queue: список кейсов, отсортированных по приоритету, с фильтрами по категории, региону, статусу
  • Case Detail View: полная информация о кейсе: все репорты, AI-анализ, статистика, реплей
  • Replay Viewer: встроенный просмотрщик серверного реплея с инструментами анализа
  • Player Profile: полный профиль reported player: история, статистика, предыдущие санкции, связанные аккаунты
  • Action Panel: интерфейс для применения санкций с обязательным обоснованием
  • Communication Tools: шаблоны для уведомления игроков о решениях

5.2 Replay Viewer — просмотр серверного реплея

Replay Viewer — ключевой инструмент модератора. Он воспроизводит серверный реплей (не клиентский!) с дополнительными overlay-данными:

  • Свободная камера: модератор может смотреть с любой точки, не ограничен POV игрока
  • X-Ray Mode: отображение всех игроков через стены (для проверки wallhack — видно, коррелирует ли прицел reported player с позициями скрытых противников)
  • Aim Trace: визуализация траектории прицела с цветовой кодировкой скорости движения. Snap-повороты подсвечиваются красным
  • Hit Registration Overlay: каждое попадание отображается с данными: часть тела, расстояние, угол
  • Speed Overlay: текущая скорость перемещения игрока. Превышение максимальной подсвечивается
  • Timeline Markers: AI-анализ отмечает подозрительные моменты на таймлайне, модератор может быстро перейти к ним
  • Slow Motion / Frame-by-Frame: замедление и покадровый просмотр для анализа микро-движений
  • Comparison View: side-by-side сравнение поведения reported player с «эталонным» поведением игрока аналогичного уровня

Серверный реплей критически важен именно потому, что он авторитетен. Клиентский реплей может быть модифицирован читом. Серверный реплей записывается на стороне сервера и содержит только данные, прошедшие серверную валидацию.

5.3 Статистический профиль игрока

Модератор видит развёрнутый профиль reported player:

  • Lifetime Stats: общая статистика за всё время игры
  • Trend Analysis: графики ключевых метрик во времени. Резкое улучшение показателей (например, headshot rate вырос с 15% до 60% за день) — красный флаг
  • Percentile Ranking: каждая метрика показана в контексте распределения для данного ранга. «Headshot rate: 58% — 99.7th percentile for this skill bracket»
  • Session Analysis: метрики по сессиям — позволяет увидеть, включается ли чит в определённые сессии
  • Hardware Fingerprint: информация об оборудовании (для выявления связанных аккаунтов)
  • Report History: сколько раз на этого игрока жаловались, по каким категориям, с каким результатом
  • Economic Profile: инвентарь, история трейдов, баланс валюты, аномалии в экономическом поведении

5.4 Workflow принятия решения

Модератор следует структурированному процессу:

  1. Ознакомление с кейсом: чтение AI-анализа, просмотр репортов, оценка приоритета (2–3 минуты)
  2. Просмотр реплея: фокус на моментах, отмеченных AI и репортящими. Использование overlay-инструментов (5–15 минут)
  3. Анализ статистики: проверка, подтверждают ли долгосрочные данные подозрения (2–5 минут)
  4. Принятие решения: модератор выбирает один из вердиктов:
    • Confirmed Violation: нарушение подтверждено → выбор санкции
    • Insufficient Evidence: подозрительно, но недостаточно данных → кейс закрывается, но reported player помечается для усиленного мониторинга
    • False Report: нарушения нет → кейс закрывается, trust score репортящего корректируется
    • Escalate: кейс сложный, требует второго мнения или доступа к дополнительным инструментам
  5. Обоснование: модератор обязан написать краткое обоснование решения (для аудита и обучения)
  6. Применение санкции: если нарушение подтверждено — выбор и применение санкции из матрицы (см. главу 6)

5.5 Эскалация и коллегиальные решения

Некоторые кейсы требуют эскалации:

  • Перманентный бан: для аккаунтов старше 6 месяцев или с покупками — требуется подтверждение второго модератора
  • Стримеры и публичные фигуры: кейсы с участием известных игроков эскалируются к senior-модератору (повышенный риск как ложного обвинения, так и реального читерства с публичными последствиями)
  • Массовые инциденты: если один игрок получил >20 репортов за сессию — эскалация к лиду модерации
  • Новые типы читов: если модератор видит подозрительное поведение, не попадающее в существующие категории — эскалация к античит-команде

5.6 Выгорание модераторов и контроль качества решений

Модерация — психологически тяжёлая работа. Модератор ежедневно просматривает десятки кейсов, принимает решения с высокими ставками (бан = потеря аккаунта для игрока), сталкивается с токсичным контентом в чат-логах. Без системы защиты от выгорания качество решений деградирует.

Признаки деградации качества:

  • Рост appeal success rate для решений конкретного модератора
  • Снижение среднего времени на кейс (модератор «штампует» решения)
  • Рост доли решений «Insufficient Evidence» (модератор избегает ответственности)
  • Рост доли решений «Confirmed» без достаточного обоснования (модератор перестраховывается)

Меры предотвращения:

  • Лимит кейсов: не более 50 кейсов в день на модератора. При достижении 40 — предупреждение. При 50 — блокировка очереди до следующего дня
  • Обязательные перерывы: после каждых 10 кейсов — 15-минутный перерыв. Система блокирует доступ к очереди на это время
  • Ротация категорий: модератор не должен работать только с одной категорией (например, только харассмент). Ротация снижает эмоциональную нагрузку
  • Peer review: 10% решений каждого модератора случайным образом проверяются другим модератором. Результаты влияют на оценку качества
  • Калибровочные кейсы: периодически в очередь подмешиваются кейсы с известным правильным ответом (как в системе Overwatch CS:GO). Это позволяет объективно измерять точность модератора
  • Психологическая поддержка: доступ к психологу для модераторов, работающих с токсичным контентом. Это стандартная практика в крупных компаниях (Meta, Google, Riot Games)

Метрики качества модератора:

ModeratorQualityMetrics {
  moderator_id:           UUID
  period:                 DateRange

  // Объём
  cases_reviewed:         Int
  avg_time_per_case:      Duration

  // Точность
  appeal_rate:            Float    // % решений, по которым подана апелляция
  appeal_overturn_rate:   Float    // % апелляций, удовлетворённых
  calibration_accuracy:   Float    // % правильных ответов на калибровочные кейсы
  peer_review_agreement:  Float    // % совпадений с peer reviewer

  // Распределение решений
  confirmed_rate:         Float
  insufficient_rate:      Float
  false_report_rate:      Float
  escalation_rate:        Float

  // Здоровье
  avg_cases_per_day:      Float
  max_cases_in_day:       Int
  breaks_taken:           Int
  consecutive_days_worked: Int
}



Глава 6. Система санкций (Penalty Framework)

6.1 Уровни наказаний

Система санкций построена по принципу прогрессивного наказания (progressive discipline). Каждый уровень применяется в зависимости от тяжести нарушения и истории игрока:

Уровень 0: Warning (Предупреждение).

  • Внутриигровое уведомление: «Your behavior in a recent raid has been flagged. Continued violations may result in penalties.»
  • Не влияет на геймплей
  • Записывается в историю аккаунта
  • Применяется для: первое мелкое нарушение (AFK, единичный тимкилл без паттерна)

Уровень 1: Temporary Restriction (Временное ограничение).

  • Ограничение функциональности: mute в голосовом/текстовом чате, запрет на трейд, ограничение на групповую игру
  • Длительность: 24 часа — 7 дней
  • Применяется для: повторное мелкое нарушение, единичный случай харассмента в чате

Уровень 2: Temporary Ban (Временный бан).

  • Полный запрет на вход в мультиплеерные режимы
  • Длительность: 24 часа → 3 дня → 7 дней → 14 дней → 30 дней (прогрессивная шкала при повторных нарушениях)
  • Игрок видит при попытке входа: «Your account has been temporarily suspended until [DATE]. Reason: [CATEGORY]. If you believe this is an error, you may submit an appeal.»
  • Применяется для: подтверждённое гриферство, повторные нарушения, первичное использование мягких эксплойтов

Уровень 3: Permanent Ban (Перманентный бан).

  • Полный и бессрочный запрет на мультиплеер
  • Аккаунт помечается в системе, HWID и IP логируются
  • Применяется для: подтверждённое использование читов (аимбот, wallhack, speedhack), повторный дюп после предупреждения, систематическое RMT
  • Требует подтверждения второго модератора для аккаунтов старше 6 месяцев

Уровень 4: Permanent Ban + Progress Rollback (Перманентный бан с откатом прогресса).

  • Всё из уровня 3, плюс полный откат прогресса аккаунта
  • Применяется для: массовый дюп, RMT-операции с большим объёмом, организованное читерство
  • Откат может затрагивать связанные аккаунты (получатели дюпнутых предметов)

Уровень 5: HWID Ban (Аппаратный бан).

  • Бан привязывается к аппаратному идентификатору устройства, а не только к аккаунту
  • Создание нового аккаунта на том же устройстве приводит к автоматическому бану
  • Применяется для: повторное создание аккаунтов после перманентного бана, профессиональные RMT-операции

6.2 Матрица нарушений и санкций

Матрица определяет, какая санкция применяется при каком нарушении с учётом истории:

Нарушение1-е нарушение2-е нарушение3-е нарушение4+ нарушение
Аимбот / Wallhack / Speedhack / Radar HackПерманентный банHWID бан
No-Recoil / No-SpreadПерманентный банHWID бан
Дюп предметовБан 30 дней + откатПерманентный бан + откатHWID бан
Map Exploit (критический)Бан 7 днейБан 30 днейПерманентный бан
Map Exploit (мелкий)ПредупреждениеБан 3 дняБан 14 днейБан 30 дней
Тимкилл (единичный)ПредупреждениеБан 24 часаБан 7 днейБан 30 дней
Тимкилл (систематический)Бан 3 дняБан 14 днейПерманентный бан
AFK-фарм / МакросыПредупреждение + откатБан 7 дней + откатБан 30 днейПерманентный бан
Lag SwitchБан 14 днейПерманентный банHWID бан
RMT (покупатель)Бан 7 дней + откат покупкиБан 30 дней + полный откатПерманентный бан
RMT (продавец)Перманентный бан + откатHWID бан
Харассмент (текст/голос)Mute 24 часаMute 7 днейБан 7 днейБан 30 дней

Важное правило: для «хардкорных» читов (аимбот, wallhack, speedhack) применяется политика zero tolerance — перманентный бан с первого подтверждённого нарушения. Это индустриальный стандарт для competitive/extraction игр (Escape from Tarkov, VALORANT, Destiny 2).

6.3 Откат прогресса и экономические санкции

Откат прогресса — критически важный инструмент для extraction-жанра, где экономика является фундаментом геймплея:

Типы отката:

  • Targeted Rollback (точечный откат): откат конкретных транзакций. Например, удаление дюпнутых предметов из инвентаря и со всех аккаунтов, куда они были переданы. Требует полного аудит-лога всех транзакций с предметами
  • Session Rollback (откат сессии): откат всех результатов конкретных рейдов, в которых было зафиксировано нарушение. Лут, полученный в этих рейдах, удаляется; потерянное снаряжение — не восстанавливается (читер уже получил нечестное преимущество)
  • Full Rollback (полный откат): сброс аккаунта до состояния на определённую дату или до нуля. Применяется в крайних случаях

Каскадный откат:

При дюпе предметов необходимо отследить всю цепочку передачи дюпнутых предметов. Каждый предмет имеет уникальный UUID и полную историю транзакций:

function cascade_rollback(duped_item_uuid):
  // Найти все копии предмета (у оригинала и дюпов будет общий origin)
  all_copies = find_all_copies(duped_item_uuid)

  for copy in all_copies:
    current_holder = get_current_holder(copy)
    transaction_chain = get_transaction_history(copy)

    // Удалить предмет
    remove_item(copy)

    // Если текущий держатель — не читер и не знал о дюпе,
    // компенсировать (если он заплатил за предмет легитимной валютой)
    if current_holder != cheater_id:
      if was_purchased_legitimately(transaction_chain, current_holder):
        compensate_player(current_holder, estimated_value(copy))
        notify_player(current_holder,
          "An item in your inventory was found to be illegitimately duplicated. "
          "It has been removed and you have been compensated with [X] currency.")

Компенсация невинным игрокам, пострадавшим от каскадного отката, — важный элемент. Без неё система наказывает не только читера, но и его жертв, что разрушает доверие к системе.

6.4 Shadow-системы: теневой бан и читерский пул

Помимо явных санкций, система использует скрытые механизмы:

Shadow Ban (Теневой бан):

  • Игрок не знает, что забанен. Он может заходить в игру, но матчмейкинг подбирает ему только других shadow-banned игроков
  • Цель: собрать дополнительные данные о поведении читера, не спугнув его. Читер продолжает использовать чит, система записывает всё для анализа и улучшения детекции
  • Длительность: обычно 24–72 часа, после чего применяется явная санкция
  • Индустриальный пример: Respawn Entertainment использовала shadow ban в Apex Legends для сбора данных о новых читах перед ban wave

Cheater Pool (Читерский пул):

  • Расширенная версия shadow ban. Подозрительные игроки матчатся друг с другом
  • Применяется, когда уверенность в нарушении высокая (>70%), но недостаточная для бана
  • Игрок может выйти из читерского пула, если его поведение нормализуется (например, перестал использовать чит)
  • Индустриальный пример: Rockstar Games использует «Bad Sport Lobbies» в GTA Online; Titanfall использовал «The Pit» для читеров

Soft Penalties (Мягкие санкции):

  • Снижение приоритета в матчмейкинге (дольше ожидание)
  • Ограничение на трейд (нельзя передавать предметы другим игрокам)
  • Снижение лут-рейтов (спорная мера, используется редко)
  • Пометка в профиле, видимая другим игрокам: «This player has recent conduct violations» (как в Dota 2 behavior score)

6.5 HWID-бан и обход банов

HWID (Hardware ID) бан — последний рубеж защиты от рецидивистов:

Что включает HWID-fingerprint:

  • Серийные номера компонентов: CPU, GPU, материнская плата, RAM, HDD/SSD
  • MAC-адреса сетевых интерфейсов
  • Идентификаторы Windows (ProductId, MachineGuid)
  • Комбинация нескольких параметров создаёт составной fingerprint, устойчивый к замене отдельных компонентов

Проблемы HWID-бана:

  • HWID-спуферы: существуют программы, подменяющие аппаратные идентификаторы. Гонка вооружений: античит детектит спуферы, спуферы обновляются
  • Shared hardware: в интернет-кафе или при покупке б/у оборудования невинный игрок может получить HWID-бан. Необходим механизм апелляции
  • Privacy concerns: сбор аппаратных данных вызывает вопросы приватности. Необходимо хэширование и минимизация хранимых данных

Многоуровневая идентификация:

function check_ban_evasion(player):
  // Уровень 1: Прямое совпадение аккаунта
  if player.account_id in banned_accounts:
    return BAN_EVASION

  // Уровень 2: HWID
  hwid_hash = compute_hwid_hash(player.hardware_info)
  if hwid_hash in banned_hwids:
    return BAN_EVASION

  // Уровень 3: IP-кластер (осторожно — NAT, VPN)
  if player.ip in banned_ips AND not is_shared_ip(player.ip):
    flag_for_review(player, "IP match with banned account")

  // Уровень 4: Поведенческий fingerprint
  // ML-модель сравнивает паттерны поведения нового аккаунта
  // с профилями забаненных игроков
  behavior_similarity = ml_behavior_match(player, banned_profiles)
  if behavior_similarity > 0.85:
    flag_for_review(player, "Behavioral similarity to banned account")

  // Уровень 5: Социальный граф
  // Новый аккаунт играет с теми же друзьями, что и забаненный
  friend_overlap = calculate_friend_overlap(player, banned_accounts)
  if friend_overlap > 0.7:
    flag_for_review(player, "Social graph overlap with banned account")

  return CLEAN

Многоуровневый подход значительно затрудняет обход бана. По данным Riot Games, комбинация HWID + поведенческого fingerprint позволяет обнаружить до 80% рецидивистов в течение первых 5 игр на новом аккаунте (источник: Riot Vanguard Technical Blog).




Глава 7. Апелляции и защита от ложных жалоб

7.1 Механизм апелляции

Право на апелляцию — фундаментальный элемент справедливой системы. Без него ложноположительные решения (а они неизбежны) навсегда лишают невинных игроков доступа к игре.

Кто может подать апелляцию:

  • Любой игрок, получивший санкцию уровня 2 и выше (временный бан и выше)
  • Ограничение: одна апелляция на одну санкцию. Повторная апелляция возможна только при предоставлении новых доказательств
  • Срок подачи: 30 дней с момента применения санкции

Процесс апелляции:

  1. Подача: через веб-форму на официальном сайте (не в игре — игрок может быть забанен). Требуется авторизация через аккаунт. Игрок заполняет:
    • Sanction ID (автоматически)
    • Причина апелляции (выбор из списка): «I did not cheat», «The punishment is too severe», «Technical issue / false positive», «Account was compromised», «Other»
    • Подробное описание (обязательное текстовое поле, до 2000 символов)
    • Дополнительные доказательства (видео, скриншоты, логи)
  2. Первичная проверка: апелляция проходит автоматическую фильтрацию:
    • Отклонение шаблонных/копипастных апелляций (NLP-детекция)
    • Отклонение апелляций на автоматические баны, подтверждённые сигнатурным детектом (инъекция известного чита — апелляция бессмысленна)
    • Приоритизация: апелляции от игроков с длинной историей и покупками получают повышенный приоритет
  3. Ручная проверка: апелляцию рассматривает модератор, который НЕ принимал первоначальное решение (принцип независимости). Модератор:
    • Пересматривает все доказательства с нуля
    • Учитывает аргументы игрока
    • Может запросить дополнительные данные у античит-команды
  4. Решение:
    • Appeal Granted (апелляция удовлетворена): санкция снимается, игрок получает компенсацию за пропущенное время (бонусный лут, premium-валюта за дни бана)
    • Appeal Partially Granted: санкция смягчается (например, перманентный бан заменяется на временный)
    • Appeal Denied: санкция остаётся в силе. Игрок получает объяснение (в общих чертах, без раскрытия деталей детекции)

SLA для апелляций:

  • Перманентный бан: ответ в течение 72 часов
  • Временный бан > 14 дней: ответ в течение 48 часов
  • Временный бан ≤ 14 дней: ответ в течение 7 дней (бан может истечь раньше, чем будет рассмотрена апелляция — это нормально, результат всё равно влияет на историю аккаунта)
Appeal {
  appeal_id:        UUID
  sanction_id:      UUID
  player_id:        UUID
  created_at:       Timestamp
  status:           Enum [SUBMITTED, IN_REVIEW, GRANTED, PARTIALLY_GRANTED, DENIED]

  player_input: {
    reason_category: Enum [NOT_CHEATING, TOO_SEVERE, FALSE_POSITIVE,
                           ACCOUNT_COMPROMISED, OTHER]
    description:     String  // max 2000 chars
    evidence_urls:   List<URL>
  }

  review: Optional<{
    reviewer_id:     UUID  // != original moderator
    reviewed_at:     Timestamp
    original_evidence_recheck: Boolean
    new_evidence_found: Boolean
    verdict:         Enum [GRANTED, PARTIALLY_GRANTED, DENIED]
    reasoning:       String
    compensation:    Optional<Compensation>
  }>
}

7.2 Reporter Trust Score — репутация репортящего

Trust Score — числовой показатель (0.0–1.0), отражающий историческую точность репортов игрока. Он влияет на приоритизацию новых репортов и защищает систему от абьюза.

Начальное значение: 0.5 (нейтральное) для нового аккаунта.

Факторы, повышающие Trust Score:

  • Репорт привёл к подтверждённому нарушению: +0.05
  • Репорт привёл к бану: +0.08
  • Репорт содержал полезное описание (по оценке модератора): +0.02
  • Игрок имеет длинную историю аккаунта без нарушений: пассивный бонус +0.01/месяц (до максимума 0.1)

Факторы, снижающие Trust Score:

  • Репорт признан ложным (False Report): -0.08
  • Репорт отклонён за недостаточностью доказательств: -0.02
  • Множественные репорты на одного игрока за короткий период (спам): -0.05
  • Репорт на игрока, который впоследствии оказался в топ-0.1% по skill (вероятно, «зависть к скиллу»): -0.03
function update_trust_score(reporter, report, resolution):
  delta = 0.0

  match resolution.verdict:
    case CONFIRMED:
      delta += 0.05
      if resolution.sanction_applied.level >= TEMPORARY_BAN:
        delta += 0.03
    case FALSE_REPORT:
      delta -= 0.08
    case INSUFFICIENT_EVIDENCE:
      delta -= 0.02
    case DUPLICATE:
      delta += 0.0  // нейтрально

  // Бонус за качественное описание
  if resolution.description_quality == HIGH:
    delta += 0.02

  // Штраф за спам
  reports_last_24h = count_reports(reporter, last_24h)
  if reports_last_24h > 3:
    delta -= 0.01 * (reports_last_24h - 3)

  reporter.trust_score = clamp(reporter.trust_score + delta, 0.0, 1.0)

  // Decay: trust score медленно возвращается к 0.5 при неактивности
  if time_since_last_report(reporter) > 30_DAYS:
    reporter.trust_score = move_towards(reporter.trust_score, 0.5, 0.01)

Как Trust Score влияет на систему:

  • Trust Score > 0.7: репорты получают повышенный приоритет (+20% к priority score)
  • Trust Score 0.3–0.7: стандартная обработка
  • Trust Score < 0.3: репорты получают пониженный приоритет (-30% к priority score). Не попадают в fast-track очередь
  • Trust Score < 0.1: репорты обрабатываются только в фоновом режиме. Игрок получает уведомление: «Your recent reports have not been confirmed. Please ensure you only report genuine violations.»

7.3 Защита от weaponized reporting

Weaponized reporting — использование системы репортов как инструмента травли, мести или конкурентного преимущества. Типичные сценарии:

  • Grief reporting: группа игроков координированно репортит одного игрока, чтобы вызвать автоматический бан
  • Revenge reporting: игрок репортит каждого, кто его убил, из мести
  • Competitive abuse: клан репортит лидеров конкурирующего клана перед турниром
  • Stream sniping + reporting: зрители стримера координированно репортят его противников

Механизмы защиты:

1. Кластерный анализ репортов:

function detect_coordinated_reports(case):
  reporters = case.get_all_reporters()

  // Проверка: репортящие связаны между собой?
  social_connections = count_mutual_connections(reporters)
  if social_connections / len(reporters) > 0.5:
    flag_case("Coordinated report — reporters are socially connected")

  // Проверка: репорты поданы в узком временном окне?
  time_spread = max(r.created_at for r in reports) - min(r.created_at for r in reports)
  if time_spread < 5_MINUTES and len(reporters) > 3:
    flag_case("Coordinated report — suspiciously synchronized")

  // Проверка: репортящие из одного клана/группы?
  if all_same_clan(reporters):
    flag_case("Coordinated report — same clan")

2. Асимметрия последствий: ложный репорт должен стоить дороже, чем отсутствие репорта. Систематические ложные репорты приводят к снижению Trust Score и, в крайних случаях, к санкциям против самого репортящего.

3. Rate limiting с контекстом: лимит на репорты учитывает не только количество, но и контекст. Игрок, который репортит каждого, кто его убил, получает сниженный Trust Score быстрее.

4. Независимая верификация: для кейсов с признаками координированного репортинга модератор обязан провести полную проверку, даже если количество репортов формально достаточно для автоматического действия.

7.4 Санкции за систематические ложные репорты

Игроки, злоупотребляющие системой репортов, подвергаются прогрессивным санкциям:

Trust ScoreСтатусПоследствия
0.3 — 0.5Low TrustРепорты обрабатываются с пониженным приоритетом
0.1 — 0.3UntrustedРепорты обрабатываются только в фоне. Предупреждение игроку
< 0.1Report RestrictedВозможность подавать репорты ограничена до 1 в неделю. Уведомление: «Your reporting privileges have been restricted due to a pattern of unconfirmed reports.»
< 0.05 (повторно)Report BannedВозможность подавать репорты заблокирована на 30 дней. Апелляция доступна

Важно: ограничение репортов — крайняя мера. Система должна быть настроена так, чтобы честный игрок, который иногда ошибается в своих подозрениях, никогда не достигал уровня Untrusted. Порог рассчитан на систематический абьюз (десятки ложных репортов).




Глава 8. AI и машинное обучение в системе репортов

Машинное обучение — не замена модераторам, а мультипликатор их эффективности. AI обрабатывает объём данных, недоступный для ручного анализа, и выделяет паттерны, незаметные человеческому глазу. В этой главе описаны конкретные ML-пайплайны, применимые к системе репортов extraction-шутера.

8.1 Поведенческий анализ (Behavioral Detection)

Поведенческий анализ — наиболее перспективное направление, потому что он детектит не конкретный чит-софт, а его проявления. Даже если читер использует неизвестный античиту инструмент, его поведение в игре будет аномальным.

Aim Behavior Model:

Модель анализирует траекторию прицела (aim trace) как временной ряд и выявляет паттерны, нехарактерные для человека:

  • Angular velocity distribution: у человека распределение скорости поворота прицела близко к нормальному с длинным хвостом. У аимбота — бимодальное: либо 0 (стоит на месте), либо максимум (snap к цели)
  • Micro-correction patterns: человек постоянно делает мелкие коррекции прицела (тремор, overshooting). Аимбот — нет
  • Target acquisition time: время от появления цели в поле зрения до первого попадания. У человека — 200–500ms (зависит от скилла). У аимбота — <100ms или подозрительно стабильное
  • Cross-hair placement prediction: модель предсказывает, куда игрок направит прицел в следующий тик, на основе инерции движения. Резкие отклонения от предсказания — флаг
class AimBehaviorModel:
  """
  Input: серия aim trace samples (angle_x, angle_y, timestamp)
         за последние N секунд перед каждым убийством
  Output: probability_of_aimbot (0.0 - 1.0)
  """

  features = [
    angular_velocity_mean,
    angular_velocity_std,
    angular_velocity_kurtosis,      # бимодальность
    snap_count,                      # количество резких поворотов > threshold
    snap_to_kill_correlation,        # snap совпадает с убийством?
    micro_correction_entropy,        # разнообразие мелких движений
    target_acquisition_time_mean,
    target_acquisition_time_std,
    prediction_error_mean,           # отклонение от предсказанной траектории
    time_on_target_before_shot,      # сколько прицел был на цели до выстрела
    flick_smoothness,                # плавность быстрых поворотов
  ]

  model = GradientBoostedTrees(features)  // или LSTM для sequence data

  training_data:
    positive_samples = confirmed_cheater_aim_traces
    negative_samples = legitimate_player_aim_traces (stratified by skill level)

  // Критически важно: обучение на данных, стратифицированных по уровню скилла.
  // Про-игрок с headshot rate 45% — не читер.
  // Новичок с headshot rate 45% — подозрителен.

Movement Behavior Model:

Анализ паттернов перемещения для детекции speedhack, телепорта и ботов:

  • Velocity consistency: speedhack часто даёт постоянную скорость без ускорения/замедления, характерных для человека
  • Path entropy: бот двигается по повторяющимся маршрутам с низкой энтропией. Человек — нет
  • Reaction to stimuli: человек меняет маршрут при звуке выстрелов, появлении аномалий. Бот — нет
  • Navigation mesh compliance: телепорт и noclip нарушают навигационную сетку

8.2 Статистические аномалии

Статистический анализ работает на агрегированных данных за несколько рейдов и выявляет игроков, чьи показатели выходят за пределы нормального распределения:

Z-Score Analysis:

function detect_statistical_anomalies(player, time_window=7_DAYS):
  metrics = get_player_metrics(player, time_window)
  peer_group = get_peer_group(player)  // игроки того же ранга/уровня

  anomalies = []

  for metric_name, player_value in metrics:
    peer_distribution = get_distribution(peer_group, metric_name)
    z_score = (player_value - peer_distribution.mean) / peer_distribution.std

    if abs(z_score) > 3.0:  // > 3 стандартных отклонения
      anomalies.append({
        metric: metric_name,
        z_score: z_score,
        player_value: player_value,
        peer_mean: peer_distribution.mean,
        percentile: calculate_percentile(player_value, peer_distribution)
      })

  return anomalies

// Ключевые метрики для мониторинга:
monitored_metrics = [
  "headshot_rate",
  "kd_ratio",
  "survival_rate",
  "avg_loot_value_per_raid",
  "avg_raid_duration",
  "first_shot_hit_rate",
  "damage_per_bullet",
  "distance_per_raid",
  "time_to_first_kill",
  "economy_growth_rate",       // скорость роста богатства
  "trade_volume",              // объём трейдов
  "unique_items_found_rate",   // скорость нахождения редких предметов
]

Trend Detection (обнаружение резких изменений):

Помимо абсолютных значений, система отслеживает резкие изменения метрик. Игрок, чей headshot rate вырос с 12% до 55% за один день, подозрительнее игрока, у которого стабильно 55% (второй может быть просто хорошим стрелком).

function detect_metric_shift(player, metric, lookback=30_DAYS):
  historical = get_metric_history(player, metric, lookback)
  recent = get_metric_history(player, metric, last_3_DAYS)

  // Тест Манна-Уитни для сравнения двух распределений
  u_stat, p_value = mann_whitney_u(historical, recent)

  if p_value < 0.001 and mean(recent) > mean(historical) * 1.5:
    return SIGNIFICANT_IMPROVEMENT(
      old_mean=mean(historical),
      new_mean=mean(recent),
      p_value=p_value
    )

  return NO_SIGNIFICANT_CHANGE

8.3 NLP-анализ текстовых репортов

Текстовые описания репортов содержат ценную информацию, которую можно извлечь автоматически:

Задачи NLP-модуля:

  • Классификация: определение категории нарушения из текста (дополняет выбор игрока — иногда игрок выбирает неправильную категорию)
  • Извлечение сущностей: имена игроков, оружие, локации, временные метки, упомянутые в тексте
  • Sentiment analysis: отделение эмоциональных репортов («this game is trash, everyone cheats») от информативных («player X was shooting through walls at location Y»)
  • Duplicate detection: выявление копипастных репортов (признак координированного абьюза)
  • Quality scoring: оценка информативности описания для приоритизации
class ReportTextAnalyzer:
  """
  Использует fine-tuned language model для анализа текста репорта.
  """

  def analyze(self, report_text, selected_category):
    // Классификация
    predicted_category = self.classifier.predict(report_text)
    category_mismatch = predicted_category != selected_category

    // Извлечение сущностей
    entities = self.ner_model.extract(report_text)
    // entities: {players: [...], weapons: [...], locations: [...], timestamps: [...]}

    // Качество описания
    quality_score = self.quality_model.score(report_text)
    // Факторы: длина, конкретность, наличие деталей, отсутствие оскорблений

    // Детекция копипасты
    similarity_to_recent = self.find_similar_reports(report_text, window=24_HOURS)
    is_likely_copypaste = any(sim > 0.95 for sim in similarity_to_recent)

    return {
      predicted_category: predicted_category,
      category_mismatch: category_mismatch,
      entities: entities,
      quality_score: quality_score,  // 0.0 - 1.0
      is_likely_copypaste: is_likely_copypaste,
      sentiment: self.sentiment_model.predict(report_text)
    }

8.4 Replay Analysis ML Pipeline

Автоматический анализ серверных реплеев — наиболее ресурсоёмкий, но и наиболее информативный ML-пайплайн:

Архитектура пайплайна:

  1. Feature Extraction: из сырого реплея (серия game state snapshots) извлекаются временные ряды: позиция, прицел, скорость, действия (стрельба, использование предметов), события (убийства, получение урона)
  2. Windowing: реплей разбивается на окна вокруг ключевых событий (убийства, обнаружение противника). Каждое окно — отдельный sample для анализа
  3. Model Inference: каждое окно проходит через ансамбль моделей:
    • Aim analysis model (LSTM/Transformer на aim trace)
    • Movement analysis model (CNN на trajectory heatmap)
    • Information advantage model (сравнение действий игрока с информацией, доступной ему по line-of-sight)
  4. Aggregation: результаты по всем окнам агрегируются в итоговый вердикт по реплею

Information Advantage Model (детекция wallhack):

Самая сложная модель. Она отвечает на вопрос: «Действовал ли игрок так, как будто знал то, чего не мог знать?»

class InformationAdvantageModel:
  """
  Для каждого момента времени определяет:
  1. Какую информацию игрок МОГ знать (line-of-sight, звуки, следы)
  2. Какую информацию игрок ДЕЙСТВИТЕЛЬНО использовал (по его действиям)
  3. Есть ли систематическое расхождение (знал больше, чем мог)
  """

  def analyze_window(self, player_state, game_state, window):
    // Что игрок мог видеть?
    visible_enemies = raycast_visibility(
      player_state.position,
      player_state.view_direction,
      game_state.enemy_positions,
      game_state.map_geometry
    )

    // Что игрок мог слышать?
    audible_events = calculate_audible_events(
      player_state.position,
      game_state.sound_events,
      game_state.map_acoustics
    )

    // Какую информацию игрок мог получить из звуков?
    inferred_positions = estimate_positions_from_audio(audible_events)

    // Полная легитимная информация
    legitimate_info = visible_enemies + inferred_positions

    // Как игрок действовал?
    player_actions = extract_actions(player_state, window)

    // Корреляция действий с НЕЛЕГИТИМНОЙ информацией
    hidden_enemies = game_state.enemy_positions - legitimate_info
    action_correlation = correlate_actions_with_positions(
      player_actions, hidden_enemies
    )

    // Высокая корреляция = игрок действовал на основе скрытой информации
    return {
      correlation_score: action_correlation,
      pre_aim_events: detect_pre_aim(player_state, hidden_enemies),
      path_correlation: correlate_path_with_hidden_loot(
        player_state.trajectory, game_state.hidden_loot_positions
      )
    }

Эта модель вдохновлена подходом FAIR (Fundamentally Antisymmetric Information Retrieval), описанным в исследованиях Valve для CS:GO (VACnet). Ключевая идея: если игрок систематически «угадывает» позиции противников, которых не мог видеть или слышать, это статистически значимый сигнал.

8.5 Этические ограничения AI-модерации

Использование AI в системе модерации требует соблюдения этических принципов:

Принцип 1: Human-in-the-Loop для необратимых решений.

AI может автоматически применять только обратимые санкции (shadow ban, временное ограничение). Перманентный бан всегда требует подтверждения человека. Исключение: сигнатурный детект известного чит-софта с confidence > 99.9%.

Принцип 2: Explainability (объяснимость).

Каждое решение AI должно сопровождаться человекочитаемым объяснением. «Banned by AI» — недопустимо. «AI detected aim snapping pattern at timestamps [T1, T2, T3] with angular velocity exceeding human capability (>2000°/s)» — допустимо. Модератор и игрок (при апелляции) должны понимать, на основании чего принято решение.

Принцип 3: Bias Monitoring (мониторинг предвзятости).

ML-модели могут наследовать предвзятости из обучающих данных. Необходим регулярный аудит:

  • Распределение санкций по регионам, платформам, уровням аккаунтов
  • False positive rate для разных сегментов игроков
  • Корреляция между skill level и вероятностью ложного бана (высокоскилловые игроки не должны баниться чаще)

Принцип 4: Continuous Validation (непрерывная валидация).

Модели регулярно переобучаются на новых данных и валидируются на holdout-сете. Метрики качества (precision, recall, F1) отслеживаются в реальном времени. При падении метрик ниже порога — автоматический откат к предыдущей версии модели.

Принцип 5: Adversarial Robustness (устойчивость к атакам).

Читеры будут пытаться обмануть ML-модели. Необходимо:

  • Не раскрывать детали работы моделей (security through obscurity как дополнительный слой, не основной)
  • Регулярно тестировать модели на adversarial examples
  • Использовать ансамбли моделей — обмануть несколько моделей одновременно сложнее
  • Обновлять модели быстрее, чем читеры адаптируются (цикл обновления: 2–4 недели)



Глава 9. Специфика вселенной S.T.A.L.K.E.R. 2

S.T.A.L.K.E.R. 2 обладает уникальными игровыми механиками, которые создают специфические контексты для читерства, не встречающиеся в других extraction-шутерах. Система репортов должна учитывать эти особенности.

9.1 Иммунитет к аномалиям

Аномалии — ключевая механика Зоны. Они наносят урон, блокируют маршруты, создают тактические ограничения. Чит, дающий иммунитет к аномалиям, радикально меняет баланс:

Как проявляется:

  • Игрок проходит через аномалии без получения урона
  • Использует аномальные зоны как укрытие (противники не могут войти, а читер — может)
  • Собирает артефакты из опасных аномалий без защитного снаряжения
  • Перемещается по кратчайшим маршрутам через аномальные поля, которые обычные игроки обходят

Почему разрушителен:

  • Аномалии — естественные барьеры карты. Иммунитет к ним эквивалентен noclip в плане контроля карты
  • Артефакты, добытые из опасных аномалий, имеют высокую ценность. Безрисковая добыча ломает экономику
  • Тактическое использование аномалий как укрытия создаёт непобедимые позиции

Детекция:

function detect_anomaly_immunity(player, raid_data):
  anomaly_contacts = get_anomaly_contacts(player, raid_data)

  for contact in anomaly_contacts:
    expected_damage = calculate_expected_damage(
      contact.anomaly_type,
      contact.duration,
      player.equipment.anomaly_resistance
    )
    actual_damage = contact.damage_received

    if expected_damage > 0 and actual_damage == 0:
      flag("Anomaly immunity detected",
           anomaly=contact.anomaly_type,
           expected_damage=expected_damage,
           equipment_resistance=player.equipment.anomaly_resistance)

  // Паттерн маршрутов через аномалии
  path_through_anomalies = calculate_path_anomaly_exposure(
    player.trajectory, raid_data.anomaly_map
  )

  peer_avg_exposure = get_peer_average_anomaly_exposure(player.skill_bracket)

  if path_through_anomalies > peer_avg_exposure * 3.0:
    flag("Anomalous path through anomaly fields",
         player_exposure=path_through_anomalies,
         peer_average=peer_avg_exposure)

Серверная валидация: урон от аномалий ОБЯЗАТЕЛЬНО рассчитывается на сервере. Клиент не должен иметь возможности отменить или модифицировать аномальный урон. Это фундаментальное требование к серверной архитектуре.

9.2 Дюп артефактов и экономический коллапс

Артефакты в S.T.A.L.K.E.R. 2 — основа экономики. Редкие артефакты (условные «Сердце Зоны», «Огненный шар», «Мамины бусы») могут стоить десятки часов геймплея. Дюп артефактов — экзистенциальная угроза для extraction-экономики.

Специфические векторы дюпа в контексте S.T.A.L.K.E.R. 2:

  • Anomaly-spawn exploit: манипуляция с механикой спавна артефактов в аномалиях. Если спавн привязан к seed, который можно предсказать или сбросить — возможен фарм конкретных артефактов
  • Container desync: артефакт помещается в контейнер (тайник, рюкзак мёртвого NPC), после чего эксплуатируется рассинхронизация состояния контейнера между клиентом и сервером
  • Trade window exploit: race condition в окне трейда между игроками — классический вектор для дюпа в любой игре с трейдом
  • Death-drop manipulation: артефакт «выпадает» при смерти, но одновременно остаётся в стэше (см. раздел 9.3)

Экономический мониторинг:

class ArtifactEconomyMonitor:
  """
  Мониторит экономику артефактов в реальном времени.
  Алертит при аномалиях, указывающих на дюп.
  """

  def check_economy_health(self):
    for artifact_type in all_artifact_types:
      // Текущее количество в обороте
      current_supply = count_in_circulation(artifact_type)
      expected_supply = calculate_expected_supply(
        artifact_type,
        spawn_rate=artifact_type.spawn_rate,
        destruction_rate=artifact_type.avg_destruction_rate,
        time_since_wipe=get_time_since_last_wipe()
      )

      supply_ratio = current_supply / expected_supply

      if supply_ratio > 2.0:
        alert(CRITICAL,
          f"Artifact {artifact_type.name}: supply {supply_ratio:.1f}x expected. "
          f"Possible duplication detected.")

      // Ценовой мониторинг (если есть рыночная механика)
      current_price = get_market_price(artifact_type)
      historical_price = get_historical_price(artifact_type, 7_DAYS)

      if current_price < historical_price * 0.5:
        alert(HIGH,
          f"Artifact {artifact_type.name}: price dropped {(1-current_price/historical_price)*100:.0f}%. "
          f"Possible market flooding from duplication.")

Превентивные меры:

  • Каждый артефакт имеет уникальный UUID, привязанный к событию его создания (спавн в аномалии, дроп с NPC)
  • Полный аудит-лог: создание → подбор → использование → трейд → уничтожение
  • Серверная валидация всех операций с артефактами: трейд, помещение в контейнер, использование
  • Atomic transactions: операции с предметами выполняются как атомарные транзакции на сервере. Disconnect во время транзакции = откат транзакции, а не дюп

9.3 Эксплойт выноса лута через смерть

В extraction-шутерах смерть означает потерю снаряжения. Но что если можно «вынести» лут, умерев определённым образом?

Типичные эксплойты:

  • Insurance fraud: если в игре есть система страховки снаряжения (как в Escape from Tarkov), игрок может застраховать снаряжение, передать его другу в рейде, умереть, получить страховку + друг уносит оригинал
  • Secure container abuse: если есть «защищённый контейнер» (предметы в нём сохраняются при смерти), игрок может запихивать ценный лут в контейнер и намеренно умирать, не рискуя ничем
  • Disconnect exploit: отключение от сервера в определённый момент может привести к тому, что лут сохраняется, а потеря снаряжения — нет (зависит от реализации)
  • Death-stash exploit: в контексте S.T.A.L.K.E.R. 2 — использование механики тайников. Игрок кладёт лут в тайник, умирает (снаряжение «теряется»), но лут остаётся в тайнике для следующего рейда

Детекция:

function detect_death_loot_exploit(player, raid_history):
  suspicious_patterns = []

  for raid in raid_history:
    if raid.outcome == DEATH:
      // Паттерн 1: Высокая ценность лута, помещённого в secure container
      // непропорционально общему лутингу
      secure_value = sum(item.value for item in raid.secure_container_items)
      total_looted = sum(item.value for item in raid.all_looted_items)

      if total_looted > 0 and secure_value / total_looted > 0.9:
        suspicious_patterns.append("Secure container stuffing")

      // Паттерн 2: Намеренная смерть после лутинга
      time_looting = raid.time_spent_looting
      time_alive_after_last_loot = raid.death_time - raid.last_loot_time

      if time_alive_after_last_loot < 30_SECONDS and secure_value > HIGH_VALUE:
        suspicious_patterns.append("Quick death after high-value looting")

      // Паттерн 3: Систематический паттерн: лут → смерть → лут → смерть
      death_after_loot_ratio = count_deaths_within_60s_of_looting(player) / total_raids
      if death_after_loot_ratio > 0.6:
        suspicious_patterns.append("Systematic loot-and-die pattern")

      // Паттерн 4: Disconnect во время критических моментов
      if raid.ended_by_disconnect:
        disconnect_timing = raid.disconnect_time - raid.last_significant_event
        if disconnect_timing < 5_SECONDS:
          suspicious_patterns.append("Suspicious disconnect timing")

  return suspicious_patterns

Дизайнерские решения для предотвращения:

  • Secure container: ограничить размер и типы предметов, которые можно поместить (например, нельзя класть артефакты выше определённой редкости)
  • Страховка: cooldown на страховку одного и того же предмета; страховка не покрывает предметы, переданные другим игрокам
  • Тайники: предметы в тайниках привязаны к рейду и исчезают после его завершения (или имеют таймер)
  • Disconnect penalty: при disconnect лут на персонаже считается потерянным (тело остаётся в рейде и может быть обыскано другими игроками)

9.4 Фракционный абьюз и мета-гриферство

Если в мультиплеере S.T.A.L.K.E.R. 2 есть фракционная система (Долг, Свобода, Одиночки, Монолит и т.д.), она создаёт дополнительные контексты для абьюза:

  • Faction spy: игрок вступает во фракцию, чтобы получить доступ к информации (позиции баз, планы рейдов) и передать её конкурирующей фракции
  • Faction griefing: намеренный саботаж фракционных миссий изнутри
  • Faction stacking: координированное вступление группы читеров в одну фракцию для доминирования
  • Cross-faction collusion: игроки из «враждебных» фракций сговариваются для обмена лутом через намеренные убийства

Специфические категории репортов:

  • «Faction Betrayal» — предательство фракции (передача информации, саботаж)
  • «Cross-faction Collusion» — сговор с враждебной фракцией

Важный нюанс: некоторые из этих действий могут быть легитимным геймплеем (шпионаж как механика). Дизайнеры должны чётко определить границу между «разрешённой хитростью» и «абьюзом», и система репортов должна эту границу учитывать.

9.5 Аномальные зоны как инструмент гриферства

Аномалии в S.T.A.L.K.E.R. 2 могут использоваться для гриферства:

  • Anomaly herding: заманивание союзника или нейтрального игрока в аномалию. Технически — не прямой урон, но результат тот же
  • Anomaly blocking: использование знания расположения аномалий для блокировки маршрутов эвакуации
  • Artifact bait: размещение приманки (дешёвый предмет) рядом с невидимой аномалией
  • Emission griefing: если в мультиплеере есть механика Выбросов — намеренное уничтожение укрытий или блокировка входа в укрытие во время Выброса

Детекция:

  • Корреляция между позицией гриферящего игрока и смертью жертвы в аномалии
  • Паттерн: игрок систематически находится рядом с аномалиями, в которых гибнут другие игроки
  • Блокировка укрытий: детекция коллизии игрока с дверным проёмом укрытия во время Выброса

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

9.6 Специальные категории репортов для Зоны

Помимо стандартных категорий, для S.T.A.L.K.E.R. 2 необходимы специфические:

КатегорияОписаниеПример
Anomaly ImmunityИгрок не получает урон от аномалийПрошёл через «Жарку» без защиты и без урона
Artifact DuplicationПодозрение на дюп артефактовУ игрока 5 одинаковых «Сердец Зоны»
Emission ExploitИгрок выживает вне укрытия во время ВыбросаСтоял на открытом пространстве во время Выброса без урона
Mutant ManipulationИгрок контролирует или игнорирует мутантовКровосос проходит мимо игрока, не атакуя
Faction ExploitЗлоупотребление фракционными механикамиПередача фракционного снаряжения через подставные аккаунты
Stash ExploitЗлоупотребление механикой тайниковБесконечное использование тайника для обхода потери лута
Anomaly GriefingИспользование аномалий для гриферстваЗаманивание союзников в аномалии, блокировка укрытий

Эти категории должны быть доступны в форме репорта наряду со стандартными. Модераторы, работающие с этими категориями, должны быть знакомы с механиками Зоны — это требование к обучению модераторов.

9.7 Wipe-циклы и их влияние на систему репортов

Если мультиплеер S.T.A.L.K.E.R. 2 использует wipe-циклы (периодический сброс прогресса всех игроков, как в Escape from Tarkov), это существенно влияет на систему репортов и модерации:

Всплеск читерства после wipe:

  • Первые дни после wipe — пик читерства. Читеры стремятся быстро набрать преимущество, пока все на равных
  • Система должна быть готова к 3–5-кратному росту объёма репортов в первую неделю после wipe
  • Рекомендация: усиленный мониторинг и дополнительные модераторы на дежурстве в первые 72 часа после wipe

Сброс статистики:

  • После wipe статистические модели теряют исторические данные. Z-score анализ и trend detection становятся менее эффективными
  • Решение: хранить поведенческие данные (aim patterns, movement patterns) отдельно от экономических. Поведенческий профиль не сбрасывается при wipe
  • Trust Score репортящих также не сбрасывается — это метаигровой показатель

Экономический мониторинг:

  • После wipe экономика стартует с нуля. Нормальные показатели (supply артефактов, средний баланс) радикально отличаются от показателей в середине цикла
  • Экономический мониторинг должен учитывать фазу wipe-цикла: «ранний wipe» (дни 1–7), «средний» (недели 2–6), «поздний» (после 6 недель)
  • Пороги алертов адаптируются к фазе: в раннем wipe рост supply артефактов на 200% может быть нормой, в позднем — сигнал дюпа

Санкции и wipe:

  • Временный бан, наложенный до wipe, может истечь после wipe. Игрок возвращается с чистой экономикой — дополнительный откат не нужен
  • Перманентный бан не зависит от wipe-циклов
  • HWID-бан сохраняется между wipe-циклами

9.8 Radar Hack в контексте Зоны

Radar hack — особенно опасный тип чита для S.T.A.L.K.E.R. 2, потому что Зона спроектирована вокруг неизвестности. Игрок не знает, что за углом — мутант, аномалия, другой сталкер или ценный артефакт. Radar hack уничтожает эту неизвестность полностью.

Специфика для S.T.A.L.K.E.R. 2:

  • Позиции аномалий: если radar показывает расположение аномалий, игрок может безопасно перемещаться по карте без детектора аномалий — обесценивая целую категорию снаряжения
  • Позиции артефактов: артефакты спавнятся в аномалиях. Знание их точного расположения даёт колоссальное экономическое преимущество
  • Позиции мутантов: мутанты — ключевая PvE-угроза. Radar позволяет полностью избегать их или выбирать оптимальные моменты для атаки
  • Позиции тайников: если тайники других игроков видны на radar — это прямая кража

Защита:

  • Обязательное шифрование трафика: DTLS для UDP game traffic. Без шифрования radar hack тривиален
  • Server-side culling для PvE-сущностей: не только позиции игроков, но и позиции мутантов и артефактов не должны отправляться клиенту, пока они не в зоне восприятия
  • Динамический спавн: артефакты и мутанты спавнятся серверно, позиции не предсказуемы клиентом
  • Packet obfuscation: даже зашифрованные пакеты могут утечь метаданные (размер пакета коррелирует с количеством сущностей рядом). Padding пакетов до фиксированного размера предотвращает traffic analysis



Глава 10. Античит-интеграция и серверная авторитетность

Система репортов — один из слоёв защиты. Она работает в связке с античитом и серверной архитектурой. В этой главе описано, как эти системы интегрируются.

10.1 Клиент-серверная модель доверия

Фундаментальный принцип: клиент — враждебная среда. Любые данные, приходящие от клиента, считаются потенциально подделанными. Сервер — единственный источник истины.

Модель доверия для extraction-шутера:

ДействиеАвторитетностьОбоснование
Позиция игрокаСерверКлиент отправляет input (WASD), сервер рассчитывает позицию. Client-side prediction для плавности, но сервер корректирует
Стрельба / попаданияСервер (с client-side hit detection для latency compensation)Клиент отправляет «я выстрелил в точку X в момент T». Сервер верифицирует: был ли противник в этой точке в момент T (с учётом lag compensation)
УронСерверСервер рассчитывает урон на основе оружия, дистанции, брони, попадания. Клиент не может модифицировать урон
Инвентарь / ЛутСерверВсе операции с предметами — серверные транзакции. Клиент отправляет запросы («подобрать предмет»), сервер выполняет или отклоняет
Аномальный уронСерверСервер знает позиции аномалий и рассчитывает урон. Клиент не может отменить аномальный урон
Видимость противниковСервер (culling)Сервер отправляет клиенту данные только о тех игроках, которые потенциально видимы. Это фундаментальная защита от wallhack
Скорость перемещенияСерверСервер валидирует скорость: если клиент сообщает позицию, недостижимую за прошедшее время, позиция корректируется

Server-Side Visibility Culling — ключевая защита от ESP/Wallhack:

Если сервер не отправляет клиенту данные о противнике за стеной, wallhack бесполезен — нечего отображать. Это самая эффективная защита от ESP, но она требует значительных серверных ресурсов:

function server_visibility_culling(player, all_players, map_geometry):
  """
  Для каждого тика определяет, какие игроки должны быть
  отправлены клиенту данного игрока.
  """
  visible_set = []

  for other_player in all_players:
    if other_player == player:
      continue

    distance = distance_between(player.position, other_player.position)

    // Уровень 1: Distance culling — далёкие игроки не отправляются
    if distance > MAX_RENDER_DISTANCE:
      continue

    // Уровень 2: PVS (Potentially Visible Set) — быстрая проверка по предрассчитанным зонам видимости
    if not pvs_check(player.position, other_player.position, map_geometry.pvs_data):
      continue

    // Уровень 3: Расширенная видимость с буфером
    // Отправляем данные чуть раньше, чем игрок станет видим,
    // чтобы избежать "pop-in" эффекта
    extended_visibility = check_extended_visibility(
      player, other_player, map_geometry,
      buffer_distance=5.0,  // метры
      buffer_time=0.5       // секунды предсказания
    )

    if extended_visibility:
      visible_set.append(other_player)

  return visible_set

VALORANT от Riot Games использует аналогичную систему под названием «Fog of War» — сервер не отправляет позиции невидимых противников клиенту. Это значительно снизило эффективность wallhack-читов (источник: Riot Vanguard Blog).

10.2 Интеграция с античитом (EAC / BattlEye / Custom)

Античит работает на нескольких уровнях:

Уровень 1: Kernel-Level Anti-Cheat (драйвер).

  • Работает на уровне ядра ОС (ring 0)
  • Детектит: инъекцию кода в процесс игры, модификацию памяти, подозрительные драйверы, DMA-устройства для чтения памяти
  • Примеры: Riot Vanguard, Easy Anti-Cheat (EAC), BattlEye
  • Для S.T.A.L.K.E.R. 2 на Unreal Engine 5: EAC — наиболее вероятный выбор (нативная интеграция с UE5)

Уровень 2: Client-Side Integrity Checks.

  • Проверка целостности файлов игры (хэши)
  • Детекция модификации шейдеров (для визуальных читов: удаление текстур, подсветка игроков)
  • Проверка подключённых устройств (DMA-карты для чтения памяти через PCIe)

Уровень 3: Server-Side Detection.

  • Валидация физики: скорость, позиция, урон
  • Статистические аномалии в реальном времени
  • Поведенческий анализ (ML-модели из главы 8)

Интеграция античита с системой репортов:

// Античит отправляет флаги в систему репортов
AntiCheatFlag {
  player_id:      UUID
  flag_type:      Enum [SIGNATURE_DETECT, MEMORY_MODIFICATION, INTEGRITY_VIOLATION,
                        STATISTICAL_ANOMALY, BEHAVIORAL_FLAG, NETWORK_ANOMALY]
  confidence:     Float [0.0 - 1.0]
  details:        String
  timestamp:      Timestamp
  auto_action:    Optional<Enum [NONE, KICK, SHADOW_BAN, IMMEDIATE_BAN]>
}

// Система репортов использует флаги античита для приоритизации
function enrich_case_with_anticheat(case):
  ac_flags = get_anticheat_flags(case.reported_player.player_id)

  for flag in ac_flags:
    case.anti_cheat_flags.append(flag)

    // Сигнатурный детект = автоматический бан
    if flag.flag_type == SIGNATURE_DETECT and flag.confidence > 0.99:
      case.auto_resolve(BAN, reason="Signature detection: " + flag.details)
      return

    // Другие флаги повышают приоритет
    case.priority += flag.confidence * 30

10.3 Серверная валидация критических действий

Список действий, которые ОБЯЗАТЕЛЬНО валидируются на сервере:

ДействиеВалидацияРеакция на нарушение
Перемещениеdistance/time ≤ max_speed * 1.1 (10% буфер на сетевые артефакты)Коррекция позиции (rubber-banding)
СтрельбаRate of fire ≤ weapon_rpm * 1.05; наличие патронов; оружие не в состоянии перезарядкиОтклонение выстрела; флаг
ПопаданиеLine-of-sight проверка; дистанция ≤ max_range; lag compensation window ≤ 200msОтклонение попадания
Подбор предметаПредмет существует; игрок в радиусе взаимодействия; предмет не подобран другимОтклонение действия
ТрейдОба игрока онлайн; предметы существуют в инвентарях; атомарная транзакцияОткат транзакции
Использование предметаПредмет в инвентаре; cooldown соблюдён; условия использования выполненыОтклонение действия
Аномальный уронПозиция в зоне аномалии; расчёт урона с учётом защитыПринудительное применение урона
ЭвакуацияИгрок в зоне эвакуации; таймер завершён; нет прерывающих факторовОтклонение эвакуации

10.4 Телеметрия и логирование

Для эффективной работы системы репортов и модерации необходимо логировать обширный набор данных:

Что логируется (на сервере):

  • Game State Snapshots: полное состояние игры каждые 100ms (для серверного реплея). Хранение: 30 дней
  • Player Actions: каждое действие игрока с timestamp. Хранение: 90 дней
  • Kill Events: детальная информация о каждом убийстве (оружие, дистанция, часть тела, aim trace за 2 секунды до). Хранение: 180 дней
  • Economic Transactions: все операции с предметами и валютой. Хранение: 1 год
  • Network Telemetry: пинг, packet loss, jitter для каждого игрока. Хранение: 30 дней
  • Anti-Cheat Events: все флаги и детекции античита. Хранение: 1 год
  • Chat Logs: текстовый и голосовой чат (voice-to-text). Хранение: 90 дней
  • Session Metadata: время входа/выхода, IP, HWID, клиентская версия. Хранение: 1 год

Объём данных (оценка для 100K concurrent players):

  • Game State Snapshots: ~500 GB/день (сжатые)
  • Player Actions: ~50 GB/день
  • Kill Events: ~5 GB/день
  • Economic Transactions: ~10 GB/день
  • Network Telemetry: ~100 GB/день
  • Итого: ~700 GB/день → ~21 TB/месяц → ~250 TB/год

Это значительный объём, требующий продуманной стратегии хранения: горячее хранилище (SSD) для последних 7 дней, тёплое (HDD) для 30 дней, холодное (S3/GCS) для архива. Данные старше retention period удаляются автоматически (GDPR compliance).

10.5 Правовые аспекты и защита данных

Система репортов собирает и обрабатывает значительный объём персональных данных. Это создаёт юридические обязательства, которые необходимо учитывать при проектировании.

GDPR (для EU-игроков):

  • Правовое основание обработки: «законный интерес» (legitimate interest) — обеспечение честности игрового процесса. Это признанное основание для античит-систем, но требует документирования (DPIA — Data Protection Impact Assessment)
  • Право на доступ (Art. 15): игрок может запросить все данные, которые система хранит о нём, включая историю репортов (поданных и полученных), санкции, Trust Score. Система должна уметь генерировать такой отчёт автоматически
  • Право на удаление (Art. 17): ограничено для данных, необходимых для обеспечения безопасности. HWID-хэши забаненных аккаунтов могут храниться даже после запроса на удаление (исключение для предотвращения мошенничества). Но персональные данные (имя, email) должны быть удалены
  • Минимизация данных (Art. 5): собирать только то, что необходимо. HWID хранится как хэш, не как сырые серийные номера. IP-адреса анонимизируются после окончания retention period
  • Retention periods: каждый тип данных имеет обоснованный срок хранения (см. раздел 10.4). Данные удаляются автоматически по истечении срока

Права игрока при бане:

  • Игрок должен быть уведомлён о причине бана (в общих чертах)
  • Игрок должен иметь возможность подать апелляцию (см. главу 7)
  • Бан не должен затрагивать single-player контент (если игра имеет и single-player, и multiplayer)
  • При перманентном бане: вопрос о возврате средств за покупки в игре регулируется ToS (Terms of Service) и локальным законодательством. В EU потребитель может иметь право на частичный возврат

Terms of Service (ToS):

  • ToS должен явно описывать: какие действия считаются нарушением, какие данные собираются, какие санкции могут быть применены, как работает апелляция
  • Игрок должен принять ToS перед началом мультиплеера
  • Изменения ToS требуют повторного согласия игрока

Голосовой чат и запись:

  • Запись голосового чата для модерации требует явного согласия игрока (opt-in или уведомление при входе в голосовой чат)
  • В некоторых юрисдикциях (Калифорния, Германия) запись без согласия всех участников незаконна
  • Альтернатива: voice-to-text конвертация в реальном времени с удалением аудио. Хранится только текстовая транскрипция



Глава 11. Метрики и KPI системы репортов

Система репортов — не «поставил и забыл». Она требует постоянного мониторинга и оптимизации. Метрики позволяют оценить здоровье системы и принимать data-driven решения.

11.1 Операционные метрики

МетрикаОписаниеЦелевое значениеАлерт при
Report VolumeКоличество репортов в деньBaseline ± 20%Рост >50% (возможная волна читов или абьюз)
Reports per 1000 RaidsНормализованный объём репортов10–30>50 (проблема с читами) или <5 (система недоступна?)
Mean Time to Resolution (MTTR)Среднее время от подачи репорта до решения<24 часа>48 часов
SLA Compliance% кейсов, обработанных в рамках SLA>95%<90%
Auto-Resolution Rate% кейсов, закрытых автоматически (AI/античит)60–80%<50% (AI недостаточно эффективен) или >90% (возможно, пропускает сложные случаи)
Moderator ThroughputКейсов на модератора в день30–50<20 (неэффективность) или >70 (риск выгорания и ошибок)
Queue DepthКоличество кейсов в очередиСтабильное или снижающеесяРост >20% за неделю
Appeal Rate% забаненных, подающих апелляцию10–20%>30% (возможно, слишком много ложных банов)
Appeal Success Rate% удовлетворённых апелляций<5%>10% (проблема с качеством решений)

11.2 Метрики здоровья сообщества

МетрикаОписаниеКак измеряется
Cheater Encounter RateВероятность встретить читера в рейде% рейдов, в которых хотя бы один участник впоследствии получил бан. Целевое: <2%
Repeat Offender Rate% забаненных, создающих новые аккаунтыОтслеживается через HWID/behavioral fingerprint. Целевое: <20% от всех банов
Reporter SatisfactionУдовлетворённость игроков системой репортовОпрос после получения уведомления о результате репорта. Целевое: >70% positive
Time to First BanВремя от начала читерства до первого банаРетроспективный анализ: когда начались аномалии в статистике vs когда применён бан. Целевое: <48 часов
Player Retention ImpactВлияние читеров на удержание игроковСравнение retention rate игроков, столкнувшихся с читерами, vs не столкнувшихся
False Positive Rate% невинных игроков, получивших санкцииОценивается через appeal success rate + выборочный аудит. Целевое: <0.1%
Economy Health IndexЗдоровье игровой экономикиКомпозитный индекс: инфляция, распределение богатства, объём RMT. Нормализованный 0–100

11.3 Дашборд и алертинг

Все метрики визуализируются на real-time дашборде, доступном команде модерации, античит-команде и продюсерам:

Компоненты дашборда:

  • Overview Panel: ключевые метрики за последние 24 часа / 7 дней / 30 дней с трендами
  • Queue Monitor: текущее состояние очередей модерации, SLA-статус для каждой очереди
  • Heatmap: географическая карта репортов — выявление региональных всплесков читерства
  • Cheat Type Distribution: распределение репортов по категориям читов. Резкий рост одной категории может указывать на появление нового чита
  • Economy Monitor: графики ключевых экономических показателей с аномалиями
  • Moderator Performance: метрики по каждому модератору (throughput, accuracy, appeal rate на их решения)

Алертинг:

alerts = [
  Alert(
    name="Report Volume Spike",
    condition=lambda: report_volume_1h > baseline_1h * 2.0,
    severity=HIGH,
    notify=[moderation_lead, anticheat_team]
  ),
  Alert(
    name="New Cheat Type Detected",
    condition=lambda: unknown_category_reports_24h > 50,
    severity=CRITICAL,
    notify=[anticheat_team, engineering_lead]
  ),
  Alert(
    name="High Appeal Success Rate",
    condition=lambda: appeal_success_rate_7d > 0.10,
    severity=HIGH,
    notify=[moderation_lead, qa_team]
  ),
  Alert(
    name="Economy Anomaly",
    condition=lambda: any(artifact.supply_ratio > 1.5 for artifact in rare_artifacts),
    severity=CRITICAL,
    notify=[economy_team, anticheat_team]
  ),
  Alert(
    name="Queue Overflow",
    condition=lambda: critical_queue_depth > 100 or high_queue_depth > 500,
    severity=HIGH,
    notify=[moderation_lead]
  ),
  Alert(
    name="Moderator Burnout Risk",
    condition=lambda: any(mod.cases_today > 60 for mod in active_moderators),
    severity=MEDIUM,
    notify=[moderation_lead]
  ),
]



Глава 12. Коммуникация с сообществом

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

12.1 Transparency Reports

Регулярная публикация отчётов о работе системы модерации — лучшая практика индустрии. Примеры: Riot Games публикует квартальные отчёты по VALORANT, Bungie — по Destiny 2.

Что включать в Transparency Report:

  • Общее количество обработанных репортов за период
  • Количество применённых санкций (по типам: предупреждения, временные баны, перманентные баны)
  • Среднее время обработки репорта
  • Количество удовлетворённых апелляций (и что это означает для улучшения системы)
  • Общие тренды: какие типы читов растут, какие снижаются
  • Улучшения системы, внедрённые за период

Чего НЕ включать:

  • Детали работы античита (помогает читерам обходить)
  • Конкретные пороги и алгоритмы скоринга
  • Имена забаненных игроков (privacy)
  • Детали ML-моделей

Частота публикации: ежемесячно — краткий отчёт (инфографика в социальных сетях). Ежеквартально — полный отчёт (блог-пост на официальном сайте).

12.2 Ban Waves и публичная коммуникация

Ban wave — одновременный бан большого количества читеров, накопленных за период. Это стратегическое решение с плюсами и минусами:

Преимущества ban waves:

  • Затрудняет обратную инженерию: если банить по одному, читер может определить, какое именно действие вызвало бан. При ban wave — невозможно
  • PR-эффект: «50,000 cheaters banned» — мощное сообщение для сообщества
  • Сбор данных: пока читеры не забанены, система собирает данные об их поведении для улучшения детекции

Недостатки ban waves:

  • Читеры активны дольше: пока копится волна, легитимные игроки страдают
  • Ожидание: игроки, подавшие репорт, не видят результата неделями

Оптимальная стратегия — гибридная:

  • Очевидные читы (сигнатурный детект, speedhack) — немедленный бан. Нет смысла ждать
  • Мягкие читы (soft aimbot, ESP) — накопление в shadow ban / cheater pool, ban wave раз в 2–4 недели
  • Новые, неизвестные читы — максимальный сбор данных перед ban wave

Коммуникация ban wave:

  • Пост в официальном блоге и социальных сетях
  • Тон: уверенный, но не злорадный. «We’ve taken action against [N] accounts found to be using unauthorized software. Fair play is our priority.»
  • Не указывать конкретные читы, которые были задетектены (помогает разработчикам читов)
  • Поблагодарить сообщество за репорты

12.3 Обратная связь репортящим игрокам

Игрок, подавший репорт, должен получить обратную связь. Это критически важно для мотивации продолжать репортить:

Уведомления:

  • При подаче: «Your report has been received. Report ID: #RPT-XXXXX»
  • При принятии мер: «Action has been taken against a player you reported. Thank you for helping keep the Zone fair.» — появляется как in-game notification при следующем входе
  • При отклонении (опционально): не рекомендуется уведомлять об отклонении каждого репорта (деморализует). Вместо этого — периодическое сообщение: «We review all reports. Not all reports result in action, but every report helps us improve.»

Gamification обратной связи (осторожно):

  • Некоторые игры (Overwatch, Dota 2) показывают «Thank you» экран с количеством успешных репортов
  • Риск: gamification может мотивировать к избыточному репортингу. Баланс: показывать статистику, но не давать за неё награды
  • Допустимо: «Your reports have contributed to [N] actions this month. Thank you, Stalker.»
  • Недопустимо: давать внутриигровые награды за «успешные» репорты (создаёт perverse incentive)



Глава 13. Масштабирование и инфраструктура

Система репортов должна масштабироваться вместе с игрой. Ниже — архитектурные решения для обеспечения масштабируемости.

Архитектура высокого уровня:

┌─────────────────────────────────────────────────────────────────┐
│                        Game Clients                             │
│  (report submission, replay viewing, notifications)             │
└──────────────────────────┬──────────────────────────────────────┘
                           │ HTTPS / WebSocket
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│                      API Gateway                                │
│  (rate limiting, authentication, routing)                       │
└──────────────────────────┬──────────────────────────────────────┘
                           │
              ┌────────────┼────────────┐
              ▼            ▼            ▼
┌──────────────────┐ ┌──────────┐ ┌──────────────────┐
│  Report Service  │ │ Appeal   │ │  Notification    │
│  (CRUD, validate │ │ Service  │ │  Service         │
│   deduplicate)   │ │          │ │                  │
└────────┬─────────┘ └────┬─────┘ └──────────────────┘
         │                │
         ▼                ▼
┌─────────────────────────────────────────────────────────────────┐
│                     Message Queue (Kafka)                       │
│  Topics: reports.new, reports.scored, reports.analyzed,         │
│          sanctions.applied, appeals.new                         │
└──────────────────────────┬──────────────────────────────────────┘
                           │
         ┌─────────────────┼─────────────────┐
         ▼                 ▼                 ▼
┌──────────────────┐ ┌──────────────┐ ┌──────────────────┐
│  Scoring Service │ │ AI Analysis  │ │  Routing Service │
│  (prioritization)│ │ Service      │ │  (queue assign)  │
└──────────────────┘ │ (ML models)  │ └──────────────────┘
                     └──────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│                   Moderation Dashboard                          │
│  (case queue, replay viewer, player profiles, action panel)     │
└─────────────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│                     Data Storage Layer                          │
│  PostgreSQL (reports, cases, sanctions, appeals)                │
│  Redis (caches, rate limits, real-time counters)                │
│  S3/GCS (replays, evidence files, ML model artifacts)          │
│  ClickHouse/BigQuery (analytics, telemetry, metrics)           │
│  Elasticsearch (full-text search on reports, chat logs)         │
└─────────────────────────────────────────────────────────────────┘

Ключевые решения масштабирования:

  • Асинхронная обработка: подача репорта — синхронная (игрок получает подтверждение). Всё остальное (скоринг, AI-анализ, маршрутизация) — асинхронное через message queue
  • Горизонтальное масштабирование: каждый сервис — stateless, масштабируется добавлением инстансов. State хранится в базах данных
  • AI Analysis Service: наиболее ресурсоёмкий компонент. Масштабируется через GPU-кластер. При пиковой нагрузке — приоритизация: high-priority кейсы анализируются первыми, low-priority — в фоне
  • Replay Storage: реплеи — самый объёмный тип данных. Tiered storage: горячие (последние 7 дней) на SSD, тёплые (30 дней) на HDD, холодные (до retention limit) в object storage
  • Regional Distribution: для глобальной игры — региональные инстансы системы репортов (EU, NA, Asia). Модераторы работают с кейсами своего региона (языковая специфика, часовые пояса)

Оценка нагрузки (для 500K DAU):

  • Репортов в день: ~5,000–15,000 (1–3% рейдов генерируют репорт)
  • Кейсов в день (после дедупликации): ~3,000–10,000
  • AI-анализов в день: ~3,000–10,000 (каждый кейс)
  • Ручных проверок в день: ~500–2,000 (после AI-фильтрации)
  • Необходимо модераторов: 15–40 (при throughput 30–50 кейсов/день/модератор)
  • Апелляций в день: ~50–200

Отказоустойчивость:

  • Система репортов не является критической для геймплея. Если она недоступна, игроки продолжают играть, но не могут подавать репорты
  • При сбое: репорты буферизуются на клиенте и отправляются при восстановлении
  • Message queue (Kafka) обеспечивает durability: сообщения не теряются при сбое consumer’ов
  • База данных: primary-replica с автоматическим failover

13.1 Стоимость и ROI системы модерации

Система модерации — значительная инвестиция. Важно понимать её стоимость и возврат на инвестиции.

Основные статьи расходов (оценка для 500K DAU):

СтатьяОценка стоимости (год)Комментарий
Модераторы (20–30 человек)$800K–$1.5MЗарплаты, обучение, ротация. Зависит от региона найма
Инфраструктура (серверы, хранилище)$200K–$500KХранение реплеев, ML inference, базы данных
ML/AI разработка и поддержка$300K–$600KML-инженеры, обучение моделей, GPU-кластер
Античит-лицензия (EAC/BattlEye)$100K–$300KЗависит от условий лицензирования и DAU
Разработка инструментов$200K–$400KModeration dashboard, replay viewer, алертинг
Итого$1.6M–$3.3M/год

ROI (возврат на инвестиции):

Прямой ROI системы модерации сложно измерить, но косвенные метрики убедительны:

  • Player retention: исследования показывают, что столкновение с читером снижает вероятность возвращения игрока на 10–30% (источник: Irdeto Global Gaming Survey, 2021). Для игры с 500K DAU и ARPU $50/год потеря даже 5% аудитории из-за читеров = $1.25M/год упущенного дохода
  • Репутация: игры с репутацией «читерского рая» (примеры: PUBG в 2018, Warzone в 2021) теряют аудиторию экспоненциально. Восстановление репутации стоит значительно дороже, чем поддержание
  • RMT-экономика: неконтролируемый RMT обесценивает официальные монетизационные механики (battle pass, cosmetics). Каждый доллар, потраченный на RMT — доллар, не потраченный в официальном магазине
  • Стоимость бездействия: без системы модерации читерство растёт экспоненциально. Чем позже внедряется система, тем дороже обходится «расчистка» накопленных проблем

Оптимизация затрат:

  • Инвестиции в AI/ML окупаются за 6–12 месяцев за счёт снижения потребности в модераторах
  • Server-side visibility culling — разовая инвестиция в архитектуру, которая радикально снижает эффективность целого класса читов (wallhack, ESP, radar)
  • Региональный аутсорсинг модерации (с обучением и контролем качества) снижает затраты на 40–60%
  • Community-driven модерация (система Overwatch из CS:GO) может дополнять, но не заменять профессиональную модерацию



Глава 14. Ссылки и индустриальные практики

Этот документ основан на публичных материалах ведущих игровых компаний и академических исследованиях в области античита и модерации:

Публикации и доклады

  1. Riot Games — Vanguard Anti-Cheat: «VALORANT’s Anti-Cheat Kills the Game» — архитектура kernel-level античита, философия «security first», интеграция с системой репортов.
  2. Riot Games — Player Behavior Systems: GDC 2023, «Player Behavior Systems at Scale» — дизайн системы репортов, UX исследования, влияние обязательных полей на количество и качество репортов.
  3. Valve — VACnet: GDC 2018, «Robocalypse Now: Using Deep Learning to Combat Cheating in CS:GO» — ML-система для автоматической детекции аимбота через анализ aim trace. Основа для Overwatch (системы модерации CS:GO, не игры Blizzard).
  4. Bungie — Destiny 2 Anti-Cheat: «This Week at Bungie — Anti-Cheat Update» — переход от client-trust к server-authoritative модели, интеграция BattlEye.
  5. Battlestate Games — Escape from Tarkov: опыт борьбы с читерством в extraction-шутере. RMT как основной драйвер читерства. Проблемы с radar hack (packet sniffing).
  6. Epic Games — Easy Anti-Cheat: EAC Documentation — интеграция с Unreal Engine 5, kernel-level protection, client integrity checks.
  7. Respawn Entertainment — Apex Legends: Anti-Cheat Updates — shadow ban стратегия, ban waves, HWID banning, machine learning detection.

Академические и технические ресурсы

  1. «A Survey on Anti-Cheating Mechanisms in Online Games» — обзор методов античита, классификация читов, сравнение подходов (client-side vs server-side).
  2. «Fairplay: Monitoring, Measuring, and Responding to Cheaters in Online Games» — исследование поведенческих паттернов читеров, статистические методы детекции.
  3. GDPR и обработка данных игроков: GDPR Official Text — требования к хранению и обработке персональных данных, включая HWID, IP-адреса, чат-логи. Система репортов должна соответствовать GDPR (для EU-игроков) и аналогичным регуляциям.

Инструменты и технологии

  1. Easy Anti-Cheat (EAC): kernel-level античит от Epic Games. Нативная интеграция с Unreal Engine 5. Используется в Fortnite, Apex Legends, Rust, Dead by Daylight.
  2. BattlEye: kernel-level античит. Используется в PUBG, Destiny 2, Rainbow Six Siege, DayZ, Escape from Tarkov.
  3. Riot Vanguard: проприетарный kernel-level античит Riot Games для VALORANT. Наиболее агрессивный подход: запускается при старте ОС.
  4. Apache Kafka: распределённая система обмена сообщениями для асинхронной обработки репортов.
  5. ClickHouse: колоночная СУБД для аналитики телеметрии и метрик в реальном времени.
  6. Elasticsearch: полнотекстовый поиск для анализа текстовых репортов и чат-логов.

Рекомендации по дальнейшему изучению

  • GDC Vault: gdcvault.com — архив докладов Game Developers Conference. Поиск по «anti-cheat», «player behavior», «moderation» даёт десятки релевантных докладов.
  • Riot Games Tech Blog: technology.riotgames.com — регулярные публикации о технических решениях, включая античит и модерацию.
  • Gamasutra / Game Developer: gamedeveloper.com — статьи и постмортемы по системам модерации.

Заключение

Система репортов в extraction-шутере — это не просто «кнопка жалобы». Это сложная, многоуровневая система, объединяющая UX-дизайн, серверную архитектуру, машинное обучение, модерационные процессы и коммуникацию с сообществом.

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

  1. Репорты — это данные, а не приговоры. Ни один репорт сам по себе не является основанием для наказания. Репорт — сигнал, который система верифицирует через объективные данные.
  2. Автоматизация — необходимость, а не роскошь. При масштабе сотен тысяч игроков ручная модерация физически не справится. AI и ML — мультипликатор эффективности модераторов.
  3. Серверная авторитетность — фундамент. Никакая система репортов не компенсирует клиент-доверительную архитектуру. Если клиент может модифицировать урон или позицию — читы неизбежны.
  4. Справедливость важнее скорости. Лучше потратить лишний час на проверку, чем забанить невинного игрока. Ложноположительный бан разрушает доверие к системе сильнее, чем задержка в наказании читера.
  5. Специфика игры определяет детали. Extraction-шутер в сеттинге S.T.A.L.K.E.R. 2 создаёт уникальные контексты (аномалии, артефакты, фракции), которые требуют специфических категорий репортов и методов детекции.
  6. Коммуникация с сообществом — часть системы. Прозрачность, обратная связь и регулярные отчёты поддерживают доверие игроков и мотивируют их использовать систему репортов.
  7. Система никогда не «готова». Читеры адаптируются, появляются новые типы читов, меняются игровые механики. Система репортов — это живой продукт, требующий непрерывной итерации.

Этот документ — отправная точка. Конкретная реализация будет зависеть от технического стека, размера команды, бюджета и приоритетов проекта. Но принципы, описанные здесь, применимы к любому мультиплеерному проекту, где честность игрового процесса является приоритетом.

Удачной охоты в Зоне. Честной охоты.

Комментарии:
    » Report System Design Document: система жалоб и борьбы с читерством в мультиплеерном extraction-шутере на примере S.T.A.L.K.E.R. 2