Этот вопрос был у меня в голове некоторое время ... в основном потому, что я вижу ботов для всех видов игр, таких как WoW и другие. Мой вопрос как боты узнают, что появляется на экране? Я не играю в WoW, поэтому мой пример может быть неправильным, но если, например, есть монстр, как бот узнает, где этот монстр находится на экране и как он знает, как с ним взаимодействовать?
Можете ли вы применить это к любой игре или это специфично для каждой игры? Я извиняюсь, если вопрос не ясен ... и я не спрашиваю, как сделать бота, а спрашиваю, как они обнаруживают вещи на экране, как это довольно увлекательно для меня!
Заранее спасибо :)
Ответы:
Есть много моментов, когда бот может внедрить себя в игру.
Экран - один из них, но далеко не самый полезный. Тем не менее, я когда-то видел очень раннего прицела для Counter Strike, который использовал цветовое кодирование. Это было с альтернативными моделями персонажей с одноцветными текстурами (игра была достаточно дружественной к моддингу, чтобы позволить это), а затем просто обнаруживающими пиксели этих цветов. Хотя не очень эффективный метод. Тогда это было уже довольно неуклюже и становилось все менее и менее жизнеспособным, потому что графические движки становятся все более и более мощными, а это означает, что все больше и больше деталей запутывают любые алгоритмы оптического распознавания.
Другим моментом является непосредственное чтение памяти [1] . Возможно, чтобы одна программа на вашем компьютере считывала память другой. Поэтому разработчику просто нужно узнать, по какому адресу памяти в игре сохраняется информация, относящаяся к боту. Существуют инструменты, которые помогают разработчику найти то, что он хочет, создав образ памяти и предоставив различные инструменты поиска. Контрмера - использовать рандомизацию адресной разметки, но умный бот может автоматически найти то, что ищет.
Можно изменить сам исполняемый файл игры. Чтобы сделать это, разработчики ботов должны уметь читать и программировать на ассемблере, что не так сложно с практикой. Затем они ищут код, который обрабатывает интересующую их информацию, и переписывают ее, чтобы передать ее своему боту. Возможная контрмера с точки зрения разработчика игры состоит в том, чтобы использовать обфускатор, чтобы сделать код ассемблера игры менее читабельным, но обычно это не очень хорошо для производительности, и для многих обфускаторов есть инструменты, которые обращают вспять свою работу.
И тогда есть сетевой код. В онлайн-игре сервер отправляет свойства и позиции всех объектов в игре по сети. Поток сетевых данных между сервером и клиентом может быть перехвачен и проанализирован. Популярный инструмент для этого - wireshark, Когда разработчик повторно разработал сетевой код, он может написать бота, который перехватывает сетевой трафик, как это делает Wireshark, и использует информацию для принятия решения. Когда разработчик более мотивирован, он может даже разработать полноценный игровой клиент с нуля, который реализует сетевой протокол и играет в игру, даже не имея графического вывода. Такие боты очень популярны у золотых фермеров, потому что без графического вывода клиент обычно гораздо более дружественен к ресурсам, что означает, что они могут запускать множество из них одновременно на небольшом сервере.
1: Поскольку вы упоминаете WoW, стоит отметить, что в ранней и пресловутой программе ботов WoWGlider использовался прямой доступ к памяти. У Blizzard была подпрограмма Warden, предназначенная для обнаружения и блокирования доступа внешних программ к внутреннему игровому состоянию WoW. Поскольку программа для ботов обошла эту защиту и считала память без разрешения, в 2006 году решение MDY v Blizzard было принято в пользу Blizzard на том основании, что производитель ботов поощряет и позволяет своим пользователям нарушать авторские права и нарушать DMCA .
источник
Боты являются игроками. Они просто читают позиции игрока / монстра с сервера, как и любой другой игрок, и используют эти значения в сочетании с простым AI-сценарием для выполнения действий в игре, программно моделируя нажатия клавиш и щелчки мыши. Если бы у ботов действительно был алгоритм, позволяющий определять, что за монстр находится на экране, и взаимодействовать с ним, это было бы довольно впечатляющее программное обеспечение, которое стоило бы миллионы. Это в основном ИИ для роботов.
источник
Филипп уже дал большой обзор того, как работает большинство ботов, но я просто хотел рассказать о нем немного подробнее, так как у меня есть немного личного опыта разработки для всех типов ботов, которые он охватывал.
В Runescape существовал большой проект (RSBot), который копировал бы содержимое памяти из клиента Runescape в его локальную память, где он мог затем просматривать все состояние игры без риска того, что клиент зацепится. Потребовалось немного реинжиниринга, чтобы определить, где искать в памяти, чтобы найти указатели на данные, но как только они это сделали, они предоставили API, чтобы воспользоваться информацией. Он точно знал бы, что было в мире, получив координаты объекта, а затем преобразовав их с помощью матрицы преобразования камеры, чтобы получить положение на экране. Маски попаданий также были читабельными, поэтому было легко определить, в какой именно диапазон перемещать мышь, чтобы получить желаемый результат.
Бот предоставил кучу отладочной информации, такой как аннотации, которые сообщают разработчику, где находятся координаты плитки, какой идентификатор у этого объекта, какой идентификатор принадлежит данному элементу и т. Д. Эта информация может затем использоваться для создания ботов. Фактический процесс создания скриптов для ботов был довольно простым. Среда предоставила много полезных функций, таких как
move_to(world_coordinates)
илиmouse_move(x,y)
которые могли бы выполнять определенные действия в некоторой степени правдоподобно (перемещение мыши вдоль случайного сплайна, многократное перемещение через миникарту и экран и т. Д.)Также в Runescape у вас есть возможность резко снизить качество графики. На самом деле было довольно легко делать определенные виды ботов, снимая экран и применяя некоторые базовые концепции компьютерного зрения, чтобы построить модель мира. Используя эту технику, я сделал и проклятого бота, и плавильного бота, оба из которых работали довольно хорошо. Он просто взял бы кадр, увеличил бы насыщенность настолько, насколько мог, и затем попытался бы извлечь из него шаблоны, которые он мог бы затем сгенерировать карту вероятности для зон щелчка.
В случае с проклятым ботом целью был меньший демон, который просто огромная красная вещь, которую тривиально найти. В случае плавильного бота он будет искать маленькую оранжевую трапецию, окруженную серым, и это будет печь. Он также попытался бы найти большую, светло-серую «L» форму, которая была бы банковским столом. Это было сделано только с помощью даунскейлинга и базовой эвристики. Он также мог ориентироваться с помощью удобного компаса рядом с миникартой, поэтому он мог ориентировать камеру в более надежном положении, чтобы найти целевые объекты.
В различных играх Nexon серверы очень доверяют клиентам. Я использовал эту кучу тонны в Maplestory, изменив карты, чтобы убрать опасности или добавить перекосы, чтобы бот не был настолько сложным. Я бы также следил за трафиком к серверу и обратно, чтобы построить модель мира, которую затем можно было бы использовать для быстрого поиска и убийства монстров.
Когда я понял, что больше не играю в ММО, а просто автоматизировал их, я решил вообще прекратить играть. Если бы я не беспокоился о том, чтобы разоблачить себя на законных основаниях, я мог бы, вероятно, совершить убийство, продавая MMO-ботов, но я действительно не хотел, чтобы меня судили. Вот почему я трачу свое время на настоящее программирование!
источник
Ответ Филиппа великолепен, но только краткое замечание о модели Модель / Представление / Контроллер или MVC для краткости.
Ваш экран является частью «вида», который представляет данные из «модели», которая является реальным состоянием игры, если хотите. Боты и ваш персонаж все «существуют» (в некотором смысле) внутри модели. Представьте, если вы отключите экран - игра продолжится, даже если вид исчезнет.
В сетевой игре понятие «модель» немного сложнее, так как у вас на самом деле много моделей. У вас есть модель на сервере, а затем модель на каждом клиенте, которая частично обновляется из-за данных, получаемых с сервера. Вы можете думать о «модели» как о модели сервера и модели вашего клиента, или вы можете думать о ней как о модели вашего собственного клиента. В любом случае, здесь живут боты. Таким образом, их «восприятия», которые мы могли бы использовать как сокращение для их ввода данных и состояния, основаны на состоянии модели в то время и взаимодействии между различными объектами / объектами в этой модели. На практике каждый бот может иметь функцию «refreshState», которая запускается один раз за кадр или что-то в этом роде и заставляет его обновлять ее.
источник
Они могут считывать координаты из файла или с сервера, а также с помощью системы обнаружения столкновений лучей. Обычно используют лучи, идущие от бота (в этом случае) наружу. Если луч сталкивается с чем-то, то он возвращает боту некоторую информацию, например, если луч обнаружил игрока, бота, животное или простую стену. Это потому, что в случае игрока и бота, например, у них есть невидимая капсула, которая полностью включает в себя информацию, например, о ее типе (человек, бот, ...). При этом они могут избежать столкновения со стенами и другими элементами, если они, например, следуют за вами.
Вы можете увидеть обнаружение столкновений на этой странице.
источник