Silent aim на RedM: выстрел, который попадает туда, куда никто не целился
Silent aim на RedM не двигает прицел, он двигает пулю. Как сервер доказывает читерство, сопоставляя рассказ стрелка с рассказом жертвы.
Игрок погибает посреди улицы. Он покадрово пересматривает собственную запись: человек на другой стороне дороги смотрел в другую сторону, оружие на уровне бедра, а пуля всё равно прилетела ему в голову. Никто из вашего персонала не может сказать, что произошло, потому что на экране не случилось ничего необычного. Именно это и делает silent aim на RedM, и поэтому это самый трудный для наказания чит на ролевом сервере.
Что это такое на самом деле
Классический аимбот двигает камеру: он наводит прицел на цель, и это видно. Silent aim никогда не трогает камеру. Он позволяет игроку целиться куда угодно, а затем переписывает выстрел на выходе. Клиент сообщает серверу: точку выстрела, направление, поражённую сущность, точку попадания. Чит правит эти поля после щелчка и до отправки.
Результат - чистое противоречие: заявленный вектор прицеливания смотрит на север, заявленное попадание находится на западе, а игра всё равно применяет урон. В RDR3 это порождает сцены, которые очень легко узнать, если умеешь их читать: револьвер, попадающий с восьмидесяти метров из-за камня, выстрел в землю, убивающий игрока на балконе, мишень, падающая, пока стрелок шагом перезаряжается.
Качественный вариант ещё тише: чит отклоняет пулю всего на несколько градусов, ровно настолько, чтобы превратить промах в убийство. Игрок выглядит легитимно. Просто у него процент попаданий, какого нет ни у кого другого.
Почему человеческий глаз не может это решить
Три причины, и они накладываются друг на друга:
Жертва никогда не видит выстрела. Она видит последствие. То, что получает её машина, уже версия, исправленная читом, поэтому попадание приходится в правдоподобную позицию.
Стрелку нечего скрывать на экране. Ни захвата камеры, ни нечеловеческого движения. Запись его собственного экрана выглядела бы невинно.
Задержка размывает всё. На загруженном сервере от двухсот до трёхсот миллисекунд обычно разделяют то, что видит один игрок, и то, что видит другой. Выстрел, который выглядит невозможным, может быть обычной рассинхронизацией, и наоборот.
Поэтому silent aim месяцами живёт на хорошо администрируемых серверах. Приходят жалобы, админы идут смотреть, ничего не видят и закрывают тикет. Читер понимает, что на глаз его не поймают, и с каждой неделей играет всё откровеннее.
Единственное доказательство, которое выдерживает: два рассказа об одном выстреле
Выстрел - это не одно событие, а два рассказа. Стрелок описывает свой выстрел. Жертва описывает полученное попадание. Эти два рассказа приходят с двух разных машин, а чит работает только на одной из них. В этом структурная слабость silent aim: чтобы остаться согласованным, ему пришлось бы подделать и компьютер жертвы.
Поэтому сервер хранит оба рассказа раздельно. От стрелка: где была его камера, в какую сторону смотрела, какое оружие, в какой именно момент. От жертвы: откуда пришёл выстрел, какая часть тела, сколько урона. Затем они сопоставляются в коротком временном окне, и вы спрашиваете, описывают ли они один и тот же мир.
Конкретно мы задаём три вопроса, в таком порядке. Ни один из них сам по себе недостаточен: дело складывается из их накопления.
1. Была ли камера направлена хоть на кого-нибудь?
До попадания один простой вопрос: в момент выстрела пересекал ли вектор прицеливания стрелка какую-либо цель? Не нужную цель, а какую-нибудь. Игрок, наносящий урон сущности, пока его прицел указывал строго ни на кого, не промахнулся: он никогда не делал этого движения.
Это самый чистый случай, и именно его хорошо настроенный чит избегает: качественный silent aim держит правдоподобную цель где-то на оси, чтобы не попасться здесь.
2. Тот ли это игрок, в которого целились?
Второй вопрос: совпадает ли сущность, в которую, по заявлению стрелка, он целился, с той, которая на самом деле получила попадание? Расхождение между ними (прицел на A, попадание подтверждено у B) не имеет законного объяснения. Пуля не меняет получателя в полёте.
3. Физически ли допустим угол?
Затем количественная мера: угол между направлением, заявленным стрелком, и вектором, который на самом деле идёт от него к попаданию, о котором сообщила жертва. Честный выстрел даёт расхождение максимум в несколько градусов, объясняемое отдачей, разбросом оружия и тем, что оба игрока двигаются, пока летит пуля.
Мы считаем расхождение подозрительным только выше градусов, и только когда оно повторяется на нескольких скоррелированных выстрелах в одной перестрелке. Точный порог и число повторений не публикуются: разработчик чита, который их знает, выставит отклонение чуть ниже и снова станет невидимым.
Не публикуется/Пороги срабатывания не публикуются: известное значение - это значение, под которое настраивают чит.
Важнее всего повторение. Один одиночный широкий выстрел - рассинхронизация. Двенадцать широких выстрелов в одной схватке - программа.
Материал, который вы передаёте администратору
Детекция, не способная рассказать собственную историю, ничего не стоит: игрок её оспорит, и часть вашего сообщества встанет на его сторону. В таком разговоре выдерживают два рассказа, положенные рядом, выстрел за выстрелом.
- стрелок
- позиция, направление прицеливания, оружие, серверная метка времени
- цель на оси
- нет, либо идентификатор сущности, в которую целились
- жертва
- идентификатор, точка попадания, зона тела, урон
- угловое расхождение
- между заявленным прицеливанием и подтверждённым попаданием
- задержка
- измеренное запаздывание между двумя рассказами
- повторяемость
- число расходящихся выстрелов в одной перестрелке
С этого момента разговор меняет природу. Вы больше не говорите «античит его отметил», вы показываете одиннадцать выстрелов, в которых прицел игрока и рана его жертвы не могут быть правдой одновременно.
Чего этот метод не умеет
Три ограничения, которые мы предпочитаем записать сами.
Нужна жертва-игрок. Всё доказательство опирается на второго свидетеля. Читер, стреляющий только по NPC, животным или лошадям, не даёт никакого подтверждения: на другой стороне нет никого, кто мог бы опровергнуть его рассказ. Мы поймаем его другим способом или не поймаем вовсе.
Крошечное отклонение остаётся внутри шума. Silent aim, настроенный на один-два градуса, неотличим от отдачи и задержки. Мы могли бы сделать его обнаружимым, понизив порог, ценой оповещений на честных перестрелках, а античит, который кричит постоянно, в итоге игнорируют: этому посвящена статья о ложных срабатываниях. Поэтому мы принимаем, что пропустим нижний край спектра, но не станем обвинять ваших завсегдатаев.
Плохое соединение создаёт шум. Игрок с нестабильными 400 мс естественным образом порождает расхождения. Окно корреляции это учитывает, а выстрелы, чья задержка превышает то, что измерение способно поглотить, отбрасываются, то есть теряются. Плохое соединение немного защищает читера: такова цена того, чтобы не банить игрока на спутниковом интернете.
Коротко
- 1
Silent aim не двигает прицел, он переписывает выстрел, заявленный серверу: на экране не появляется ничего необычного.
- 2
Ни один человек-свидетель не может это подтвердить: ни жертва, ни запись стрелка.
- 3
Доказательство даёт сервер, сопоставляя рассказ стрелка с рассказом жертвы: цель на оси, личность жертвы, угловое расхождение.
- 4
Один расходящийся выстрел - сетевой инцидент, серия расходящихся выстрелов - программа.
- 5
Без жертвы-игрока, без измеримого расхождения или при слишком высокой задержке метод не делает вывода, и мы об этом говорим.
Материалы со скоррелированными выстрелами можно посмотреть на реальных данных в демо-панели, а тарифы публичны. Античит Baobab описывает весь стек детекций, к которому относится эта корреляция выстрелов.