Статьи

Как написать бота на Python для онлайн-игр (Lineage 2)

  1. предисловие Как можно повеселиться на новогодние каникулы? Играть в компьютерные игры? Нет! Лучше...
  2. Поиск монстров
  3. Щелчок
  4. Перемещение курсора
  5. Логика работы
  6. Прекратить работу
  7. Заключение

предисловие

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

Однажды в школе я был очарован одной из популярных MMORPG - Lineage 2 , В игре вы можете вступать в кланы, группы, заводить друзей и сражаться с соперниками, но в целом игра наполнена монотонными действиями: выполнение квестов и фарм (сбор ресурсов, получение опыта).

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

В общем, создание бота для L2 не новость, и готовых уже немало. Они делятся на 2 основные группы: те, которые реализованы в работе клиента и кликеры.

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

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

Работа с окном

Все просто Будем работать со скриншотами из окна с игрой.
Для этого мы определяем координаты окна. С окном мы работаем с модулем win32gui. Требуемое окно определяется заголовком - «Lineage 2».

Код методов получения позиции окна

def get_window_info (): # установить информацию о окне win32gui.GetWindowText (hwnd): rect = win32gui.GetWindowRect (hwnd) x = rect [0] y = rect [1] w = rect [2] - xh = rect [3] - y window_info ['x'] = x window_info ['y'] = y window_info ['width'] = w window_info ['height'] = h window_info ['name'] = win32gui.GetWindowText (hwnd) win32gui.SetForegroundWindow (hwnd)

Получить изображение нужного окна с помощью ImageGrab:

def get_screen (x1, y1, x2, y2): box = (x1 + 8, y1 + 30, x2 - 8, y2) screen = ImageGrab.grab (box) img = массив (screen.getdata (), dtype = uint8 ) .reshape ((screen.size [1], screen.size [0], 3)) return img

Теперь мы будем работать с контентом.

Поиск монстров

Что самое интересное, что те реализации, которые я нашел, не настолько точны, как разыскиваемые? Например, в одном популярном и даже платном это делается с помощью игрового макроса. Это означает, что «игрок» должен постоянно писать для каждого типа монстров в макросе что-то вроде «/ target Monster Name Bla Bla».

В нашем случае мы следуем этой логике: прежде всего, мы находим все тексты белого цвета на экране. Белый текст может быть не только именем монстра, но и именем персонажа, именем NPC или других игроков. Следовательно, вы должны навести курсор на объект, и если появится выделение с нужным рисунком, вы можете атаковать цель.

Вот оригинальная картинка, с которой мы будем работать:

Давайте зачеркнем мое имя, чтобы не мешать и перевести картинку на черно-белую. Исходное изображение в RGB - каждый пиксель представляет собой массив из трех значений от 0 до 255, когда ч / б - одно значение. Таким образом, мы значительно сократим объем данных:

img [210: 230, 350: 440] = (0, 0, 0) серый = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)

COLOR_BGR2GRAY)

Давайте найдем все объекты белого цвета (это белый текст с именами монстров)

ret, threshold1 = cv2.threshold (серый, 252, 255, cv2.THRESH_BINARY)

Морфологические трансформации:

  • Мы будем фильтровать по прямоугольнику размером 50 × 5. Этот прямоугольник подошел лучше всего.
  • Убираем шум внутри прямоугольников с текстом (по сути мы красим все между буквами белым).
  • Еще раз, удалите шум, размытие и растяжение, используя фильтр.

kernel = cv2.getStructuringElement (cv2.MORPH_RECT, (50, 5)) closed = cv2.morphologyEx (threshold1, cv2.MORPH_CLOSE, kernel) closed = cv2.erode (закрыто, ядро, итерации = 1) закрыто = cv2.dlate ( закрытый, ядро, итерации = 1)

Найдите середину полученного пятна

(_, центры, иерархия) = cv2.findContours (закрыто, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

Это работает, но это можно сделать веселее (например, для монстров, имена которых не видны, потому что они далеко) - с помощью TensorFlow Object Detection, как здесь, но когда-нибудь в следующей жизни.

Теперь наведем курсор на найденного монстра и посмотрим, появилась ли подсветка с помощью метода cv2.matchTemplate. Осталось нажать ЛКМ и кнопку атаки.

Щелчок

С поиском монстра выяснили, бот уже может найти цели на экране и навести на них мышь. Чтобы атаковать цель, нужно щелкнуть левой кнопкой мыши и нажать «атака» (кнопка «1» может атаковать атаку). Щелкните правой кнопкой мыши, чтобы повернуть камеру.

На сервере, где я тестировал бота, я вызывал клик через AutoIt, но он как-то не работал.

Как оказалось, игры защищены от автоматических кликеров разными способами:

  • Поиск процессов, эмулирующих клики
  • Запишите клики и определите, на какой цвет кликает бот
  • Определение шаблонов кликов
  • Определение бота по частоте кликов

И некоторые приложения, такие как клиент этого сервера, могут определить источник щелчка на уровне ОС. (будет здорово, если кто-то скажет вам, как именно).

Были опробованы некоторые фреймворки, которые можно щелкнуть (включая pyautogui, фреймворк робота и что-то еще), но ни один из вариантов не сработал. Мысль проскользнула в идею создания устройства, которое будет нажимать кнопку (кто-то даже сделал это). Кажется, вам нужно нажать на большинство аппаратных средств. В результате я начал искать пишущий драйвер.

В Интернете был найден способ решить проблему: запрограммировать устройство USB на выдачу нужного сигнала - Digispark ,

Во время моего исследования для хорошей языковой библиотеки:

Библиотека python 3.6 не работала для меня хорошо - я все время получал ошибку нарушения доступа. Поэтому мне пришлось перейти на Python 2.7, все работало как шарм.

Перемещение курсора

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

По сути, задача сводится к перемещению курсора из точки A в точку B с помощью оболочки AutoHotPy. Вы действительно должны помнить математику?

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

Логика работы

Все инструменты есть, самое простое, что нужно написать сценарий.

  • Если монстр жив, мы продолжаем атаковать.
  • Если цели нет, найдите цель и начните атаковать.
  • Если мы не смогли найти цель, мы немного повернем.
  • Если 5 раз никто не смог найти - идите в сторону и начните снова.

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

Код метода получения уровня здоровья пострадавшего

def get_targeted_hp (self): "" "вернуть hp жертвы или -1, если цели нет" "" hp_color = [214, 24, 65] target_widget_coordinates = {} заполнено_red_pixels = 1 img = get_screen (self.window_info ["x") ], self.window_info ["y"], self.window_info ["x"] + self.window_info ["width"], self.window_info ["y"] + self.window_info ["height"] - 190) img_gray = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) template = cv2.imread ('img / target_bar.png', 0) # w, h = template.shape [:: - 1] res = cv2.matchTemplate (img_gray, template , cv2.TM_CCOEFF_NORMED) порог = 0,8 loc = np.where (res & gt; = порог), если count_nonzero (loc) == 2: для точки в zip (* loc [:: - 1]): target_widget_coordinates = {"x" : pt [0], "y": pt [1]} # cv2.rectangle (img, pt, (pt [0] + w, pt [1] + h), (255, 255, 255), 2) если нет target_widget_coordinates: вернуть -1 pil_image_hp = get_screen (self.window_info ["x"] + target_widget_coordinates ['x'] + 15, self.window_info ["y"] + target_widget_coordinates ['y'] + 31, self.window_info ["x"] + target_widget_coordinates ['x '] + 164, self.window_info ["y"] + target_widget_coordinates [' y '] + 62) пикселя = pil_image_hp [0] .tolist () для пикселя в пикселях: если пиксель == hp_color: fill_red_pixels + = 1 процент = 100 * fill_red_pixels / 150 процентов возврата

Теперь бот понимает, сколько HP имеет жертва и жив ли он.

Основная логика готова, вот как это выглядит сейчас в действии:

Прекратить работу

Вся работа с курсором и клавиатурой выполняется с помощью объекта autohotpy, который можно в любой момент остановить нажатием кнопки ESC.

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

Это нас не устраивает, поэтому нам пришлось разделить бота на 2 потока: прослушивание событий и выполнение логики действий персонажа.

Создать 2 темы

# init bot stop event self.bot_thread_stop_event = threading.Event () # init threads self.auto_py_thread = threading.Thread (target = self.start_auto_py, args = (auto_py,)) self.bot_thread = threading.Thread (target = self. start_bot, args = (auto_py, self.bot_thread_stop_event, character_class)) # начать потоки self.auto_py_thread.start () self.bot_thread.start ()

А теперь мы вешаем обработчик на ESC:

auto_py.registerExit (auto_py.ESC, self.stop_bot_event_handler)

И, при нажатии ESC, установите событие

self.bot_thread_stop_event.set ()

А в логическом цикле персонажа проверьте, установлено ли событие:

пока не stop_event.is_set ():

Теперь спокойно остановите бот на кнопке ESC.

Заключение

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

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

Ссылка на репозиторий

Похожие

Поиск работы программистом
... как большая часть компаний работает с иностранными заказчиками, там начальство может быть немцами, и может произойти так что это начальство захочет увидеть ваше резюме. Конечно украинском они не поймут, а отдел кадров вас не переводить. Даже если работать в Украине на украинскую компанию - в IT английский знают все. Резюме должно быть доступным во всемирной паутине. Тогда его будут читать чаще. Например статистика моего блога показывает, что за последний месяц с него на резюме
Как настроить Wi-Fi роутер: 6 простых шагов
Настроить беспроводной интернет у себя дома - на самом деле не так сложно, как кажется. Покупайте роутер и следуйте инструкции от "Лайфхакеры" . 1. Подключите провода Вставьте интернет-кабель в порт WAN (или Internet) вашего роутера. Подключите маршрутизатор к компьютеру: один конец сетевого кабеля к любому из LAN-портов роутера, а второй - в разъем сетевой
Мы объясняем, что такое спам
Что такое спам, как он работает и как с ним бороться. Об этом мы говорим с нашими пользователями практически каждый день. Вот почему я решил описать, как все работает. В самом начале мы должны определить определение спама, которое имеет много форм и вариаций. В нашей отрасли спам - это в основном электронные письма, рассылаемые массово пользователям, которые не заказывали и не принимали такую ​​корреспонденцию. Спам также возникает в других каналах связи, таких как веб-сайты, SMS и
Большая ошибка веб-аналитики делают ... И как этого избежать!
Самая большая ошибка, которую делают веб-аналитики, работает без цели. Мы работаем очень усердно. Мы мучаем SiteCatalyst. Мы отправляем много данных. Затем мы отправляем его снова и снова. И все же наша работа очень мало влияет на бизнес с точки зрения действий, предпринимаемых руководителями компаний.
Как отключить встроенные покупки на iPhone или iPad
... накапливаются десятки тысяч долларов. Никто не хочет этого. Даже не открыть каждый мир в Super Mario Run . К счастью, есть способ обуздать покупки в приложении, поэтому давайте посмотрим, как отключить покупки в приложении. Не упустите дополнительные полезные функции и ознакомьтесь с нашими предложениями лучшие советы и рекомендации по iOS , Как отключить
Lumia 950 бесплатно от Microsoft, как вестник конца карьеры Windows Mobile?
... как телефон стоит на очень высоком уровне, но через нишевую систему, как в BlackBerry 10, выбирая ее, мы решаем большой компромисс. Приобретение версии XL 950 за 649 долларов, мы получаем еще один смартфон бесплатно Lumia 950. Единственная проблема этой акции - ее доступность - только американские покупатели могут получить дополнительную копию телефона.
Как использовать Mind Maps для развития ясности с вашим программным обеспечением
... поиск ошибок и выявление рисков в продукте. Я следую за Джеймсом Бахом Модель стратегии эвристического тестирования как план тестирования в начале проекта, способ документировать детали и решения о продукте во время разработки, а также как отправная точка для регрессионного тестирования. Такая карта разума дает обзор всего продукта. Я пробегаю эти карты разума с моей командой, чтобы помочь им установить связи, распознать
Joomla 3.9 и Joomla 3.10
Детали созданы: 08 мая 2018 Как вы, скорее всего, знаете, Общее положение о защите данных (GDPR) вступит в силу 25 мая 2018 года. Joomla, прислушиваясь к своим пользователям, намеревается интегрировать Privacy Tool Suite в Joomla CMS, чтобы обеспечить соответствие
HTC 10 - Обзор
Ожидаемый с нетерпением HTC 10 появился на хорватском рынке, и после недели интенсивного общения я готов рассказать о нем все. Если по какой-то причине вы еще не поняли, это обзор супер смартфона HTC 10. Всего за несколько лет до запуска новой HTC Sensation ее услышали «сейчас или никогда»,
Создайте сайт фотогалереи Joomla самостоятельно
... настоящее время количество шаблонов, разработанных для Joomla Галерея сайтов значительно увеличилась на рынке. Учитывая этот факт, я хотел бы поделиться с вами некоторым опытом создания сайта фотогалереи с нуля на основе версии 1.5. Целью данной статьи является Помогите Вы создаете галерею aJoomla на версии 1.5 наиболее экономичным способом. Поэтому я предпочитаю бесплатные
PCSX2 - установка и настройка эмулятора Playstation 2
... как, черт возьми, я получаю мне эмулированные игры PSP2 на ПК? Поэтому я вмешался, чтобы помочь им. Эта статья покажет вам, как установить и настроить PCSX2 эмулятор на Linux, точнее, последний мятный релиз; хотя, он работает так же хорошо на Windows, и, возможно, даже лучше. Мы будем делать нативную установку, а не использовать

Комментарии

64. Тем не менее, я внимательно отношусь к потребностям моих читателей, и один или несколько криков: как, черт возьми, я получаю мне эмулированные игры PSP2 на ПК?
64. Тем не менее, я внимательно отношусь к потребностям моих читателей, и один или несколько криков: как, черт возьми, я получаю мне эмулированные игры PSP2 на ПК? Поэтому я вмешался, чтобы помочь им. Эта статья покажет вам, как установить и настроить PCSX2 эмулятор на Linux, точнее, последний мятный релиз; хотя, он работает так же хорошо на Windows, и, возможно, даже
Какой опыт можно получить без работы?
Какой опыт можно получить без работы? Аккаунт на Github - то стоит завести обязательно. Я раньше завел на Google code, но на Google Code тишина, а в Github - море людей. Github помогает освоиться с git - что является плюсом в резюме. Open Source - если никуда не зовут - пишите свой. Я вот начал писать bwikibot как курсовую работу, мне за него стыдно. Как и за курсовую работу. Но в конце этой зимы один доктор наук, занимает должность
Как вы собираетесь не сосать при монетизации?
Как вы собираетесь не сосать при монетизации? Когда мы сможем увидеть больше геймплея? Можем ли мы получить поток разработчиков и задать больше вопросов? Когда мы получим ребра барбекю Штурмборн и костер, чтобы приготовить их? Бета plx как можно скорее! (это на самом деле я, но я думаю, что некоторые игроки тоже ищут новости = P) Голова к Факел
Итак, как создать собственный дистрибутив с кросс-скомпилированными приложениями, предназначенными для конкретной цели?
Итак, как создать собственный дистрибутив с кросс-скомпилированными приложениями, предназначенными для конкретной цели? Как объясняет Майкл Дж. Хаммель, это не так сложно, как вы думаете. Зачем идти на заказ? В прошлом многие встраиваемые проекты использовали готовые дистрибутивы и сокращали их до самых необходимых по ряду причин. Во-первых, удаление неиспользуемых пакетов снижает требования к хранилищу. Встраиваемые системы обычно не используют большие объемы памяти
Вы можете задать себе несколько вопросов: Как организован сайт?
Вы можете задать себе несколько вопросов: Как организован сайт? Какие дополнительные функции предоставляются? Насколько легко получить поддержку и совет? Таким образом, вы можете узнать, есть ли хороший обзор, есть ли у вас легкий доступ к различным продуктам, можете ли вы получить быструю и несложную помощь и нравится ли вам дизайн этого предложения. Конечно, это определенно субъективные переживания. Вот почему очень важно, чтобы вы лично заботились о своем поставщике. Вопрос безопасности
Как использовать congstar Homespot?
Как использовать congstar Homespot? Congstar Homespot - это пакет тарифов с мобильным беспроводным маршрутизатором. Использование роутера и congstar Homespot очень просто. В нескольких шагах мы объясним, как вы можете комфортно путешествовать по Интернету с Homespot : Беспроводной маршрутизатор имеет встроенный слот, в который необходимо подключить прилагаемые SIM-карты . Затем необходимо
Почему нет?
Почему нет? Премиум фотоальбом - история вашей жизни в эксклюзивной отделке Третья из представленных идей, хотя и немного дороже, чем две другие, однако, самая впечатляющая! наш совместимость Потому что
Ну а потому, что какой игрок ПК отказывается покупать улучшенную версию производства, которая выиграла звание игры года?
Ну а потому, что какой игрок ПК отказывается покупать улучшенную версию производства, которая выиграла звание игры года? Конечно, будет кто-то такой, но я точно не буду собой.
Как вы блокируете спам?
Как вы блокируете спам? Задание практически невозможно выполнить, несмотря на применение специальных правил на серверах отправителя и получателя, которые оценивают сообщение и работу самих администраторов. Не существует 100% эффективного способа блокировать спам в наших почтовых ящиках. На услуги веб-хостинг В Kylos.pl мы прилагаем все усилия для того, чтобы с наших серверов отправлялось наименьшее количество спама и как можно меньше
Как вы думаете, это полезное устройство или просто ненужный баджер?
Как вы думаете, это полезное устройство или просто ненужный баджер? источник: Indiegogo
Как скачать и установить Adobe Flash?
Как скачать и установить Adobe Flash? Adobe Flash Player может быть установлен в Windows 8.1 как плагин для браузера или может быть прошит на вашем смартфоне или планшете под управлением Windows, так что это программное обеспечение можно использовать для всех устройств под управлением Windows 8, 8.1. Процедура установки приложения может быть завершена легко и в течение минуты, следуя инструкциям на экране. Более того, инструмент распространяется бесплатно, поэтому вы можете в любое время

Предисловие Как можно повеселиться на новогодние каникулы?
Играть в компьютерные игры?
Играть в компьютерные игры?
Вы действительно должны помнить математику?
Как, черт возьми, я получаю мне эмулированные игры PSP2 на ПК?
Какой опыт можно получить без работы?
Как вы собираетесь не сосать при монетизации?
Когда мы сможем увидеть больше геймплея?
Можем ли мы получить поток разработчиков и задать больше вопросов?
Когда мы получим ребра барбекю Штурмборн и костер, чтобы приготовить их?

Новости

Карта