Как написать бота для wow
Я отлично понимаю, что использование ботов запрещено лицензионным соглашением Blizzard. Это может привести к перманентному бану аккаунта. Я бы расстроился, узнав, что кто-то, воспользовавшись материалами данного поста, стал наживаться, ухудшая экономику игры и вызывая неодобрение других игроков. И да, я понимаю, то, что делаю я, нечестно.
Цель поста — рассказать о моем опыте и описать сложности, с которыми я столкнулся, узнать у вас, что можно было сделать лучше.
Предыстория
Коллекционирование
Люди, далекие от индустрии игр, могут без ущерба пропустить этот раздел. В игре WoW есть такой аспект — коллекционирование. Как и в нумизматике/филателии, чем больше у вас, например, верховых животных, тем вам приятнее. Точно так же важен процесс получения. Какие-то драконы требуют для получения выполнения десятка задач («ачивок»), какие-то — войти в лучшие 2% игроков в мире по навыку управления персонажем (сражения на арене), что-то можно просто купить за игровую валюту, что-то — за реальные деньги в магазине. Подробности можно почитать в другом источнике, речь не об этом. Так вот, некоторые из коллекционируемых предметов падают в подземелье с шансом около 0,5%. Если шанс выпадения дается игроку лишь раз в день (иногда в неделю), вам потребуется время, соизмеримое с годом, для забегов. И все ради того мгновения получения заветного выстраданного предмета. Чем больше вы потратили времени и сил на "фарм" предмета, тем приятнее вам его в итоге получить. По моему опыту радость очень мимолетна.
Зависимость шанса выпадения от количества попыток
Небольшое отступление. Какова вероятность того, что за шесть бросков игральной кости выпадет «6»? Очевидно, что . То есть, наше событие является противоположным событием к невыпадению «6» за все шесть попыток.
Используя второй замечательный предел, нетрудно показать, что .
А вероятность получения коня с шансом «дропа» в 1% за 100 попыток примерно равна 63%.
Некоторые игроки, сделав триста попыток считают, что вот-вот повезет — ведь вероятность облома за такое большое число попыток мала. Их ждет разочарование, ведь за следующие 100 им повезет снова лишь на 63%. А старые труды не дают ничего.
Задача
Есть подземелье. Нужно пробежать по нему с виражами, выполнить пару несложных задач по пути. Убить финального босса и поднять добычу. Чтобы не бежать к выходу пешком, телепортироваться в ближайшую деревню и долететь ко входу. Повторить 5 раз.
Карта подземелья и маршрут:
Задача максимум. Запустил и ушел на пол часа. Процесс полностью автоматический.
Задача минимум. Запустить и сидеть рядом, читать или играть на гитаре, поглядывая на монитор. При необходимости изредка помогать персонажу выбраться из непредвиденной ситуации.
Важно иметь возможность при желании описать маршрут другого подземелья, не залезая в код.
Подход
Движение и позиционирование
- Вам требуется воспроизвести первоначальное положение персонажа и направление его взгляда. Если вы перед автоматическим забегом повернетесь слегка в другую сторону, вы побежите кривовато и рано или поздно упретесь в стенку
- Если вы записали точные координаты и угол, то поставить персонажа туда же вам также не удастся. Реагирует на кнопки он как бульдозер и поворачивается так же. А даже ошибка в 1 градус через 100 метров выльется в метра (ширина дверного проема)
- Время нажатия и отпускания кнопок тоже далеко от идеала. Это похоже на передвижение по квартире с закрытыми глазами. Вроде бы шесть шагов вперед и строго направо, но на деле вместо туалета мы оказываемся в ванной. Попробуйте также открыть дверь с закрытыми глазами, не щупая ручку
Это отрывок из списка команд робота по перемещению. Указаны координаты x, y и угол поворота в пространстве в радианах.
Клавиши и команды
По пути надо нажимать кнопки и кликать мышкой, открывать двери, где-то нужно ждать. Не хотелось бы выписывать это все вручную. Да и искать среди команд с координатами (в примере выше), куда же что вписать, не очень приятно. Поэтому единовременные нажатия на кнопки и клики мы будем писать параллельно с записью координат.
Отдельно упомяну про «pitch» (наклон). Если персонаж смотрит в горизонт, он равен нулю. Если под ноги, наклон отрицателен. А в небо — положителен. Измеряется в радианах. Его пришлось добавить, как только персонажу захотелось летать.
Модули
- Мы напишем addon для интерфейса WoW, который будет определять позицию персонажа, азимут, наклон. Правилами игры аддоны ничуть не запрещены, указанная информация доступна через игровое API внутри аддона. Он будет рисовать это все на экране. Сам аддон пишется на языке Lua, потому что так решили разработчики игры.
- В аддоне можно определять кое-что, можно рисовать, но вот заставить персонажа двигаться нельзя. Еще в аддоне нельзя писать в файл, спрашивать у игры, где стены, где враги, да и много чего еще нельзя. Поэтому нам нужно написать внешнее управляющее приложение. Я не стал оригинальничать и использовал AutoIt. Это действительно быстро и удобно, хоть и немного дико для меня, привыкшего программировать на строго типизированных языках.
- Приложение должно уметь записывать мои действия. Назовем этот функционал Recorder
- Приложение должно уметь воспроизводить запись. Назовем Player
- Записанные действия и координаты мы будем хранить в текстовом файле построчно. Их можно и нужно редактировать вручную. Добавлять костыли, удалять мусор. Скажу сразу, это самое сложное.
Addon для WoW на Lua
Аддон для WoW это скрипт на языке Lua. Язык полноценный, гибкий, эффективный. Делать с системой ничего нельзя. Делать с игрой можно все, но только в рамках того API, которое предоставляет вам игра. Так как Blizzard не хочет, а точнее, запрещает игрокам и предпринимателям писать ботов, то и API кроме упомянутых выше координат почти ничего полезного и не предоставляет. Разумеется, полезного для наших нужд. Неплохой гайд по написанию аддонов сразу с описанием Lua можно найти здесь. Ну а я опишу свой вариант.
Манифест и GUI
Подробности и источник. В папке World of Warcraft\Interface\AddOns\ создаете папку HelloWorld. В нее кладете HelloWorld.toc с содержимым
Если бы я хотел понарисовать формочек и кнопочек (а для этого обычно и нужны аддоны), последней строчкой я бы вписал еще HelloWorld.xml с описанием этих кнопочек. В дизайне и написании такого GUI-аддона хорошо помогает AddOn Studio. Мощный инструмент на базе MS Visual Studio.
Но так как я минималист, рисовать мы в этот раз не будем. Кроме того, это даст мне возможность показать, что создавать формы можно динамически из самого скрипта без использования дизайнера. Рассмотрим же HelloWorld.lua. Редактировал я его в Notepad++. Чтобы игра подключила изменения в HelloWorld.toc, надо перезапустить ее целиком. А вот изменения в HelloWorld.lua можно подхватить, написав в консоли команду /reload. Поэтому процесс программирования и отладки не такой болезненный.
Слеш-команды
Кстати, об отладке. Советую сразу добавить обработчик слеш-команд:
Для этого определим переменную вида SLASH_ИМЯn. Где ИМЯ уникально для всех аддонов, а n либо пусто, либо порядковое число с 1. И добавим функцию с именем ИМЯ в некий объект. Может показаться странным для программиста на C++, что мы эту функцию-обработчик нигде явно не регистрируем. Да и со строковой переменной связываем чисто по имени переменной. Но вот такая она, мощь и магия Lua.
Теперь команда в WoW-консоли /helloworld выполнит требуемые вам действия: позволит вывести отладочную информацию, а для простейших аддонов, собственно, произведет все то, ради чего вы их писали.
Ну и тут же я показал WoW API, которое достает требуемую информацию.
Обработчик событий
Мы создаем фрейм типа "Frame" и подключаемся на действия "OnEvent" и "OnUpdate" командами
Обработчик OnUpdate будет вызываться после каждого кадра — то, что нам нужно для обновления координат. А OnEvent будет вызываться при других желаемых событиях. Из него будем дергать соответствующие функции:
Что еще удобнее в Lua, это то, что вот такой конструкцией можно вызвать уникальные обработчики вида
Здесь PLAYER_LOGIN — это событие, которое рассылается во все фреймы при входе в мир и перезапуске пользовательского интерфейса. Другие события: PLAYER_LEAVE_COMBAT, QUEST_FINISHED, PLAYER_EQUIPMENT_CHANGED, PLAYER_DEAD, — и еще очень много. С полным списком можно ознакомиться тут. Зарегистрируем то событие, которое мы хотим обрабатывать, командой
Передача информации
Так как в аддоне нельзя ничего делать с системой, информацию из WoW другой части бота мы будем передавать при помощи изменения цвета пикселей. Как это делал rednaxi в своем посте. Но только мы будем передавать цветом не один бит информации, а будем сериализовать данные и передавать их больше.
Рисование
Так как для рисования тоже нужны фреймы, создадим их
Думаю, тут все понятно и без комментариев. Подробности по каждому методу ищите сами.
Сериализация
У нас есть две координаты и два угла. Все — числа с плавающей запятой. Компоненты цветов пикселей в аддоне тоже числа с плавающей запятой, но от 0.0 до 1.0. Кроме того, известно, что сохранится компонента цвета в одном байте. Поначалу я каждую координату сохранял в одну компоненту цвета. В итоге точность позиционирования в локации составляла 1/255 от размера карты. Получалось как в GPS: вроде координаты есть, но вести машину на автомате (управление компьютером без человека) по дороге по навигатору не выйдет. Так что пришлось давать два байта. Как повыгоднее сохранить одно дробное число в два байта? Я сделал так
Функция modf возвращает целую и дробную часть числа через запятую. Здесь используется параллельное присваивание — еще одна полезная фишечка Lua.
При таком подходе я использую полную мощность каждого из двух байтов, в которые сохраняется координата. Ну а азимут и наклон не так требовательны к точности, лишь бы укладывались в отрезок 0.0-1.0. Получается вот так:
Теперь при перемещении по миру в левом верхнем углу два квадратика 10 на 10 будут хаотично менять свой цвет.
Создание простого бота для онлайн-игры world of warcraft
Думаю, тема ботов не оставляет равнодушным ни одного игрока в онлайн-игры. Кого-то они раздражают, кто-то ими интересуется, а кто-то их использует. Существует и некоторое количество людей, довольно маленькое относительно остальных трех групп — это люди, которые этих ботов разрабатывают.
Я предлагаю присоединиться к этой небольшой касте людей и посмотреть изнутри процесс разработки бота.
Предыстория
Как-то раз в выходные я зашел за своего персонажа в world of warcraft. Делать было в игре нечего — все рейдовые боссы уже убиты, друзей для похода на арену нет, остается только выполнение квестов и неспешная добыча золота. Квесты я не очень люблю и свое свободное время в игре провожу обычно возле аукциона — с помощью специальных аддонов скупаю что подешевле и потом продаю подороже, выигрывая на разнице в цене.
Соответственно в голову пришла мысль автоматизировать эти рутинные действия — прийти на аукцион, запустить аддон, покликать в нем на кнопки, дойти до почтового ящика, забрать вещи с почты, вернуться на аукцион и снова запустить аддон, и далее по кругу.
В качестве инструмента для реализации был выбран Auto It, но потом оказалось что задача не такая тривиальная, как выглядит на первый взгляд, и пришлось подключать дополнительные инструменты. Сразу скажу, что никакие «грязные» методы вроде чтения памяти процесса или перехвата траффика я не использовал, только autoit для имитации кликов мышки и клавиатуры и чтения цветов пикселей с экрана.
Предупреждение
Все описанные действия вы производите на свой страх и риск, правилами игры это запрещено и может привести к перманентному бану аккаунта.
Передвижение
Собственно, наверное самая интересная тема при разработке бота — это реализация его перемещения по миру. Сначала я думал что проблем с этим не возникнет — путь у нас простой: аукцион это здание, в котором на такой площадке стоят NPC, с которыми необходимо поговорить чтобы начать торговлю, а почтовый ящик стоит прямо на выходе из аукциона, немного слева. Персонаж поэтому все время ходит как бы буквой «Г», туда и обратно
Я думал что просто засеку сколько времени нужно жать «вперед», сколько «вправо» или «влево» чтобы прийти в нужную точку и просто это захардкожу. Но реальность показала что это сделать нереально: если так делать то возникает проблема с пингом: персонаж иногда пробегал лишнего, иногда слишком сильно поворачивался, способ был совершенно нерабочим.
Но отчаиваться я не стал и начал думать что делать дальше. Казалось бы следующее решение — каким то образом определять где в данный момент находится персонаж, и в зависимости от этого расчитывать куда ему дальше двигаться. Только каким образом получить данные о позиции и угле поворота персонажа без чтения памяти процесса игры? Анализировать целиком картинку или какие то отдельные ее части довольно сложно, скриншот выхода из аукциона:
После недолгих раздумий было придумано решение проблемы: надо писать аддон для WoW, который будет получать данные о текущем положении персонажа (координаты и поворот персонажа) и давать команды, куда надо двигать персонажа. Внешне это должно выглядеть как цветной «семафор» который будет отображать необходимое действие: двигаться вперед, вправо или влево, или поворачиваться. Когда персонаж приходит в необходимую точку семафор должен символизировать что персонаж пришел на место и необходимо выполнять следующее действие. Так как у меня персонаж перемещается между двумя точками, то и семафоворов я решил делать 2: один будет командовать по дороге к аукционеру, а второй — по дороге к почте. С алгоритмом вроде разобрались, далее будут примеры кода (xml — шаблоны аддонов, lua — собственно исходники аддона, и autoit), местами кривоватые и грязноватые, но думаю простительно: на этих языках писал первый раз, и еще до конца не разобрался.
Для реализации семафоров пришлось изучить процесс разработки аддонов для WoW, он очень хорошо описан в WoWwiki
Самая первая версия семафора, она показывала только повернут ли я лицом к аукционеру в данный момент, и подсвечивала зеленым соответствующие блоки:
В качестве основы для своего аддона я взял hello world! аддон, описанный в воввики.
Изначально он не имел никаких графических элементов, соответственно понадобилось добавить в него вывод прямоугольников, а также повесить обработчик . В итоге мой HelloWorld.xml стал выглядеть примерно так:
Соответственно в HelloWorld.lua необходимо написать соответствующие обработчики. Для того, чтобы узнать, на какой угол в данный момент повернут персонаж, используется функция GetPlayerFacing, которая возвращает угол относительно севера в радианах. Экспериментальным путем было выяснено, что когда персонаж смотрит прямо на аукционера — это угол 5.42 радиана. Но повернуть персонажа точно на этот угол довольно сложно, поэтому допускаем небольшой разброс (5.35 — 5.5 радиана).
Теперь напишем скрипт на autoit, который будет смотреть какой цвет в данный момент у семафора, и поворачивать персонажа в необходимую сторону, и заодно создадим каркас нашего приложения для автоматической торговли на аукционе. Опытным путем было выяснено что цвет пикселя 65280 — это зеленый.
Всё, сохраняем аддон, запускаем WoW, запускаем скрипт AutoIt и смотрим на персонажа, который сам поворачивается лицом в нужное направление. Но кроме поворотов надо также реализовать перемещение персонажа вперед-назад и вправо-влево, чтобы он мог приходить к аукционеру от почтового ящика. Удачно, что на пути персонажа нет никаких препятствий, иначе задача была бы сложнее.
А так просто добавляем в наш xml дополнительные фреймы для еще 5 кнопок семафора: положение Ок!, двигаться вперед, двигаться назад, двигаться вправо и двигаться влево, и в lua файле дописываем код, который будет показывать, куда нам небходимо двигаться в данный момент. Эталонные координаты где нам нужно находится мы знаем. Казалось бы тоже все просто, но не тут то было — как мы видели по карте, и уже выяснили когда делали повороты, движение у нас идет под углом к северу. Т.е. при движении у нас постоянно меняются обе координаты персонажа. Считать при этом куда двигаться дальше не очень удобно, поэтому воспользуемся известными со школьного курса формулами для поворота системы координат на заданный угол (в нашем случае — 5.42 радиана)
Теперь при движении к/от аукционера и вправо-влево у нас будет меняться только одна координата. Допишем соответствущий код в наш lua файл и он примет примерно следующий вид:
Все, теперь у нас получился примерно вот такой семафор:
Осталось дописать по аналогии скрипт AutoIt чтобы когда загораются сигналы семафора он посылал соответствующие кнопки в игру. Единственное с чем я столкнулся — он не дает посылать нормально буквенные кнопки (A/D), поэтому пришлось забиндить стрейф на F6/F7.
Вот собственно и все, после этого мы получаем персонажа, который автоматически поворачивается, и потом бежит и встает возле аукционера.
Объем текста вышел уже достаточно большим, если тема окажется интересной хабрасообществу то в следующих частях расскажу о том, как я реализовывал взаимодействие с аукционером и как получал почту из почтового ящика.
Создание несложного бота для WoW, программирование маршрутов
Я отлично понимаю, что использование ботов запрещено лицензионным соглашением Blizzard. Это может привести к перманентному бану аккаунта. Я бы расстроился, узнав, что кто-то, воспользовавшись материалами данного поста, стал наживаться, ухудшая экономику игры и вызывая неодобрение других игроков. И да, я понимаю, то, что делаю я, нечестно.
Цель поста — рассказать о моем опыте и описать сложности, с которыми я столкнулся, узнать у вас, что можно было сделать лучше.
Предыстория
Коллекционирование
Люди, далекие от индустрии игр, могут без ущерба пропустить этот раздел. В игре WoW есть такой аспект — коллекционирование. Как и в нумизматике/филателии, чем больше у вас, например, верховых животных, тем вам приятнее. Точно так же важен процесс получения. Какие-то драконы требуют для получения выполнения десятка задач («ачивок»), какие-то — войти в лучшие 2% игроков в мире по навыку управления персонажем (сражения на арене), что-то можно просто купить за игровую валюту, что-то — за реальные деньги в магазине. Подробности можно почитать в другом источнике, речь не об этом. Так вот, некоторые из коллекционируемых предметов падают в подземелье с шансом около 0,5%. Если шанс выпадения дается игроку лишь раз в день (иногда в неделю), вам потребуется время, соизмеримое с годом, для забегов. И все ради того мгновения получения заветного выстраданного предмета. Чем больше вы потратили времени и сил на "фарм" предмета, тем приятнее вам его в итоге получить. По моему опыту радость очень мимолетна.
Зависимость шанса выпадения от количества попыток
Небольшое отступление. Какова вероятность того, что за шесть бросков игральной кости выпадет «6»? Очевидно, что . То есть, наше событие является противоположным событием к невыпадению «6» за все шесть попыток.
Используя второй замечательный предел, нетрудно показать, что .
А вероятность получения коня с шансом «дропа» в 1% за 100 попыток примерно равна 63%.
Некоторые игроки, сделав триста попыток считают, что вот-вот повезет — ведь вероятность облома за такое большое число попыток мала. Их ждет разочарование, ведь за следующие 100 им повезет снова лишь на 63%. А старые труды не дают ничего.
Задача
Есть подземелье. Нужно пробежать по нему с виражами, выполнить пару несложных задач по пути. Убить финального босса и поднять добычу. Чтобы не бежать к выходу пешком, телепортироваться в ближайшую деревню и долететь ко входу. Повторить 5 раз.
Карта подземелья и маршрут:
Задача максимум. Запустил и ушел на пол часа. Процесс полностью автоматический.
Задача минимум. Запустить и сидеть рядом, читать или играть на гитаре, поглядывая на монитор. При необходимости изредка помогать персонажу выбраться из непредвиденной ситуации.
Важно иметь возможность при желании описать маршрут другого подземелья, не залезая в код.
Подход
Движение и позиционирование
- Вам требуется воспроизвести первоначальное положение персонажа и направление его взгляда. Если вы перед автоматическим забегом повернетесь слегка в другую сторону, вы побежите кривовато и рано или поздно упретесь в стенку
- Если вы записали точные координаты и угол, то поставить персонажа туда же вам также не удастся. Реагирует на кнопки он как бульдозер и поворачивается так же. А даже ошибка в 1 градус через 100 метров выльется в метра (ширина дверного проема)
- Время нажатия и отпускания кнопок тоже далеко от идеала. Это похоже на передвижение по квартире с закрытыми глазами. Вроде бы шесть шагов вперед и строго направо, но на деле вместо туалета мы оказываемся в ванной. Попробуйте также открыть дверь с закрытыми глазами, не щупая ручку
Это отрывок из списка команд робота по перемещению. Указаны координаты x, y и угол поворота в пространстве в радианах.
Клавиши и команды
По пути надо нажимать кнопки и кликать мышкой, открывать двери, где-то нужно ждать. Не хотелось бы выписывать это все вручную. Да и искать среди команд с координатами (в примере выше), куда же что вписать, не очень приятно. Поэтому единовременные нажатия на кнопки и клики мы будем писать параллельно с записью координат.
Отдельно упомяну про «pitch» (наклон). Если персонаж смотрит в горизонт, он равен нулю. Если под ноги, наклон отрицателен. А в небо — положителен. Измеряется в радианах. Его пришлось добавить, как только персонажу захотелось летать.
Модули
- Мы напишем addon для интерфейса WoW, который будет определять позицию персонажа, азимут, наклон. Правилами игры аддоны ничуть не запрещены, указанная информация доступна через игровое API внутри аддона. Он будет рисовать это все на экране. Сам аддон пишется на языке Lua, потому что так решили разработчики игры.
- В аддоне можно определять кое-что, можно рисовать, но вот заставить персонажа двигаться нельзя. Еще в аддоне нельзя писать в файл, спрашивать у игры, где стены, где враги, да и много чего еще нельзя. Поэтому нам нужно написать внешнее управляющее приложение. Я не стал оригинальничать и использовал AutoIt. Это действительно быстро и удобно, хоть и немного дико для меня, привыкшего программировать на строго типизированных языках.
- Приложение должно уметь записывать мои действия. Назовем этот функционал Recorder
- Приложение должно уметь воспроизводить запись. Назовем Player
- Записанные действия и координаты мы будем хранить в текстовом файле построчно. Их можно и нужно редактировать вручную. Добавлять костыли, удалять мусор. Скажу сразу, это самое сложное.
Addon для WoW на Lua
Аддон для WoW это скрипт на языке Lua. Язык полноценный, гибкий, эффективный. Делать с системой ничего нельзя. Делать с игрой можно все, но только в рамках того API, которое предоставляет вам игра. Так как Blizzard не хочет, а точнее, запрещает игрокам и предпринимателям писать ботов, то и API кроме упомянутых выше координат почти ничего полезного и не предоставляет. Разумеется, полезного для наших нужд. Неплохой гайд по написанию аддонов сразу с описанием Lua можно найти здесь. Ну а я опишу свой вариант.
Манифест и GUI
Подробности и источник. В папке World of Warcraft\Interface\AddOns\ создаете папку HelloWorld. В нее кладете HelloWorld.toc с содержимым
Если бы я хотел понарисовать формочек и кнопочек (а для этого обычно и нужны аддоны), последней строчкой я бы вписал еще HelloWorld.xml с описанием этих кнопочек. В дизайне и написании такого GUI-аддона хорошо помогает AddOn Studio. Мощный инструмент на базе MS Visual Studio.
Но так как я минималист, рисовать мы в этот раз не будем. Кроме того, это даст мне возможность показать, что создавать формы можно динамически из самого скрипта без использования дизайнера. Рассмотрим же HelloWorld.lua. Редактировал я его в Notepad++. Чтобы игра подключила изменения в HelloWorld.toc, надо перезапустить ее целиком. А вот изменения в HelloWorld.lua можно подхватить, написав в консоли команду /reload. Поэтому процесс программирования и отладки не такой болезненный.
Слеш-команды
Кстати, об отладке. Советую сразу добавить обработчик слеш-команд:
Для этого определим переменную вида SLASH_ИМЯn. Где ИМЯ уникально для всех аддонов, а n либо пусто, либо порядковое число с 1. И добавим функцию с именем ИМЯ в некий объект. Может показаться странным для программиста на C++, что мы эту функцию-обработчик нигде явно не регистрируем. Да и со строковой переменной связываем чисто по имени переменной. Но вот такая она, мощь и магия Lua.
Теперь команда в WoW-консоли /helloworld выполнит требуемые вам действия: позволит вывести отладочную информацию, а для простейших аддонов, собственно, произведет все то, ради чего вы их писали.
Ну и тут же я показал WoW API, которое достает требуемую информацию.
Обработчик событий
Мы создаем фрейм типа "Frame" и подключаемся на действия "OnEvent" и "OnUpdate" командами
Обработчик OnUpdate будет вызываться после каждого кадра — то, что нам нужно для обновления координат. А OnEvent будет вызываться при других желаемых событиях. Из него будем дергать соответствующие функции:
Что еще удобнее в Lua, это то, что вот такой конструкцией можно вызвать уникальные обработчики вида
Здесь PLAYER_LOGIN — это событие, которое рассылается во все фреймы при входе в мир и перезапуске пользовательского интерфейса. Другие события: PLAYER_LEAVE_COMBAT, QUEST_FINISHED, PLAYER_EQUIPMENT_CHANGED, PLAYER_DEAD, — и еще очень много. С полным списком можно ознакомиться тут. Зарегистрируем то событие, которое мы хотим обрабатывать, командой
Передача информации
Так как в аддоне нельзя ничего делать с системой, информацию из WoW другой части бота мы будем передавать при помощи изменения цвета пикселей. Как это делал rednaxi в своем посте. Но только мы будем передавать цветом не один бит информации, а будем сериализовать данные и передавать их больше.
Рисование
Так как для рисования тоже нужны фреймы, создадим их
Думаю, тут все понятно и без комментариев. Подробности по каждому методу ищите сами.
Сериализация
У нас есть две координаты и два угла. Все — числа с плавающей запятой. Компоненты цветов пикселей в аддоне тоже числа с плавающей запятой, но от 0.0 до 1.0. Кроме того, известно, что сохранится компонента цвета в одном байте. Поначалу я каждую координату сохранял в одну компоненту цвета. В итоге точность позиционирования в локации составляла 1/255 от размера карты. Получалось как в GPS: вроде координаты есть, но вести машину на автомате (управление компьютером без человека) по дороге по навигатору не выйдет. Так что пришлось давать два байта. Как повыгоднее сохранить одно дробное число в два байта? Я сделал так
Функция modf возвращает целую и дробную часть числа через запятую. Здесь используется параллельное присваивание — еще одна полезная фишечка Lua.
При таком подходе я использую полную мощность каждого из двух байтов, в которые сохраняется координата. Ну а азимут и наклон не так требовательны к точности, лишь бы укладывались в отрезок 0.0-1.0. Получается вот так:
Теперь при перемещении по миру в левом верхнем углу два квадратика 10 на 10 будут хаотично менять свой цвет.
Как написать бота для WoW
Здравствуйте.
У меня вопрос в каком направлении размышлять при создании бота для WoW или Lineage 2 или просто обычной онлайн игры.
Подскажите как программа должна взаимодействовать с сервером в WoW ,как происходит конект и отправление команд. Чета не как зацепится не могу с чего начать .
Есть догадки что программа использует библиотеки игры и эти же команды она посылает.
Или нужно знать порт по которому сервер слушает клиента и адрес - это само собой но как конект сделать с сервером?
P.s Извиняюсь за эту тему так как наверно это против правил форума , просто меня этот вопрос интересует давным давно.
Как написать бота для игры?
Я хочу сделать бота для одной игры(какая не важно), чобы он выполнял некоторые функции(например.
Как написать авторег-бота для сайта
Здравствуйте, подскажите пожалуйста, как на QT реализовать бота, который сможет регистрировать.
Как написать бота для браузерной игры
Хочу написать бота для браузерной игры ,но нигде не могу найти конкретной инфы о том как принимать.
Как написать бота для вап игры?
Учу delphi 7, очень хочу выучить. Решил попробовать написать бота для игры Викинги. Это wap игра.
Это всё равно что сравнивать автомобиль, самолёт и подводную лодку. У этих игр абсолютно разные протоколы.
Есть догадки что программа использует библиотеки игры и эти же команды она посылает. Вряд ли. Обычно создатели игр стараются усложнить программистам написание ботов. Для этого там даже команды не в открытом виде идут, а предварительно шифруются. На сколько я помню, в WoW используется шифрование Blowfish. На счёт других игр не знаю. забудь об этом, тебе это не по силам. Проще и дешевле купить премиум экаунт и пару премиумных танков.Это конечно хорошо но хотелось знать бы для себя какая суть бота , как она конектиться и посылает команды хоть теорию .
Добавлено через 51 секунду
А про танки так я из без премиумов танков норм играю
Добавлено через 3 минуты
Humanoid а команды можно какой нибуть программой отследить или какие покеты клиент серверу отправляет тама зацепиться не льзя будит ?
А как с экрана ? Принтскрином и распознаванием ? Ну а как эмулировать ? Ведь прямой подход в лоб не подойдет .
А как с экрана ? Принтскрином и распознаванием ? Почему бы и нет. Принскринить окно клиента и распознавать, а затем отсылать нажатия клавиш и мышиные события.
Ну во первых как я уже сказал прямым в лоб эмулированием может не получится.
Принскринить окно клиента и распознавать, а затем отсылать нажатия клавиш и мышиные события.Во вторых само распознование сложная вещь(плюс затраты времени на рапознование), к тому же окна постоянно должны находиться в развернутом состоянии и не подвижны.
Я просто делал раньше кликер-распознавалку для сбора ресурсов в браузерной игре- она то работала, но настраивать её было весьма сложно.
Ну а например взять готовые боты под ВОВ и посмотреть их код, а потом и свое что-то придумать ? Во первыех если есть готовые зачем вообще тогда писать?Во вторых кто будет выкладывать бота в месте с исходниками ? Во первыех если есть готовые зачем вообще тогда писать?
Ради опыта и удовольствия
Во вторых кто будет выкладывать бота в месте с исходниками ? А почему бы нет? Сейчас много разного софта с открытыми исходниками. Другое дело, что боты часто приравниваются владельцами серверов к читам. и авторы ботов могут не выкладывать исходники, что бы админам было сложнее опознавать бота.Когда я играл в WOW (это было давно) можно было программно отправлять нажатие клавиш в игру.
короче я по таймеру просто нажимал атакующее клавиши, как раз в C++ builder, а боты сами появлялись периодически на одном и том же месте.
Играл на пиратских серверах. поэтому прокачиваться таким способов удавалось.
просто оставлял комп на ночь.
вообщем такую систему для прокачивания тоже можно было развивать.
хочу заметить что в WOW есть ещё макросы, которыми тоже можно дополнять функционал такого бота.
если запустить несколько клиентов WOW, запустить такого таймерного бота и переключаться между окнами например клавишей alt+tab (или как то программно)
то можно прокачивать много персонажей
думаю тут главное правило не уделять этому вопросу много времени. Если конечно WOW не занимает всё свободное время
PS возможно есть смысл посмотреть исходники пиратских серваков, они действительно открытые )
Добавлено через 12 минут
а если хочется сделать бота который подключается без WOW клиента, может стоит попробывать каким-нибудь продвинутым снифером посмотреть, что отправляет клиент при подключении
или там настолько хорошее шифрование, что ничего нельзя разобрать?
Читайте также: