Почему в доте1 никогда не будет анти-мапхака

Читеры – вечная проблема большинства игр. Единственный верный путь исключить их – перейти на систему абсолютного недоверия.

Игры до появления MMORPG

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

Отсутствие массового интернета делало читерство в сетевой игре невыгодным, так как попасть на сервер вновь было невозможным. Динамический IP? Анонимизатор? Не в то время.

Обработка информации и первое недоверие

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

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

В Warcraft 3 этот вопрос решился просто – каждый клиент отправляет хосту информацию о своем действии, а тот выполняет действие у себя и сравнивает полученный результат. Если клиент сказал, что купил юнита за 100 года, а у хоста на момент получения пакета ясно видно, что игрок имеет 50 голды, то покупки юнита у хоста и других клиентов не произойдет, и со временем возникнет ошибка синхронизации с дисконнектом хакера.

Система проста, логична и довольно шустро работает.

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

Принцип работы мапхака для Warcraft 3 довольно прост. Раз вся игра идет на компьютере клиента, и этот компьютер обязан знать, есть ли голд у врага или сколько урона нанеслось другому юниту во время атаки, то эту информацию можно узнать и хакеру.

Maphack и Warcraft 3 – бессмысленная борьба

Каждое действие игрока передается хосту, который проверяет его на соответствие и затем рассылает остальным клиентам. В результате каждый клиент знает действия других игроков, однако не видит их. Всё, что делает мапхак – это внедряется в код программы и заставляет видеообработчик думать, что все игроки расшарили себя для хакера.  Сам процесс игры же не подозревает об этом, и поэтому всегда отвечает “не видно”, если его спросить, кодом или внутри самой карты.

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

Warcraft 3 AntiMaphack System – пожалуй, одна из самых известных систем по защите карт. Часть её функций даже легла в DotA, когда ввели команду -ah, однако она была столь быстро взломана, что не произвела никакого впечатления на хакеров.

Пытаешься скрыть точки с миникарты пустышками – они подменяют пустышки обратно на точки. Скрываешь юнитов, делая их прозрачными – они выключают поддержку прозрачности и видят как обычно. Без полной переработки движка исправить эту ситуацию нельзя, поэтому мапхак будет в Warcraft 3 вечно, а значит, и в DotA1.

MMORPG и Steam

Именно в них шире всего распространился принцип недоверия, когда КАЖДОЕ действие игрока подвергается сомнению самого сервера. Эти технологии появились намного позже, чем Warcraft 3, и к тому времени широкополосный доступ перестал быть экзотикой. Поэтому решили, что всё должно выполняться непосредственно на сервере, а сам клиент – лишь отправлять то, что он хотел бы сделать, а не то, что он уже сделал.

Как результат – никаких мапхаков в их прямом понимании в MMORPG не существует, так как только сервер решает, когда отправить инфу о монстрах за углом. Steam также использует валидацию данных при помощи сервера, тем самым гарантируя – в Dota 2 мапхак появится только при взломе самих серверов Steam.

В Warcraft 3 игрок отдает приказ, и он выполняется на его машине, транслируясь серверу. В Dota 2 игрок просит выполнить приказ, и уже сервер решает, можно ли его выполнить. В Warcraft 3 приказ юниту “идти” отдается всем клиентам. В DotA 2 об этом приказе знает только сервер и игрок, поэтому следить за передвижением остальных физически невозможно.

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

 

 

“ХОСТ ЛАГИ”, или почему герои плохо слушаются

Задержка в варкрафте – постоянная проблема для всех. Кто-то не может добить крипа, а кто-то не удержал сфа от поворота и промазал койлом. И вроде латенси стоит 25, и вроде канал в гигабит, и сервер в соседней квартире, а все равно – герой слушается позже, чем нужно. А в коннекте ли дело?

lagi_suka_2000

Есть в WC3 такая настройка – задержка реакции (Reaction Delay). Она присутствует с самой первой бета-версии и хранится в константах каждой карты. По умолчанию её значение – 0.25 с. Что это значит для игрока? Что ЛЮБОЙ приказ, отданный юниту, выполнится через 0-0.25 секунд. Т.е., грубо говоря, мгновенной реакции на приказ не будет практически никогда (шанс выпадения нуля при рандоме от 0 до 0.25 находится около него же). Накой же это надо?

net_speed_2000

Вспомним на секунду, что варкрафт – это не RPG, а RTS. Это стратегия, а не диабла. В ней участвует куча юнитов, подконтрольных игроку, и куча разных триггеров. Естественно, благодаря возможности выделять кучу юнитов и организовывать группы можно было собирать армии на два экрана. А когда сходились две такие армии, то.. Обрабатывать всё это счастье в 2000 году, когда разрабатывалась игра, было просто нечем. Интернет был 56 кбит, а лучшим домашним процессором только только стал Pentium 3 766 МГц. И Blizzard подумали – как же доделать игру, чтобы она не плавила процессор, при этом не урезая размеры армий?

В результате мозгового штурма появилась идея разбить события на некоторый промежуток времени, выполняя каждое из них с некоторой задержкой. Т.е. вместо того синхронного удара по зданию от 100 пехотинцев каждый удар запаздывает на долю секунды (0.001, 0.002, 0.0034, 0.0051 и т.п.). В результате процессор обрабатывает события последовательно и не перегружается расчетами, а игрок особой разницы не замечает. К тому же звуковое сопровождение становится просто великолепным!

Игра не тормозит, армии сражаются красиво и смачно, новый кулер покупать не нужно, все счастливы. А теперь вернемся к DotA.

Здесь задержка – абсолютное зло. Гигантских армий нет, проблем со звуком тоже. Однако константу не изменяли, и по-прежнему КАЖДЫЙ приказ, отданный игроком, запаздывает на x секунд. А прибавив скорость интернета, удаленность сервера и встроенную задержку (Battle.net – 250ms, LAN – 100 ms, iCCup – по -latency) мы вполне можем ожидать исполнения отданного приказа 0.5 секунды. За это время СФ может развернуться назад и потерять нужный угол. А крип – умереть от руки более удачливого противника, которому рандом выдал меньшую задержку.

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

Кстати, случаи, когда Juggernaut не может ударить врага ни разу за свой ульт, или когда Xin не бьет некоторых юнитов, стоящих в AoE Sleight of Fist, тоже происходят из-за этой константы. Задержка реакции просто не позволяет успеть сделать атаку за отведенное время.

Голд и башни

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

Уровень Голд союзникам Голд убийце Голд каждому при убийстве крипами
1 200 450-470 200+460*0.7/x
2 240 500-520 240+510*0.7/x
3 280 550-570 280+560*0.7/x
4 320 600-620 320+610*0.7/x

где x – количество играющих игроков.

x\уровень 1 2 3 4
5 264 311 358 405
4 281 329 378 427
3 307 359 411 462
2 361 419 476 534
1 522 597 672 747

Ну а для наглядности:

График золота за башни

График золота за башни (клик для увеличения)

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