Как стать автором
Обновить

Как мы «вырастили» и победили читеров в своем онлайн-шутере

Время на прочтение8 мин
Количество просмотров45K
Всего голосов 68: ↑63 и ↓5+83
Комментарии111

Комментарии 111

Да, все знакомо до боли)


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

В нашей игре MadOut2 тоже есть подсчет хеша, но старшеклассники его подделывают) правда у нас нет обфускации кода.


А по поводу обфускации, если у пользователей будут ошибки, можно ли будет понять где это произошло, или в callstak будет белеберда? И как быть с публичными переменными в Юнити, они же присваиваются по имени?


Интересно будет узнать, на чем вы написали backend для обработки данных, все таки ccu 70k это приличная нагрузка.

А по поводу обфускации, если у пользователей будут ошибки, можно ли будет понять где это произошло, или в callstak будет белеберда?

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

И как быть с публичными переменными в Юнити, они же присваиваются по имени?

Публичные переменные не обфусцируются, их используем только для интерфейсов, интерфейсы, как правило, не представляют интереса для взлома
> При обфусцировнии плагин сохраняют в файл соответствия исходных имен и обфусцированных. Мы эти файлы сохраняем и в дальнейшем используем для восстановления коллстеков.

А как это происходит, плагины или ручками по файлу ищите название методов?
Да, вручную ищем названия методов, процедура не частая, поэтому особо не напрягает
Интересно будет узнать, на чем вы написали backend для обработки данных, все таки ccu 70k это приличная нагрузка.

Он написан на Python, в скором времени планируем рассказать про серверную архитектуру в отдельной статье
Я вот очень внимательно читал и так и не увидел: а почему вы пытаетесь защитить клиент? Он в руках врага, без вариантов. Вопрос исключительно в популярности, потому что если игрой заинтересуются серьезные специалисты то ее будут выворачивать назинанку вечерком под чашечку кофе.
А как без защиты клиента?
К примеру я добавляю вывод внутриигровой информации там, где его не должно быть.(к примеру рисую прицел) Как это защитить со стороны сервера?
Никак, все что вы отошлете и примете от/к клиенту уже скомпрометировано.
Ну раз со стороны сервера это не защитить, то логично защищать со стороны клиента.

Да, но в статье речь не про рисование прицелов, а про "валюту, время до конца матча, здоровье и так далее".

В общем случае юзер выкидывает нафиг ваш суперзащищённый клиент и пишет свой.

Именно так, и самое смешное, когда оказывается что сервер верит клиенту во всем и всегда (полно встречал таких случаев) и вот тут начинается действительное хардкорное действо.
В общем случае юзер считает написание своего клиента слишком трудоёмкой задачей и забивает на написание.
Ничего похожего. Есть даже статьи для малограмотных по реверсу игровых протоколов. А еще есть люди которые написанием кастомных клиентов зарабатывают и весьма недурственные деньги.

Вы, если хотите, конечно можете отрицать, но эти лишь вопрос времени и/или популярности игры.
Ну почему-же, я не отрицаю.
Чтобы вас не съел тигр не обязательно бежать быстрее тигра. Достаточно бежать быстрее соседа.
Защита клиента вместо сервера это не бег быстрее тигра, это проживание в его клетке.

В один день вы можете оказаться перед фактом: читеров сегодня х1000 и делают что хотят и хорошо еще что сервак не шатают. Пока разберетесь пока найдете ваши репутационные потери будут чудовищные, и это если еще потом чистить не нужно будет пол сервака, если вообще сможете.
А ничего не писал про защиту клиента ВМЕСТО сервера.
У автора статьи это читается довольно явно.
Эх, те добрые времена, когда на монитор вешали в центр жеваную бумажку, чтоб со слона в голову стрелять без прицеливания… Куда оно все… Где… Как…
НЛО прилетело и опубликовало эту надпись здесь
Я вот очень внимательно читал и так и не увидел: а почему вы пытаетесь защитить клиент?

Защита клиента это только часть глобальной задачи по защите приложения. Мы перенесли на наш сервер хранение прогресса и добавили валидацию всех операций его изменения. Сейчас продолжаем работу по переносу с клиента на сервер логики начислений
Если не трудно не моли бы вы это включить в статью? Отрадно, что вы уже знаете, что клиенту доверять нельзя, но очень многие молодые разработчики тешат себя мыслью что таки можно и ваша статья тоже наталкивает на эти мысли.
К вам придут другие виды читов — aim, wallhack, и в зависимости от слабостей движка — эксплоиты в системах анимации, движения. На телефонах эта проблема нерешаема в виду отсутствия возможности иметь аналог античита на телефоне как, к примеру, у FaceIT с использованием драйвера. И учитывая, что последний успешно обходят — читы у вас в игре всё равно будут, нужен иные принципы защиты от таких видов читов в виде «надзора» пользователей или модераторов и тренированной нейросети, которая хотя бы в режиме предупреждения смотрела за игроками. Пишите еще подобные статьи, мне с другой стороны баррикад — интересно
Мне кажется, что совсем не обязательно искоренять читерство на 100%. Достаточно, чтобы количество читеров на 1000 игроков было достаточно низким, чтобы не портило средний игровой процесс. В том плане, что если на 100 игровый сессий только в одной из игр игрока вынесут сразу после старта, то он скорее всего даже не догадается, что это был читер, а не просто невезение. В итоге он не разочаруется в игре и будет играть дальше.

Соответственно, в этом случае становится важной не неотвратимость наказания, а его суровость — например, пожизненный бан в игре со всякими интеллектуальными системами предовращения повторных регистраций. В итоге большинство читерить побоятся, а меньшинство не сможет испортить геймплей. Разумеется, базовые античиты всё равно нужны, так как самые глупые из читеров не способны подумать о последствиях. Но с фанатизмом требовать полного доступа к системе, установки драйвера и т. д. — не нужно.

Эдакое участие во взрослении читеров, это по-своему даже мило)

Этакий чит-драйвен девелопмент ))
НЛО прилетело и опубликовало эту надпись здесь
Хранение прогресса локально на девайсе

Да, на начальных этапах это было реализовано в рамках прототипа, в дальнейшем перевели хранение на наш сервер
Как в итоге выглядит сохранение прогресса?

Прогресс хранится на сервере, при запуске клиент берет с сервера текущее состояние. Далее при каждом изменении сравниваются итоговые значения, и если они отличаются, то операция отменяется — клиент снова берет с сервера последнее валидное состояние. Думаю, еще напишем о хранении прогресса отдельно
Использовать читеров для, фактически, тестирования продукта в боевых условиях — это круто! Отслеживать их на тематических форумах — это своего рода тоже читерство — бить врага его же оружием))) Хорошо когда люди не зашорены и используют современные подходы к решению современных проблем.
Когда я встречаю очередную «зашифрованную» игру, в которой невозможно взломать показатели, я в неё просто не играю, а если такую купил в стиме — возвращаю деньги.
Хотя, возможно, я в меньшинстве.
НЛО прилетело и опубликовало эту надпись здесь
Но таким образом я сам регулирую игровой процесс.
Т.е. если какая-то часть (например фарм) кажется мне скучной — я могу получить необходимые ресурсы через читерство. Если какая-то часть (например необходимость быстрой реакции в синхронном нажатии клавиш и мышки) по возрасту мне тяжела, я могу стать бессмертным и избежать однообразных движений пальцами. В результате я играю только в то, во что мне интересно играть.
Так это ж и не ЦА игры скорее всего. У производителей обычно главная выгода поставить всех в бол-менее одинаковые условия, и сделать так, чтобы донатеров не обижали. От того, что уйдет читер, никто плакать не будет :)
Но таким образом я сам регулирую игровой процесс.

Подобная логика применима только к однопользовательским играм «для себя».
К соревновательным играм такое оправдание не применимо.

Естественно.
Но часто возникает подмена понятий.
Например однопользовательская игра в Steam имеет соревновательный элемент — «достижения». Из-за этого в однопользовательской игре старательно шифруют значения.
Только вот толку от такого соревнования в игре, когда в топе читеры с 99999999999, кому от этого стало лучше? А соревнование с ними просто бессмысленно и по сути убивает это в игре.
Ну раз уж мы заговорили о бессмысленности…
Мы же как бы тут все играем в игры.
И отлично знаем, что во множестве именно что онлайн игр, где заявлена борьба с читерами — в топе как раз читеры и сидят. И это абсолютно всем понятно, и люди пишут жалобы упомянутым выше «модераторам» (которые, якобы, должны быть одним из инструментов борьбы). Но ничего не меняется. Всё те же читеры, нередко даже явственно бессмертные, спокойно играют на множестве серверов множества онлайн-игр.
Потому что, как совершенно верно заметили другие комментаторы, «читы у вас в игре всё равно будут».

Мне это всё напоминает классическую ситуацию с «законами об оружии». У преступников всё равно оружие всегда есть — а страдают всегда законопослушные граждане.

Зато мерв борьбы регулируют их число. Если их станет совсем много, зачем такая игра? Не так давно играл в Dark Souls 3, и да все наигранные 59 часов читер встретился один раз, что терпимо. Хотя игра не новая, конечно, и интерес угасает.

Тут, на мой взгляд, важным моментом является режим игры. Защита от читов в single-player — это идиотизм и вредительство со стороны разработчиков. А вот в multi-player суровая необходимость. У каждого игрока свои представления, что ему скучно, а что интересно, в итоге без «общего знаменателя» в виде непреклонных правил игры едва ли статистически значимому количеству игроков будет интересно вместе.
НЛО прилетело и опубликовало эту надпись здесь
NikolayCherkashin, как вы считаете, есть ли корреляция между возможностью читов и ростом популярности игры (на начальном этапе)?
Интересный вопрос! Думаю, она есть, но сильно зависит от смысла игры и целевой аудитории. Более взрослую аудиторию, которой важна честность, читеры будут отталкивать. А на тех игроках, у которых на первом месте фан, на начальном этапе это, возможно, сильно и не скажется
Почему бы не использовать нейронные сети для вычисления читеров? Ведь поведение игрока читера заведомо отличается от честного игрока.

Много причин. Но как минимум не хочется раздувать объём за счёт скачивания на клиент натренированной модели.

Так это надо на сервере делать, а не на клиенте. Клиент хакнуть могут всегда отдавать «всё ок».
Как минимум из-за ложно положительных срабатываний. К примеру меня амазон забанил т.к. мои действия ПОХОЖИ на мошеннические. чем похожи не говорит, возможности разбанится не даёт.
Думаю, их можно использовать, но как дополнительную защиту, когда все основные уже реализованы. В отдельности это будет больше похоже на лечение симптомов, а не болезни, так как пройдет какое-то время, пока читер обнаружится
Достаточно демотивировать читерить большинство читеров. Я не думаю, что если на 100 игровых сессий честный игрок только один раз встретится с читером, он даже сможет понять, что это был читер, а не просто скилловой игрок. В итоге основная цель — избежать оттока игроков — будет достигнута.

А фанатичная борьба хоть «0 читеров», хоть «0 безбилетников в автобусе» обычно сопряжена с очень сильными неудобствами и для контролёров, и для простых граждан.
Потому, что некоторые игроки действительно не отличаются от читеров в прямом смысле этого слова, просто потому, что они тратят на развитие своих навыков по нескольку тысяч часов в специальных тренинг программах, например, тренировки для шутеров и наведения на цель, скажем, такой натренированный игрок может вполне себе создавать идеально ровную линию между начальной точкой и головой соперника и изредка делать кривую линию (Случайно, ведь он человек), что мешает тому же аимботу в случайный момент времени делать ту же самую кривую, чтобы обойти нейросеть? — ничего, в истории киберспорта, к примеру, уже были случаи, когда разработчики банили игроков просто потому, что их уровень игры не отличается от использования чита, что автоматически делает их ненужными для разработчиков, ведь такие игроки отталкивают основную аудиторию простых игроков, самый простой пример — овервотч и апекс, где некоторых игроков даже после предоставления доказательство и игры на ланах, как доказательство — всё равно перманентно банили. Увы, судя по всему, пока что нету идеального способа отследить читеров от профессионалов.

Одного знакомого "задрота" по КС не раз банили за, якобы, читы и доказать никак. Сначала злился, а потом принял это за меру его мастерства.

Это уже какой-то социализм в отдельно взятом MOBA-геймдеве получается.

Не равенство условий, а равенство результата....

Сюда же можно отнести включение авто-AIM для джойстиков в коссплатформах. Чтобы им не обидно было - будто кто-то запрещает им играть с клавомыши.

Отлично! Молодцы!
В качестве игрового сервера — Photon Unity Networking (Cloud), который не имеет серверной логики и, следовательно, не дает возможности контролировать игровую логику.

До этого момента никак не мог понять, почему вы так долго и упорно занимались какой-то ерундой вместо того чтобы сразу перенести хранение и валидацию данных на сервер. Имхо проблемы были бы более понятны, если бы этот момент был ближе к началу статьи обозначен.

Тут не совсем правильно выраженно как дела обстоят на самом деле. PUN это просто клиент. Это не игровой сервер от слова совсем. Да, он может продаваться с подпиской, но сервером от этого не становится.

Всё тот же PUN может быть использован для self-hosted решения, где вы вообще всё можете попереписать или для подписки позволяющей иметь плагин на сервере.

NikolayCherkashin поправьте, а то вводит людей в заблуждение
Действительно, тут я ошибся в формулировке, в тексте поправил. Спасибо за комментарий!

Наличие измененных версий игры в китайских сторонних сторах.>
Это прям классика жанра. Не просто скопировать софт а ещё и переиначить на собственный лад. Это не только в играх и не только в Китае такое бывает.
Я только не очень понимаю в чём выгода такого клонирования с добавлением изъянов и улучшайзеров.

Свою рекламу воткнуть?

Своя реклама или локализация интерфейса включая замыливание или удаление определенного контента.
Переделка интерфейса если это софт с меню управления под винду или стандартные юниксовые оконные менеджеры. Знаю вот интернациональную команду русские, украинцы и испанцы перерисовали интерфейс у немецко-американской поделки с желто-голубенького на ядовито черно-зленый. Даже не стали компилировать своё, зная что немцы использовали линь и иные решения с открытым исходным кодом. Тупо перекрасили и переименовали название служб и сервисов.

Китайский рынок — это же как отдельная планета. Куча своих запретов(нельзя кровь и прочее). Свои интеграции, свои платежки, своя реклама, как заметил Tarakanator.

Когда-то пытался придумать античит для CS:GO и понял, что не обойтись без ловушек-ханипотов. Иначе aim / wh не отловить

А можете, пожалуйста, подробнее рассказать о том, как устроить honeypot, чтобы ловить aim / wh?

Ну для aim можно повесить невидимую модельку игрока в стене (с отключенными коллизиями?), которая на пиксель выступает над стеной, чтобы защититься от хаков которые проверяют наличие преград и ждать, пока на нее наведется/выстрелит auto-aim. А еще модельки можно пихать динамически, чтобы work around-ы встраивать было сложнее.
WH кажется сильно сложнее ловить через honeypot и мне в голову не приходит как он тут поможет, особенно если учесть, что они обычно не убирают стены, а просто подсвечивают модельки и все нужное за стенами. С точки зрения античита я проверял к примеру «трассировкой луча» периодически с определением цвета пикселя на пересечении со стеной и моделями за ней. Он очевидно должен совпадать собственно с цветом пикселя стены. Вычисление видимости с отсечением невидимого при вычислении сцены все равно происходит, а значит вроде это все должно быть практически не затратно, в какой-то момент у движка должны быть все данные. Правда это не поможет от оверлея допустим, но их вроде тоже есть способы детектить. Но в любом случае, на любую хитрую гайку…
Это все конечно взгляд с дивана примерно в таких же теоретических рассуждениях про то, как это можно сделать.

Точно так же, вы всё очень правильно написали. Показываем игрока ЗА стеной, если на него наводятся и ведут — в бан его! Причем если сервер позволяет, можно показывать ханипот ТОЛЬКО этому игроку.

Была мысль показывать "призрака" там, где его не может быть или там, где его не увидит человек — чёрное на чёрном, текстура на текстуре, в общем, чтобы встроить распознавание в код было достаточно сложно. Или, например, сделать его размером с точку — если это сложно спалить на клиенте. Или в момент, когда на него навелись, "отдергивать" так, что нормальный игрок не попал бы.


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

Не думали проверить сделать отдельные комнаты для читеров? Посмотреть, будут ли они честно тусоваться там или всё же дружно проигнорируют и пойдут в комнату обычных игроков.

Не помню в какой игре, но такое уже было. Вместо бана запрещали доступ к серверам без читеров.
НЛО прилетело и опубликовало эту надпись здесь

И как? Неинтересно с такими же? :)

НЛО прилетело и опубликовало эту надпись здесь
Все сетевые игры страдают от читеров, но я не думаю, что у разработчиков есть стимул им противостоять. Скорее наоборот — «борьба» с читерами обычно выражается с кнопкой «report» и последующим баном, что приводит к тому, что читер снова тратит денежку на покупку игры. Ну, или игры пишутся круглыми идиотами, так как полностью исключить вероятность взлома это вопрос единственно сетевой криптологии, что не проблема для хорошего математика. И никаких дурацких обфускаций кода и прочие идиотизма не надо.

А если игра бесплатная?

Бесплатных игр не бывает, бывают только те, которые маскируются под бесплатные.

Зачем читеру что-то покупать в игре, если он знает, что рано или поздно ему придётся регистрировать новый аккаунт?

В большинство бесплатных встраивают элементы RPG, что бы ограничить возможности новым аккаунтам, зачастую геймплейно. Хочешь отрываться со над всеми и сейчас/быстро? Тогда потрать немного реального бабла на: оружие, броню, пропуски, бустеры, навыки и прочее-прочее. Читер — это ведь не нищий задрот, зачастую. Да и условно-бесплатная игра не зря имеет «условно» в начале: либо добываешь сам, но долго, либо платишь деньги и тратишь намного меньше времени.

Не дешевле ли читеру запускать бота для фарма?

Цель читера не читерить ради читерства, а получать удовольствие от факта превосходства над другими игроками. А теперь вы предложили ему отказаться от удовольствия на длительное время, ради экономии денег. Много вы видели алкоголиков, готовых отказаться от алкоголя на 5-6 дней в неделю, что бы 1-2 вечера пить на заработанное? Именно это вы и предлагаете совершить в отношении читера.

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

Всегда пожалуйста. А вообще на них и так всегда навариваются по максимуму. Что читеры, что ногебаторы, что ботоводы, что торговцы за реал, являются главным стабильным контингентом для финансирования всех условно-бесплатных игр. Они покупают регулярно, много и по расписанию. Покупатели шапочек и текстурок за оверпрайс, по стабильности покупок идут уже после них, т.к. это второй способ выделится среди остальных.
Wallhack (или видение сквозь стены) и Autoaim (автоприцел, компенсация отдачи) работают чисто на клиенте и с данными клиента, и никакой сетевой криптологией не лечатся. Схема типичного чита для сетевого шутера проста: среди данных найти местоположение противника, вычислить вектор для попадания в голову, навести прицел на голову, выполнить несколько выстрелов с компенсацией отдачи («перемещая» прицел в сторону, противоположной отдаче), если она псевдослучайна или прогнозируема (реалистична), вернуть прицел в исходную позицию, что бы не сбивать игрока.

В игре это выглядит следующим образом: пуля в голову прилетела с расстояния в 2 км, едва только ты оказался в зоне видимости читера. Для сервера все эти действия так же абсолютно легитимны: поворот, выстрел, поворот, выстрел, поворот, выстрел, поворот. Вот вам и отсутствие дурацкой обфускации и прочего идиотизма.
Ну, во первых, wallhack это стрелять через стены, видеть это radar hack. :)
Сейчас по порядку. Клиенты надо делать наподобие сервиса NVIDIA Go, где клиент — это очень простая программка, которая посылает input юзера и в ответ получает картинки. Разумеется, не каждая компания потянет на собственные рендеринг фермы, так что поток с сервера не картинки а, в лучшем случае, геометрия. Копаться в геометрии, чтоб найти голову — нет смысла. Разумеется, это повышенная нагрузка на сервер и сеть. Если и на это нет ресурсов, то сваливаемся в классический случай, когда с сервера идут сообщения о состоянии (координаты объектов). Тогда это уже описанная вами ситуация.
Radar hack(частично) лечится путем дискретного минимализма: одно сообщение — это один объект, а не его изменения (трансляция и прочие). Клиент получат сообщения только в пределах его прямой видимости. Если враг за углом или за спиной, то сервер сообщения о нем не шлет, соответственно объекта в памяти нет.
Остается aimbot (autoaim) в пределах прямой видимости. Чтобы навести прицел на голову, ему понадобится генерировать системные события (сообщения, mouse input). С обратной контрольной связью. Что 1. сложно и 2. по моему, можно детектить (или сразу фильтровать) все сообщения, которые не идут из драйвера. Или, в конце концов, общаться напрямую с драйвером.
Все это, конечно, в контексте надежно шифрованной связи.
Как-то так.
Ну, во первых, wallhack это стрелять через стены, видеть это radar hack. :)

Попутал за давностью лет. Вы правы.
Клиенты надо делать наподобие сервиса NVIDIA Go, где клиент — это очень простая программка, которая посылает input юзера и в ответ получает картинки.

И сервера по всему миру, особенно для шутеров. Тот же МК через Remote Play в пределах одного города, периодически имеет сбои. Боюсь крайне мало компаний могут потянуть такое.
Клиент получат сообщения только в пределах его прямой видимости. Если враг за углом или за спиной, то сервер сообщения о нем не шлет, соответственно объекта в памяти нет.

Что приводит к появлению противников из воздуха, из-за естественной задержки на обмен с сервером. С этим можно смириться в MMO и нельзя в сессионных играх. А так же такой механикой вы напрочь исключили источники звука, позволяющие противника банально услышать. Это ведь важный элемент геймплея: определять местоположение противников даже тогда, когда ты его не видишь. Тоже все преломления источника звука считать на сервере для каждого игрока, да еще умудряться синхронизировать?
Что 1. сложно и 2. по моему, можно детектить (или сразу фильтровать) все сообщения, которые не идут из драйвера.

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

Да и прямую инъекцию кода в клиент никто не отменял, когда из клиента вырезается вся защита и делай что хочешь. И это тоже далеко не редкий случай, который детектят серьезными плясками с бубном, о чем, кстати, автор тоже упоминал.

Как было 10 лет назад: все что ушло клиенту, уже скомпрометировано, так оно и сейчас осталось. Вот и приходится разработчикам прыгать между двумя огнями: с одной стороны игроку нужен «гладкий игровой опыт», а с другой стороны, нужно поставить всех в равные условия. И никто уже не готов играть в шутер без звука, без позиционирования по звуку, с врагами выпрыгивающими из воздуха и появляющимися на экране через пол секунды, после того, как тебя уже убил. Да еще и ценник должен быть адекватный, а не подписка за оверпрайс, ради оплаты большой вычислительной мощности на уровне сервера, что бы успевать считать все, что игроки видят, слышат и чуют.
Повторюсь — отправной точкой должна быть NVIDIA Go. Чем меньше вещей делает клиент, тем лучше защита, естественным путем. В связи с чем:

Что приводит к появлению противников из воздуха, из-за естественной задержки на обмен с сервером. С этим можно смириться в MMO и нельзя в сессионных играх.


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

А так же такой механикой вы напрочь исключили источники звука


С какой статьи? Это самая простая вещь. Client.SendMessage(MsgSound, SoundID_step, SoundVolume(0.5))

Да и прямую инъекцию кода в клиент никто не отменял, когда из клиента вырезается вся защита и делай что хочешь. И это тоже далеко не редкий случай, который детектят серьезными плясками с бубном, о чем, кстати, автор тоже упоминал.


Как было 10 лет назад: все что ушло клиенту, уже скомпрометировано, так оно и сейчас осталось.


Делай с NVIDIA Go всё что хочешь. Ломай, изменяй, ВСЁ. Пользы никакой. У меня навязчивое чувство, что у вас не до конца оформилось понимание идеи.

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


Да, я согласен. С одной стороны, нагрузка на сервер будет огого. С другой — невзламываемая игра будет привлекать очень большую аудиторию. Тут уже слово разным финансистам и маркетологам, не даром же хлеб едят? :) Если нет финансовой пользы, то и делать незачем. То-же самое с геймплеем — это вопрос экспериментов и R&D. Если не получится дотянуть хороший геймплей — затея теряет смысл.

Да я понимаю про что вы. Вот только пока что оно неиграбельно в любых активных играх. Попробуйте Mortal Kombat через Steam Remote Play, даже при хороших каналах связи на источнике и клиенте, регулярно случаются лаги и потеря синхронизации. В пределах локалки работает отлично, при выходе в глобал уже все не так радужно, как казалось, а ведь мы гоняли его в предалах одного города. Тут и лаги, и кубики во время лагов, а окно действия у тебя меньше секунды. В реальности же у вас игроки из одного огромного географического региона работают с датацентром, который расположен намного дальше. Что годится для RPG или стратегии с окном реакции в секунду-две, совершенно не годится для той же кваки или МК, когда у тебя мозг осознает ситуацию уже после того, как руки сделали. В современных сетевых играх эту проблему рассинхронизации решают с помощью прогнозирования и это работает отлично, но для прогнозирования клиенту надо слишком много данных, которые и используются читами. Стриминг же полностью лишает клиент всех средств прогнозирования, да еще и получается рассинхрон, когда абсолютно все клиенты живут в прошлом, да еще и в разном прошлом, и иногда это прошлое становится слишком старым, и возникает лаг, вызванный повторной синхронизацией.
Да, я согласен. С одной стороны, нагрузка на сервер будет огого. С другой — невзламываемая игра будет привлекать очень большую аудиторию.

Вы очень оптимистичны, большую аудиторию привлекает не невзламываемая игра с дорогой подпиской, а бесплатная игра или игра с единоразовой оплатой, даже если там много читеров. Люди такие сволочи, что всегда хотят всего побольше, бесплатно и что бы им ничего за это не было. Причем видимая цена будет на первой строчке. На этой психологии и работает FTP, когда вроде бы оно и бесплатно, но для комфортной игры надо платить даже больше, чем за подписку в альтернативной игре. Причем платить так же регулярно, под комфортом я подразумеваю не только игровые преимущества, но в том числе и банально стремные и однообразные бесплатные шкурки.

Если у вас игра с супер защитой за 2,000 попугаев в месяц, а условный EA предлагает тоже самое за 2,000 попугаев разово, но без навороченной защиты и себестоимостью содержания раз в 100 ниже, чем у вас, то вас задавят банально экономически. А что бы не задавили, вам придется серьезно вкладываться в маркетинг, а значит разница в стоимости содержания вырастет еще в несколько раз. Результат думаю очевиден. Это же классическая дилема в сфере торговли: что больше суммарной прибыли принесет, дешевый палит или топовый ROG? Топовый ROG вроде и лучше, но купят-то все равно палит, т.к. он дешевле, не смотря на его недостатки в конкретно этой модели.
Ну, нет. У вас слишком крайнее мнение. :)
что больше суммарной прибыли принесет, дешевый палит или топовый ROG? Топовый ROG вроде и лучше, но купят-то все равно палит

Нет, в конце-концов, львиную долю сгребают вполне себе средненькие асусы и гигабайты. Современный сетевой гейминг это не очень большая разовая цена и не подписки. Это умеренная (до бесплатно) цена и микротранзакции. В этом тоже нужно очень внимательно соблюдать баланс: микротранзакции должны быть достаточно привлекательны и одновременно не должны давать слишком большое преимущество. Розовый Калаш никто не купит, но и в игре не должны появляться «голд шутеры» как в WoT. Я повторюсь: все это — дело долгих исследований и головочесаний. Как и техническая часть, впрочем. :)
Розовый Калаш никто не купит

Я тоже так думал, пока не открыл как-то в стиме рынок по контре и не офигел, что именно там за оверпрайс продается. И желтый, и розовый, и в кислотных разводах, и каждый в несколько раз дороже самой контры.
но и в игре не должны появляться «голд шутеры» как в WoT.

Шутеры идут той же дорогой, что и MMORPG, только отстают лет на 10. А если попадает все в руки условного Mail.ru, то и донат с преимуществами становится анальным, и все равно люди платят. Они специалисты по выкручиванию реальной стоимости бесплатной игры так, что тот же WOW с его подпиской курит в сторонке.

Но это игры в текущих рыночных условиях, когда затраты на сервер очень медленно масштабируются от количества игроков. У игры через стримминг картинки наоборот очень высока серверная нагрузка, да еще и кратно возрастающая от количества игроков. При этом конечный для игрока продукт выглядит абсолютно точно так же, как и остальные.
Если он стоит столько же, как и прочие, то вы получаете намного меньше операционной прибыли, чем другие, а значит и меньше возможностей вложения. Т.е. у конкурентов огромное преимущество по сравнению с вами.
Если же вы подняли ценник, с целью компенсации повышенных накладных расходов, то вам тут уже возникает проблема с игроками: если игра такая же, да еще и с дополнительными проблемами, то зачем платить больше?

Сырая еще слишком технология, да и обычным консолям она проигрывает, т.к. там читеров намного меньше, ибо узкоспециализированное устройство с узкоспециализированной ОС намного проще прикрыть от тех читов, которые чаще всего применяются на PC. И это будет в обслуживании многократно дешевле.
wallhack это стрелять через стены, видеть это radar hack

С кем не общался, у всех WallHack подразумевался как "видеть силуэт врага за препятствиями". И как это "стрелять через стены"? Оно даёт простреливать непростреливаемое или же показывает силуэт врага только в простреливаемых местах?
Посмотрите в поиске "Radar Hack" — у меня показывает "на радаре всегда будут показываться и союзники и враги".


не картинки а, в лучшем случае, геометрия. Копаться в геометрии, чтоб найти голову — нет смысла.

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

А для меня wallhack это проходить сквозь стены

А noclip?

в CS (чуть ли не всех версиях вообще) стены простреливаемы, и народ в том числе «на слух» без всяких читов умудрялся класть противников таким образом еще в лохматые года.
Все проще же, помимо сложной геометрии всегда есть намного более упрощенные хитбоксы, которые и используются для определения попадания. Причем геометрия у них простая и положение фиксированное для основных поз, и в большинстве случаев можно считать ее простым кубом. Что бы найти где находится хитбокс головы, нам достаточно знать координаты противника, его положение (стоит, сидит, лежит). Смещение от анимации можно не учитывать, т.к. разброс скорее всего даст большую погрешность, чем анимация. Зная 2 точки, рассчитать вектор, это дело элементарной тригонометрии. Зная требуемый вектор прицела в голову и вектор текущего направления взгляда, скорректировать прицел уже просто элементарная задача.

Зачем хитбокы на клиенте?

Анимации, декали крови и прочие красявости.

Это всё ведь не критично получить с задержкой от сервера.

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

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

А в третьих сначала анимация попадания в голову, а потом ворох пуль от этой вроде как мертвой головы, т.к. после синхронизации с сервером оказывалось, что ты промахнулся. Или демонстрация кучи попаданий и кровища во все стороны, а через долю секунды оказывается, что прогностическая модель конкретно ошиблась и тело не продолжило бежать прямо, а чуть раньше остановилось и уже стреляет в тебя. При этом компенсация рассинхронизации реализована плавно, а не рывками. Просто на долю секунды тушка вышла на запредельные скорости переходя из одной анимации в другую. И это уже давно было реализовано, еще старая добрая контра времен подвальных клубов уже имела прогнозирование и лагокомпенсацию.
Замечательная статья и была бы нам очень полезна в своё время! Всё очень знакомо…
В нашем проекте (2D онлайн-выживалка, только PC) мы придерживаемся философии «клиент в руках врага» и поэтому всё изначально было написано с авторитарным сервером и тотальным контролем информации, передаваемой клиенту. Клиент же просто запускает код симуляции, идентичный серверному, для предикции лага, а сервер принимает только команды инпута. Игра при этом легко моддится (код самой игры (не движка) доступен на гитхабе, 0.5 млн строк).
Согласно нашему подходу, делать саму игру следует таким образом, чтобы всевозможные читы были бесполезны. Мы продумывали игровые механики таким образом, чтобы в принципе избежать какой-либо пользы от читов. Худшее, что мы ожидали — аимбот. Хотя игра 2D и прицелиться — дело не хитрое. Но, т. к. со временем была добавлена механика отдачи для автоматического оружия, у игроков появился стимул разработать аимбот (что удалось пофиксить просто добавив для автоматического оружия рандомный разброс на сервере, сделав всякие попытки компенсации бессмысленными; кстати, при высокой скорострельности игроки не замечают, что на самом деле стрельба на сервере симулируется иначе и промахи/попадания не совпадают). Также игроки бот на автоматическое применение оптимальной медицины создали (что пофиксить, конечно, гораздо проще на уровне игровых механик — просто запретили стрелять, пока хилишься — лишать себя такой возможности в пылу боя никто не захочет). Но в итоге PvP-игроки выразили категорическое мнение, что на PvP серверах клиенты должны быть без каких-либо модификаций. Пришлось городить дополнительные слои защиты, шифрования, верификации. Успешно, и не чересчур сложно, благо изначально клиент уже был защищён обфускацией. В итоге у игроков стимула пытаться что-то хакать на стороне клиента не осталось — чересчур много труда (который окажется напрасным стоит нам только собрать новый билд игры несовместимый со старой версией), игровые механики не позволяют получить какого-либо преимущества, а авторитарный сервер просто не принимает от клиента ничего кроме инпута и не присылает ничего такого, что клиенту не следует знать.
Кстати, за всё время мы не забанили ни одного игрока, несмотря на общее число игроков за 200 тысяч человек. Если всплывал факт чита, мы воспринимали это как нашу недоработку.

> 9. Добавили защиту от взлома оперативной памяти.
Было бы интересно узнать, какой подход был использован! В случае .NET приложений, это не так-то просто.

> К новым проектам в разработке тоже стали относиться по-другому и сразу пишем их с защитой, почти как у полноценных ААА-игр.
К сожалению, в последние годы многопользовательские AAA-игры не принято писать с адекватной моделью защиты (хотя бы с подлинно авторитарным сервером). Это сложно, дорого, и не всё возможно сделать хорошо в рамках такой модели (когда клиенту ноль доверия). Обычно просто используют защиту клиента — EasyAntiCheat, BattleEye, которые с переменным успехом позволяют пост-фактум банить читеров, но которые так же не составляет огромного труда обойти (причём не обязательно на уровне клиента, а на уровне сетевого протокола). Существует гигантский чёрный рынок платных читов. Перечислять AAA-проекты за последние 5 лет, кишащими читерами, нет смысла — проще перечислить те, где их нет (по моему, их — нет). Дырявый сервер же пытаются защищать с помощью ИИ (machine learning оценкой поведения игроков на сервере) — что мне видится просто как страшный костыль, не исключающий false-positive срабатываний. Не уверен, что это приведёт к чему-либо хорошему. Вот перенос гейминга в защищённое облачное окружение (с клиентом-терминалом для приёма игрового инпута и отображения транслируемого видеопотока) может гарантировать полное исключение читинга — ценой повышенной латентности. Однако провал Google Stadia показывает, что мы ещё не скоро до этого доберёмся.
ушёл из WoT в WT как раз из-за такого подхода.
По сути в WoT механика видимости сделана скриптами(если ты танк «не видишь» то и изображения его нет) в WT же надо искать врагов глазами.
Первые тысяч 7 боёв мне это казалось идеальной защитой от читеров… а потом я пошёл в командные бои… и увидел что при такой системе видимости и правильной игре весь геймплей ломается и становится слишком искуственным.
У нас всё гораздо проще т. к. в нашей 2D игре вид сверху и игрок всегда всех видит в рамках поля обзора (30x16 «метров» для всех игроков независимо от разрешения экрана, автоматически скейлится). Стены не являются препятствием к обзору.

В 3D играх всё значительно проблематичней. Сервер в принципе может не присылать то, что игрок не способен видить (объекты за холмами, стенами и другими непрозрачными препятствиями), однако будет ощутимый лаг при входе объектов в поле зрения игрока.
В 3D шутерах есть другие проблемы — например, игроку нужно слышать шаги с 3D-позиционированием для персонажей за стенами.
обзора (30x16 «метров» для всех игроков независимо от разрешения экрана, автоматически скейлится)

А если соотношение сторон другое?
однако будет ощутимый лаг при входе объектов в поле зрения игрока.

При чём проблема не только в самом лаге, но и в том, что неизвестно когда он есть.
Несколько раз игра мне не показывала танк там, где он 100% был(WT). И это речь про случаи в которых я уверен на 100%типа посмотрел за камень, там пусто, выезжаю и меня убивает танк, стоящий за тем камнем.А уж сколько таких случаев я списывал на: ну наверно не заметил в кустах, одному богу известно.
С учётом RT видимость не ограничивается прямыми линиями… ну это на будущее скорее.
А ещё с видом от 3-го лица камеру можно переместить практически мгновенно на несколько метров. что тоже изменяет видимость.
А если соотношение сторон другое?

Для хардкорных PvP-игроков есть опция «16:9 (PvP max view)». Добавляются чёрные полосы по сторонам экрана, но гарантирован максимально возможный обзор.
Без этой опции, картинка будет обрезаться сверху и снизу, если у игрока монитор ultrawide 21:9 (если ещё шире — чёрные полосы добавятся слева и справа, т. к. уж слишком сильно обзор резать невозможно). Мы не особо беспокоимся, т. к. согласно статистике Steam, игроков с ultrawide мониторами не больше пары процентов (есть статистика по разрешениям экрана и из неё это очевидно). И динамика такова, что 16:9 сегмент растёт быстрее, чем ultrawide.

При чём проблема не только в самом лаге, но и в том, что неизвестно когда он есть.
Несколько раз игра мне не показывала танк там, где он 100% был(WT).

От багов в имплементации ничто не поможет. Если пинг низкий и код определения видимости написан правильно, проблем не будет и лаг будет едва ощутим.

А ещё с видом от 3-го лица камеру можно переместить практически мгновенно на несколько метров. что тоже изменяет видимость.
Это верно. И если камера действительно полноценно и сразу просчитывается на сервере (а не привязана к самому танку), будет ощущаться лаг равный пингу.

учётом RT видимость не ограничивается прямыми линиями

Да, отражения сильно усложняют всё. Придётся выбирать, игра честная или игра красивая… для новых игр, в которых не принципиален соревновательный PvP, игроки выберут последнее. Графика продаёт игры, увы.

Делать 3D игры (кроме случая, когда вид сверху) с полностью авторитарным сервером — сложнейшая задача, к тому же требующая множество компромиссов. Поэтому и практически все AAA проекты просто не заморачиваются с этим — проще поставить какой-то клиентский античит и банить подозрительных игроков волнами уже пост-фактум. А игроки уже привыкли, что везде есть читеры…

К слову, даже если очень захотеть, маленьким инди-студиям клиентские античит решения для Windows практически недоступны — например, любопытства ради мы связывались с EasyAntiCheat и они перестали отвечать нам, когда узнали наш доход за прошлый год (он весьма приличный для нашей маленькой студии). Не говоря уже про то, что игроки могут просто убить своими отзывами инди-игру в случае, если их банить (хотя недавно в Steam появилась опция раздавать баны игрокам через отдельный API, лишая их доступа к игре полностью, аналогично VAC — но есть сомнения, дадут ли к этому функционалу доступ инди-разработчикам и сохраняется ли возможность написать негативный отзыв в случае такого бана). От отзывов и рейтинга очень сильно зависят продажи, по нашему опыту и опыту нашего издателя.

Мы ориентировались на возможность портирования на другие платформы, полную поддержку моддинга (опенсорс), невозможность (да и нежелание в силу их ненадёжности и инвазивности вплоть до уровня ядра ОС) использования любого популярного клиентского анти-чит решения, отсутствие банов за читинг в принципе. Получилось? Получилось. Но игра разработана с соответствующей философией и соответствующим геймплеем, механиками.
НЛО прилетело и опубликовало эту надпись здесь
С настройками по умолчанию картинка игры (рендеринг мира, не UI) crop'ится в разумных пределах в случае несовпадения соотношения экрана с 16:9 (сверх разумного — добавляются чёрные полосы). В случае монитора 16:10, картинка лишь чуть-чуть обрежется слева и справа, а вертикальный обзор будет, как если бы монитор был 16:9. Если монитор 16:9 повёрнут боком — будут огромные чёрные полосы сверху и снизу. Но так никто не играет.
Я писал выше, что мы не беспокоимся на этот счёт — большинство игроков не замечает небольшого кропа картинки, а PvP-хардкорщики имеют опцию. При этом согласно статистике Steam порядка 90-95% игроков имеют экраны 16:9 (даже если они играют в оконном режиме развернув на весь экран, картинка лишь чуть-чуть обрежется). Т. к. игра доступна только для PC/Steam, проблемы с этим нет и игроки не жалуются.

Тянет на целую статью, интересно было бы почитать.


Насчёт облачного гейминга — на DTF, например, уже пробовали натренировать нейросеть целиться по картинке и она более менее успешно работала. Это тоже не панацея.
Также в файтингах невозможно определить насчёт комбо — выполнил опытный игрок или скрипт.

Вряд ли вы победили читеров, если вся игровая логика считается на стороне клиента. Появление новых читов это вопрос времени. Игровая логика должна вычисляться на стороне сервера, а клиент грубо говоря должен быть просто утилитой для рисования графики и не более.

Как всё печально в разработке современных сетевых игр. Прочитал статью полностью. Разжёвывать не вижу смысла — вам это не поможет. Напишу лишь, что в описанном противостоянии школьники — это не ваши игроки, а вы сами.
Из за читеров перестал играть в многие игры. Портят игру.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий