Здравствуйте, дорогие пикабушники! (Если не хотите читать предысторию, начните читать со слов просчитывает самостоятельно
Наверное многие из вас убивают время в этой игре Agario
Но многие ли доходили до вершины, а если и да, то долго ли вы держались на ней? Думаю нет.
Так вот сегодня я расскажу вам как мы с другом бота для этой игры делали.
Так вот, начнем:
Началось все с того, что я и он часто умирали и он сказал
> За***ало все, давай хакнем!
Ну, а я и согласился
Сначала надо было понять, как все работает.
Игра написана на javascript и общается с игровым сервером через веб-сокет.
Основной игровой скрипт лежит в файле main_out.js.
Код там конечно же обфусцирован и всячески пытается не давать себя запускать откуда не следует.
Развернув файл в читаемый вид через дебаггер Хрома, встал вопрос: каким образом вклиниться в логику игры?
Вначале мы решили создать локальную копию файлов и соединяться с сервером, отключив в браузере проверку на кроссдомен
#файлы игры
/css/bootstrap.min.css
/js/jquery.js
/index.html
/main_out.js
/quadtree.js
#запуск Хрома без same origin policy
chrome.exe --disable-web-security
Это заработало для AJAX запросов игровых регионов, но дальнейшие попытки соединиться по веб-сокету были отклонены. Нужен был другой подход.
Можно похвалить авторов игры - на сервер ничего такого не отправляется, что можно было бы поменять в свою пользу (например: размер)
Клиент лишь шлет координаты мыши, куда бы игрок хотел передвинуть свой шар и сообщает о желаемых действиях (например:разделиться)
Сервер в свою очередь не отправляет никаких "лишних" данных.
Казалось бы все пути закрыты: сервер не доверяет клиентам никакой важной информации и всё просчитывает самостоятельно.
Но тогда можно обмануть сервер в рамках его правил: создать стаю ботов, которые постоянно будут жертвовать собой, увеличивая мою массу. Но как же ботам находить мою клетку на карте? Выручило само API сервера: если постоянно отправлять ему например координаты (0, 0), то игровая клетка будет всегда следовать в эту часть карты без остановки, пока не достигнет цели. Вместо нулей надо всего лишь отправлять ботам мои текущие координаты и они сами будут приходить ко мне на ужин!
Код клиента одновременно получает данные и перерисовывает объекты на экране. Можно было бы открыть 20 табов, управляемых ботами и один мой игровой таб. Но тогда надо было бы как-то передавать мои координаты в соседние табы. Плюс рисование каждого таба тормозило бы весь браузер (я пробовал — так и есть). Поэтому было решено создавать новые игровые сессии прямо в текущем табе, но выключить для них связь с отображением.
Так же нужно было дописать код, чтобы при смерти бота, он автоматически начинал новую сессию.
Результаты очень порадовали меня с другом, однако сервер раскидывает ботов на случайные серверы, и они не всегда достигают своей цели: их может съесть кто-нибудь другой(
Так что из пятидесяти ботов, которых мы создали, на ваш сервер будут попадать только 2-3, а именно вы будете есть по 3-4 бота за две минуты.
И наконец: боты маленькие, и поэтому когда вы будет топ2-3 вы не будете сильно расти)
Если же решить вопрос с тем, чтобы боты подключались на нужную карту, то тогда есть возможность серьезно потеснить своих менее технически-подкованных соперников!
Вот итоговый код клиента :
https://gist.github.com/edolganov/bda5ba88512bbc6a1f2c