Создание несложного бота для Wo. W, программирование маршрутов (продолжение) / Хабрахабр. Это вторая часть поста на тему создания несложного бота для игры World of Warcraft. С первой частью можно ознакомиться здесь.
Оно умеет записывать ваши жесты, прикосновения к определенным точкам экрана, нажатие на клавиши, текстовый ввод и запускать их. Auto Mouse Click - автокликер для автоматизации щелчков мыши и нажатия клавиш. Скачать; Shareware; Рейтинг: 4.3.
Сегодня мы поговорим онаписании Recorder'а клавиш и координат на языке Auto. Itнаписании Player'a инструкций для ботаматематике 2. D, как ориентироваться в декартовой системе координат без теоремы косинусовуправлении роботом при недостаточном количестве датчиковмерах противодействия ботам. Recorder. Наша задача: чтение цветов пикселей, определение нажатий клавиш, фоновая работа с возможностью приостановки, посылка кликов в приложение.
![Бота Для Нажатия Клавиш Бота Для Нажатия Клавиш](http://programmok.net/includes/thumb.php?src=http://programmok.net/uploads/posts/2016-08/1471414928_small-8917.jpg)
Здесь как нельзя лучше подойдет язык Auto. It. Чтобы написать то же самое на Си, пришлось бы заморачиваться с хендлами, девайсами, хуками, событиями Windows. Для редактирования скрипта и быстрого запуска я использовал Sci. TE- Lite, который включает Highlighting, Code. Folding, Autocomplete, Intellisense, ну и Syntax. Check. Встроенная справка по языку в подарок.
Программное нажатие клавиш. Как нажать клавишу в неактивом окне. В результате бот пришлет нам такое сообщение (см. Пользователь должен вводить определенную информацию, и при нажатии на кнопку с. Это вторая часть поста на тему создания несложного бота для игры Перехватив нажатие клавиши, нам надо послать его дальше в.
Стандартные фишечки. Горячие клавиши. В каждом скрипте, работающем с вашим рабочим столом и могущим захватить над ним контроль, советую использовать пару обработчиков горячих клавиш$paused = false.
Hot. Key. Set(. Судный день. Отмечу, что на F1.
Я какое- то время не мог понять, почему он не вызывался. Получение координат. Напомню, что в аддоне мы клали в цветовые компоненты пикселей числа с плавающей запятой, а приезжают они к нам уже в виде целых байтов: #include < Color.
Opt(. Функции возвращают массивы и массивы записываются в переменные абсолютно прозрачно для программиста. Логирование клавиш. Читал я где- то, что автор языка Auto.
It не хотел, чтобы такой простой и мощный язык использовался злоумышленниками для написания вредоносных программ. Поэтому он убрал возможность создать обработчик нажатия для всех клавиш сразу, чтобы хотя бы Keylogger'ы не клепали. Что я могу сказать. Auto. It весьма активно используется для написания вредоносов, а перехват нажатия нужных клавиш мы будем делать так: local $keys = String. Split(. Я не стал разбираться, а просто избегал использования таких комбинаций. Логирование мыши. В Auto. It нет штатного способа перехвата нажатий кнопок мыши.
Есть сторонний модуль с примером использования. Или вы можете повесить свой Set.
Windows. Hook. Ex (WH. Познавательный пример использования Win. API Callback- функций на Auto. It тут. Но я не использовал такой подход по двум причинам: Передвижение персонажа сопряжено с большим количеством нажатий мыши, которые логировать не надо. Плюс, возможны случайные нажатия.
Пришлось бы писать логику по отделению мух от котлет. Использование Hook'ов повышает шансы привлечения к вам внимания «спецслужб».
Об этом подробнее в разделе «Противодействие ботам». Главное, не забывать нажимать их. Запись координат. Ну и, конечно же, наш Recorder должен в фоне записывать передвижение персонажа$hfile = File. Open(? Дело в том, что на нашем маршруте навалено препятствий: ящиков, углов, дверных проемов, фонарных столбов, граблей. А персонаж просто «магнитится» к ним.
Если где- то, пробегая мимо, он может застрять, он обязательно сделает это. Даже если вы длительное время бежите по прямой, вспомните, азимут движения был задан не идеально, поэтому, возможно, вы давно бежите, упираясь лбом в стенку.
Полный исходный код Recorder'а#include < Color. Global $Win. Name = .
Если вам предстоит много раз совершать последовательность машинальных действий без необходимости думать (например, при установке ПО или патчей на большой парк компьютеров), присмотритесь к этому инструменту. Player. Напомню, что результатом работы Recorder'а, описанного в предыдущей главе, является набор команд видаmouse left 1. Поэтому мы будем использовать для этого вторую возможность: движение мыши с зажатой правой кнопкой. Алгоритм следующий: Зажмем правую кнопку мыши. Игра сама поместит курсор на центр экрана и будет удерживать его там. Это позволит пользователю не упереться в итоге курсором в край экрана при повороте.
Сдвигаем курсор налево или направо на определенное число пикселей. Направление персонажа смещается налево или направо. Причем, чем быстрее вы двигаете курсор, тем быстрее вертится персонаж.
Как нам попроще определить, в какую сторону выгоднее поворачиваться, если у нас есть два угла: текущий и требуемый? Но рассмотрим случай: текущий угол — 3. Разница отрицательна, но нам все равно направо. А еще углы могут быть отрицательными.
Чтобы не приходилось выписывать все эти условия, просто воспользуемся синусом разницы углов и будем смотреть только на его знак. Переменные $want и $current содержат (x, y, azimuth)Func Turn($want). Get. Pos(). $sin = sin($current. Чем меньше угол, тем аккуратнее будет двигаться наш курсор и тем точнее мы повернемся. И наоборот, на большие углы нам хочется поворачиваться побыстрее.
Функция изменения наклона к горизонту полностью аналогична, только сдвигать курсор надо по вертикали. В приведенном примере кода, есть логическая ошибка, которая может привести к неправильному поведению бота. Предлагаю любопытному читателю самому ее найти.
Движение. На движение накладываются следующие требования. Точность позиционирования невысока. Нельзя встать ровно туда, куда вы желаете. Двигаться надо, не поворачиваясь.
Из доступных движений есть только бег вперед, шаги назад и strafe (движение вбок без поворота)Движение должно быть непрерывным, без остановок и рывков. Как можно меньше возвратов и смен направлений движения.
Неприятно смотреть на монитор, если персонаж пробежал чуть- чуть, потом попятился, потом снова побежал и так далее. Вперед или назад? Но ничего особо сложного тут нет. Пусть персонаж стоит на (ax, ay) и смотрит под углом и ему надо попасть в (bx, by), ему бежать вперед или назад? Для начала слегка перефразируем задачу: пусть персонаж стоит в (0, 0), смотрит в , а надо ему в (dx, dy). Если он положительный, то угол острый и бежать вперед.
Если отрицательный — тупой, надо пятиться. Косинус можно вычислять по теореме косинусов.
Но для этого нам придется вычислять длины каждого из векторов, извлекать корни, очень громоздко. Есть так же формула скалярного произведения. Которое, как известно, в декартовой системе координат может быть вычислено по формуле. Таким образом, вычислив скалярное произведение и посмотрев на его знак, мы сможем определить, бежать нам вперед или назад.
А в нашем случае вычислять мы его будем по формуле . Более того, это же самое скалярное произведение показывает нам, сколько именно надо бежать вперед или назад по своему геометрическому определению (проекция одного вектора на другой, помноженная на длину второго). Влево или вправо? Если положительный — цель по правую руку, и наоборот.
Тут нам поможет векторное произведение, а если быть более точным, то псевдоскалярное произведение, вычисляемое в декартовых координатах по формуле. Опять- таки величина этого числа определяет, насколько много надо сделать шагов вбок. Реализация. Запрограммируем наши рассуждения. Func Scalar. Mult($a, $b, $x, $y). Func Vector. Mult($a, $b, $x, $y). Func Get. Direction($x, $y, $wx, $wy, $angle).
Просто в Wo. W азимут отсчитывается от севера против часовой стрелки. Эти детали можно просто «попробовать» в реальной программе. И, если вышло наоборот, поиграться со знаками. Функция Get. Direction() возвращает массив из двух значений: сколько идти вперед/назад, сколько идти вбок. Это поворот! Это позволяет персонажу «не мельтешить». Кнопка движения вперед не отпускается по достижении точки назначения. Поэтому поворачиваться на требуемый угол нам надо сравнительно быстро.
Код, отвечающий за проигрывание файлов команд, не представляет из себя ничего интересного, и при желании вы можете ознакомиться с ним самостоятельно. Полный исходный код Player'а#include < Color. Global $Win. Name = . Пробежим по маршруту, запишем координаты, нажатия клавиш и клики, и включим воспроизведение. Но не тут- то было. Здесь начинается самое сложное.
В подземелье живут мобы, которые хоть и не представляют угрозы для жизни нашего персонажа, но норовят оглушить, кинуть «молчанку», отбежать в сторонку как раз тогда, когда вы бы хотели их убить, и бросаются на амбразуру в тот момент, когда вы думали взять в цель совсем другого моба. Иногда ваша цель забегает за спину, иногда — умирает за один удар, хотя должна жить три.
В общем, их хаотичное поведение вносит заметный элемент случайности в наш маршрут, и в итоге персонаж может оказаться у запертой двери в самом конце маршрута просто потому, что не смог убить кого- то в самом начале. Да, можно было написать внутриигровые макросы, которые бы брали в цель нужного моба, и тем самым избавиться от некоторых проблем, но мне хотелось оставить бота как можно более универсальным.
Двери- решетки. На них нужно кликнуть, чтобы открыть. А так как они решетки, то кликнуть вы можете случайно аккуратно в дырку.
И персонаж будет биться лбом об дверь в попытке пробежать дальше. Таким образом, записав маршрут, вы открываете его в блокноте и отлаживаете. Вы наблюдаете за персонажем и при проблемах или возможных проблемах «вбиваете костыли» в маршрут: вставляете дополнительное заклинание для верности (вдруг моб выживет), добегаете до той точки, в которой моб будет точно виден и досягаем независимо от его желания прогуляться. Вы изменяете маршрут, чтобы уж точно не споткнуться об этот злосчастный ящик. После 1. 0 забегов я пришел к выводу, что лучше бы я просто переубивал там всех пауков, чем они потом смогли бы отомстить мне в одном случае из 1. Но, когда персонаж уже бегает сам, вам уже не хочется бежать самому ножками, вам хочется просто смотреть на это.
Я понял, каково это, запускать марсоход, программировать робот- пылесос, идти в полной темноте по квартире или учить роботов играть в футбол. Надо все делать надежно, с запасом.
На марсе ямы будут везде, а еще будут нависающие скалы и пещеры. В квартире роботу- пылесосу будут противостоять провода и тапочки повсюду, а еще будет кот, который захочет поиграть. В полной темноте будут углы, ножки стульев, и даже упавшие на пол ножи. Только на ощупь! Признаюсь, выполнил я заявленную в прошлой части лишь программу минимум.