Использование ботов в WoW

Главная → World of Warcraft → Статьи → Использование ботов в WoW Не секрет, что существуют боты для Warcraft. Для wow есть бот не только для прокачки персонажа, но и для прокачки профы, фарминга золота. Очень популярны боты для прокачки рыбалки, ведь эту профу никто не хочет качать сам. В world of warcraft, чтобы прокачать скин, также нужно потратить много времени, поэтому игроки часто используют бота.

Стоит ли использовать ботов?

Я бы не советовал использовать запрещенные программы, а бот для Warcraft относится к запрещенным. Не важно, используете ли вы запрещенную программу для снятия скинов в world of warcraft или для любых других целей, вас могут легко забанить. Если прокачивать персонажа лень, то лучше заказывать прокачку у других игроков, но не использовать бота wow для прокачки. Поверьте, при использовании любой запрещенной программы есть огромный шанс быть забаненным.

Фарминг на мобах с помощью бота в WoW

БОТ / ЧИТ ДЛЯ WOW!!! BIMS BOT Автофармавтосбор! + ПОДАРОК

Фермерство с ботом

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

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

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

Как жить без ботов?

Торговля в World of Warcraft

  • Купить золото
  • Продать золото
  • Заказ редких предметов
  • Улучшение персонажа
  • Услуги гаранта

Если в wow многие игроки будут использовать ботов для прокачки World of Warcraft, проводить время в этой MMORPG будет неинтересно. Поверьте, гораздо интереснее прокачиваться в самой игре, учась правильно играть своим персонажем с первых уровней. Те же профы можно легко прокачать самому, даже если взять в world of warcraft удаление скинов, прокачать его легко не получится.

Результат

Вы не должны использовать запрещенные программы в World of Warcraft. Сделай это сам. Если у вас не хватает времени, например, на прокачку, заказывайте в проверенных интернет-магазинах.

Источник: www.online-torg.клуб

Соревнование ИИ: Они играли 8 часов?! Какая раса сильнейшая в Warcraft 3 Reforged

Создание простого бота для WoW, пути программирования

Создание простого бота для WoW, пути программирования

2013-08-12 в 7:56, admin , Темы: autoit, diy или do-it-yourself, разработка игр, Lua, учебник, world of warcraft, wow, робототехника, Метки: autoit, бот, lua, учебник, world of warcraft, wow, аддон, робототехника

Введение

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

  1. Процесс создания тривиального аддона для пользовательского интерфейса WoW на языке Lua
    • Сериализация данных для передачи между частями системы
    • Передача информации с помощью цвета пикселей
    • Процесс управления персонажем в AutoIt
      • Программа для записи действий, которые вы совершаете
      • Программное обеспечение для воспроизведения
      • Мат.расчеты направления движения
      • Почему не стоит прибегать к чтению/записи памяти процесса
      • Программа управления (роботом) с командами, понятными непрограммисту

      Внимание

      Я полностью понимаю, что использование ботов запрещено лицензионным соглашением Blizzard. Это может привести к перманентному бану аккаунта. Я был бы расстроен, если бы узнал, что кто-то, используя материал в этом посте, начал получать прибыль, ухудшая экономику игры и вызывая неодобрение со стороны других игроков. И да, я понимаю, что то, что я делаю, нечестно.

      Цель этого поста — рассказать о своем опыте и описать трудности, с которыми я столкнулся, узнать от вас, что можно было бы сделать лучше.

      Предыстория

      Сбор

      Люди, далекие от игровой индустрии, могут без предубеждения пропустить этот раздел. Существует такой аспект игры WoW, как коллекционные предметы. Как в нумизматике/филателии, чем больше у вас, например, ездовых животных, тем больше удовольствия вы получаете. Аналогично, процесс получения.

      Некоторые драконы требуют выполнения десятка заданий («ачивок»), некоторые — вхождения в топ-2% игроков в мире по навыку управления персонажем (бои на арене), что-то можно просто купить за внутриигровую валюту, что-то — за реальные деньги в магазине. Подробности можно найти в другом месте, но суть не в этом. Некоторые коллекционные предметы выпадают в подземелье с шансом около 0.5%.

      Если игрок получает шанс выпадения предмета только раз в день (иногда в неделю), вам потребуется время, соизмеримое с годом, чтобы пробежать. И все ради того момента, когда вы получите желанный потерянный предмет. Чем больше вы потратите времени и усилий на «фарм» предмета, тем приятнее он вам достанется в итоге. По моему опыту, радость очень мимолетна.

      Зависимость шанса выпадения от количества попыток

      Небольшое отступление. Какова вероятность того, что в шести бросках игральной кости выпадет «6»?? Очевидно, что . То есть, наше событие противоположно тому, чтобы не выпало «6» во всех шести попытках.
      Используя второе великое ограничение, нетрудно показать, что .

      Вероятность получить лошадь с шансом «выпадения» 1% за 100 попыток составляет около 63%.

      Некоторые игроки, сделав триста попыток, считают, что им вот-вот повезет — ведь вероятность неудачи для такого большого количества попыток невелика. Они будут разочарованы, потому что в следующей сотне им снова повезет только на 63%. А старые работы вам ничего не дадут.

      Задание

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

      Создание простого бота для WoW, программирование маршрутов

      Карта подземелья и маршрут:

      Задача максимум. Начал и ушел на полчаса. Процесс полностью автоматизирован.

      Задание минимум. Запустить его и сидеть рядом и читать или играть на гитаре, глядя в монитор. Время от времени помогать персонажу выйти из неожиданной ситуации, если это необходимо.

      Важно уметь при желании описать маршрут очередного подземелья, не вникая в код.

      Подход

      Движение и позиционирование

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

      1. Вам необходимо воспроизвести исходное положение персонажа и направление его взгляда. Если перед автоматическим бегом немного повернуть в противоположную сторону, то вы будете бежать криво и рано или поздно врежетесь в стену
      2. Если ты записал точные координаты и угол, то ты не сможешь поставить туда иероглиф тоже. Он реагирует на кнопки, как бульдозер, и поворачивает точно так же. И даже ошибка в 1 градус через 100 метров приведет к метрам (ширина дверного проема)
      3. Время нажатия и отпускания кнопки тоже далеко от идеала. Это все равно что передвигаться по квартире с закрытыми глазами. Казалось бы, шесть шагов вперед и строго направо, но на самом деле вместо туалета мы оказываемся в ванной комнате. Попробуйте также открыть дверь с закрытыми глазами, не прикасаясь к ручке
      Читайте также:  World of warcraft classic таланты

      Именно по этим причинам нам необходимо позиционировать себя в мире с координатами. Это нужно проверять и корректировать регулярно, каждые 100 миллисекунд.

      переместить 40.644 20.417 1.537 перемещение 40.526 20.411 1.537 перемещение 40.246 20.408 1.592 перемещение 39.974 20.414 1.592 move 39.691 20.411 1.537 ход 39.417 20.388 1.510

      Это выдержка из списка команд робота для перемещения. Заданные координаты x, y и угол поворота в пространстве в радианах.

      Клавиши и команды

      По пути нужно нажимать кнопки и кликать мышкой, открывать двери, где-то нужно подождать. Я не хочу писать все это вручную. Да, и посмотрите среди команд с координатами (в примере выше), куда что ставить не очень красиво. Итак, мы напишем одновременное нажатие и отпускание кнопок вместе с записью координат.

      шаг -0.89 мышь вправо 942 498 пауза 10000 перемещение 39.417 20.388 1.510 клавиша `пауза 1000 клавиша перемещение 39.142 20.364 1.510 клавиша 3 клавиша 3 мышь вправо 963 622 перемещение 38.864 20.340 1.510 перемещение 38.653 20.321 1.510

      Особое упоминание «шаг». Если персонаж смотрит на горизонт, то он равен нулю. Если под ногами, то наклон отрицательный. А небо положительное.

      Измеряется в радианах. Его нужно было добавить, как только персонаж захотел полетать.

      Модули

      Итак, у нас есть следующие части программно-аппаратного комплекса бот:

      1. Мы напишем Аддон для интерфейса WoW, что определит положение персонажа, азимут, наклон. Аддоны не запрещены правилами игры, указанная информация доступна через игровой API внутри аддона. Все это будет нарисовано на экране. Сам аддон написан на языке Lua, потому что так решили разработчики игры.
      2. В аддоне можно что-то определить, можно нарисовать, но нельзя заставить персонажа двигаться. Также в аддоне нельзя писать в файл, спрашивать у игры где стены, где враги, и еще много чего нельзя. Итак, мы должны написать внешнее управляющее приложение. Я не хотел быть оригинальным и использовал AutoIt. Это действительно быстро и удобно, хотя и немного странно для меня, привыкшего программировать на строго типизированных языках.
        • Приложение должно уметь write мои действия. Назовем эту функцию Recorder
        • Приложение должно уметь играть Синхронизация. Давайте вызовем Игрока
        • Записанные действия и координаты мы будем сохранять в текстовом файле построчно. Их можно и нужно редактировать вручную. Добавить костыли, убрать мусор. Скажу сразу, это самая сложная часть.

        Аддон для WoW на Lua

        Аддон для WoW — скрипт на языке Lua. Язык полнофункциональный, гибкий, эффективный. Вы не можете ничего сделать с системой. Вы можете делать с игрой все, что угодно, но только в рамках API, который предоставляет вам игра. Поскольку Blizzard не хочет, а точнее, запрещает игрокам и предпринимателям писать ботов, API не предлагает почти ничего полезного, кроме вышеупомянутых координат.

        Конечно, полезно для наших нужд. Хорошее руководство по написанию аддонов с описанием Lua можно найти здесь. Что ж, опишу свой вариант.

        Манифест и графический интерфейс

        Детали и источник. В папке World of WarcraftInterfaceAddOns создать папку HelloWorld. В нее вы помещаете HelloWorld.toc с содержимым

        ## Интерфейс: 50001 ## Название: Hello, World! ## Примечания: Мой первый AddOn HelloWorld.lua

        Если бы я хотел рисовать формы и кнопки (а это то, для чего обычно нужны аддоны), то последнюю строчку я бы поставил HelloWorld.xml с описанием этих кнопок. При разработке и написании такого GUI-аддона очень помогает AddOn Studio. Мощный инструмент на базе MS Visual Studio.

        Но поскольку я минималист, в этот раз мы не будем рисовать. Это также даст мне возможность показать, что вы можете создавать формы динамически из самого скрипта без использования дизайнера. Рассмотрим HelloWorld.lua. Я отредактировал его в блокноте++. Для того чтобы в игре были учтены изменения в HelloWorld.toc, Вы должны перезапустить все.

        А вот изменения в HelloWorld.lua можно вызвать, написав в консоли команду /reload. Поэтому процесс программирования и отладки не такой болезненный.

        Слэш-команды

        Кстати, об отладке. Советую сразу добавить обработчик слэш-команд:

        SLASH_HELLO_WORLD1 = ‘/helloworld’; function SlashCmdList.HELLO_WORLD(msg, editbox) local facing = GetPlayerFacing(); local pitch = GetUnitPitch(«player»); local x, y = GetPlayerMapPosition(«player»); print(format(«HelloWorld %.2f %.2f %.2f %.2f», x*100, y*100, facing, pitch)); end

        Для этого определим переменную следующего вида SLASH_IMAGE. Где ИМЯ является уникальной для всех аддонов, и n либо ничего, либо порядковый номер с 1. И добавим функцию с именем ИМЯ как некий объект.

        Для программиста на C++ может показаться странным, что мы нигде явно не регистрируем эту функцию-обработчик. И мы связываемся со строковой переменной чисто по имени переменной. Но в этом и заключается сила и магия Lua.

        Теперь команда в WoW-Console /helloworld будет делать то, что вам нужно: позволит выводить отладочную информацию, а для простых аддонов будет делать все, для чего вы его написали.

        А затем я показал WoW API, который получает необходимую информацию.

        Обработчик событий

        Система GUI в аддоне похожа на то, как работает Windows со своими сообщениями и их обработкой.

        local EventFrame = CreateFrame(«Frame») function EventFrame:OnEvent(event, . ) print(«HelloWorld:», event) self[event](self, . ) end EventFrame:SetScript(«OnEvent», EventFrame.OnEvent) EventFrame:RegisterEvent(«PLAYER_LOGIN») function EventFrame:PLAYER_LOGIN() — Инициализация здесь end function EventFrame:OnUpdate() — Полезные действия здесь end EventFrame:SetScript(«OnUpdate», EventFrame.OnUpdate)

        Мы создаем фрейм типа «Кадр» и подключим к действиям «OnEvent» и «OnUpdate»Команды

        EventFrame:SetScript(«OnEvent», EventFrame.OnEvent) EventFrame:SetScript(«OnUpdate», EventFrame.OnUpdate)

        Обработчик OnUpdate будет вызываться после каждого кадра — это то, что нам нужно для обновления координат. А OnEvent будет вызываться при других желаемых событиях. Из него мы извлечем соответствующие функции:

        self[event](self, . )

        Что еще более мощно в Lua, так это то, что вы можете использовать эту конструкцию для вызова уникальных обработчиков, таких как

        function EventFrame:PLAYER_LOGIN()

        Здесь PLAYER_LOGIN — это событие, которое посылается всем фреймам, когда вы входите в мир и перезапускаете пользовательский интерфейс. Другие события: PLAYER_LEAVE_COMBAT, QUEST_FINISHED, PLAYER_EQUIPMENT_CHANGED, PLAYER_DEAD, — и многое другое. Полный список доступен здесь. Давайте зарегистрируем событие, которое мы хотим обработать, с помощью функции

        EventFrame:RegisterEvent(«PLAYER_LOGIN»)

        Передача информации

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

        Читайте также:  Будет ли варкрафт 2
        Рисование

        Поскольку нам также нужны фреймы для рисования, мы создаем их

        local HelloWorld1 = CreateFrame(«Frame», nil, UIParent) local HelloWorld2 = CreateFrame(«Frame», nil, UIParent) function EventFrame:PLAYER_LOGIN() HelloWorld1:SetFrameStrata(«BACKGROUND») HelloWorld1:SetWidth(10) HelloWorld1:SetHeight(10).texture = HelloWorld1:CreateTexture(nil, «BACKGROUND») HelloWorld1.texture:SetAllPoints(HelloWorld1) HelloWorld1:SetPoint(«TOPLEFT»,0,0) HelloWorld1:Show() HelloWorld2:SetFrameStrata(«BACKGROUND») HelloWorld2:SetWidth(10) HelloWorld2:SetHeight(10) HelloWorld2.texture = HelloWorld2:CreateTexture(nil, «BACKGROUND») HelloWorld2.texture:SetAllPoints(HelloWorld2) HelloWorld2:SetPoint(«TOPLEFT»,10,0) HelloWorld2:Show() end

        Я думаю, что это достаточно понятно без комментариев. Для получения более подробной информации о каждом методе, не стесняйтесь искать.

        Сериализация

        У нас есть две координаты и два угла. Все числа с плавающей точкой. Компоненты цвета пикселя в аддоне также являются числами с плавающей точкой, но от 0.0 на 1.0. Кроме того, мы знаем, что цветовая составляющая будет храниться в одном байте. Сначала я сохраняю каждую координату в одном цветовом компоненте.

        В результате точность позиционирования в локации составила 1/255 размер карты. Это работает как в GPS: вроде бы координаты есть, но по навигатору (без управления человеком) ездить по дороге нельзя. Поэтому нам пришлось передать два байта. Как сохранить одно дробное число в двух байтах? Я сделал следующее

        local x1, x2 = math.modf(x*255)

        Функция modf возвращает целую и дробную часть числа, разделенные запятой. Здесь используется параллельное присваивание — еще один полезный прием Lua.

        При таком подходе я использую всю мощность каждого из двух байтов, в которых хранится координата. Ну, азимут и наклон не так уж требовательны к точности, лишь бы они укладывались в отрезок 0.0-1.0. Работает следующим образом:

        local math = getfenv(0).math function EventFrame:OnUpdate() local facing = GetPlayerFacing(); local pitch = GetUnitPitch(«player»); local x, y = GetPlayerMapPosition(«player»); local x1, x2 = math.modf(x*255) local y1, y2 = math.modf(y*255) HelloWorld1.texture:SetTexture(x1/255, x2, facing/7) HelloWorld2.texture:SetTexture(y1/255, y2, pitch/4+0.5) конец

        Теперь при перемещении по миру в левом верхнем углу два квадрата 10 на 10 будут случайным образом менять свой цвет.

        Полный текст HelloWorld.lua

        local math = getfenv(0).math SLASH_HELLO_WORLD1 = ‘/helloworld’; local EventFrame = CreateFrame(«Frame») local HelloWorld1 = CreateFrame(«Frame», nil, UIParent) local HelloWorld2 = CreateFrame(«Frame», nil, UIParent) function EventFrame:OnEvent(event, . ) print(«HelloWorld:», event) self[event](self, . ) end EventFrame:SetScript(«OnEvent», EventFrame.OnEvent) EventFrame:RegisterEvent(«PLAYER_LOGIN») function EventFrame:PLAYER_LOGIN() HelloWorld1:SetFrameStrata(«BACKGROUND») HelloWorld1:SetWidth(10) HelloWorld1:SetHeight(10) HelloWorld1.texture = HelloWorld1:CreateTexture(nil, «BACKGROUND») HelloWorld1.texture:SetAllPoints(HelloWorld1) HelloWorld1:SetPoint(«TOPLEFT»,0,0) HelloWorld1:Show() HelloWorld2:SetFrameStrata(«BACKGROUND») HelloWorld2:SetWidth(10) HelloWorld2:SetHeight(10).texture = HelloWorld2:CreateTexture(nil, «BACKGROUND») HelloWorld2.texture:SetAllPoints(HelloWorld2) HelloWorld2:SetPoint(«TOPLEFT»,10,0) HelloWorld2:Show() end function EventFrame:OnUpdate() local facing = GetPlayerFacing(); local pitch = GetUnitPitch(«player»); local x, y = GetPlayerMapPosition(«player»); local x1, x2 = math.modf(x*255) local y1, y2 = math.modf(y*255) HelloWorld1.texture:SetTexture(x1/255, x2, facing/7) HelloWorld2.texture:SetTexture(y1/255, y2, pitch/4+0.5) end EventFrame:SetScript(«OnUpdate», EventFrame.OnUpdate) функция SlashCmdList.HELLO_WORLD(msg, editbox) local facing = GetPlayerFacing(); local pitch = GetUnitPitch(«player»); local x, y = GetPlayerMapPosition(«player»); print(format(«HelloWorld %.2f %.2f %.2f %.2f», x*100, y*100, facing, pitch)); end

        Заключение первой части

        Давайте рассмотрим, о чем мы говорили

        1. Мы рассчитали вероятность получения элемента при большом количестве попыток
        2. Мы определили проблему, придумали, как ее решить, и разбили ее на модули
        3. Вот мы и рассмотрели самый простой код аддона для WoW на языке Lua
          • научились передавать координаты с помощью цвета
          • научились рисовать, обрабатывать события
          • научились обрабатывать слэш-команды

          И если вы разрабатываете что-то и хотите позволить себе или пользователям участвовать в этом, гибко настраивайте программу, используя свой API (e.g. написать искусственный интеллект для противников, позволить брокерам размещать позиции на основе котировок, позволить администраторам совершать собственные действия на основе результатов инвентаризации пользователей и т.д.).п.), вы должны знать, что Lua очень гибкий и очень легко интегрируется. Рассматривая такую возможность.

          В следующей части мы поговорим о том

          1. написание регистратора ключей и координат в AutoIt
          2. написание инструкции игрока для бота
          3. В 2D математике, как ориентироваться в декартовой системе координат без теоремы косинусов
          4. Как управлять роботом при недостаточном количестве датчиков
          5. меры противодействия ботам

          Источник: www.pvsm.ru

          Создание простого бота для онлайн игры world of warcraft

          Думаю тема ботов не оставит равнодушным ни одного игрока в онлайн игры. Кого-то они раздражают, кого-то интересуют, а кто-то ими пользуется. Существует также ряд людей, довольно небольших по сравнению с тремя другими группами, которые являются людьми, разрабатывающими этих ботов.
          Я предлагаю присоединиться к этой небольшой касте людей и посмотреть изнутри на процесс разработки бота.

          Фон

          Однажды на выходных я зарегистрировал своего персонажа в world of warcraft. Делать в игре было нечего — все рейдовые боссы уже были убиты, друзей для выхода на арену не было, оставалось только выполнение квестов и неспешная добыча золота. Квесты мне не очень нравятся и свое свободное время в игре я провожу обычно возле аукциона — с помощью специальных аддонов покупаю то, что дешевле, а потом продаю дороже, выигрывая на разнице в цене.

          Итак, мне пришла в голову идея автоматизировать эту рутину — зайти на аукцион, запустить аддон, нажать в нем кнопки, зайти в почтовый ящик, взять вещи из почтового ящика, вернуться на аукцион и снова запустить аддон, и так по кругу.

          В качестве инструмента реализации я выбрал Auto It, но потом оказалось, что задача не такая тривиальная, как кажется на первый взгляд, и мне пришлось подключить дополнительные инструменты. Сразу скажу, что я не использовал никаких «грязных» методов вроде чтения памяти процесса или перехвата трафика, только autoit для имитации кликов мыши и клавиатуры и считывание цветов пикселей с экрана.

          Предупреждение

          Все вышеперечисленные действия вы выполняете на свой страх и риск, правилами игры это запрещено и может привести к перманентному бану аккаунта.

          Перейти

          На самом деле, наверное, самое интересное в разработке бота — это реализация его перемещения по миру. Сначала я думал, что с этим проблем не будет — путь у нас простой: аукцион — это здание, в котором находятся NPC, с ними нужно поговорить, чтобы начать торговлю, а почтовый ящик находится прямо у выхода с аукциона, чуть левее. Персонаж поэтому всегда ходит как буква «Г», туда-сюда

          Я решил просто засечь, сколько времени нужно нажать «вперед» и «вправо» или «влево», чтобы прийти в нужную точку и просто захардкожу. Но реальность показала, что это нереально: если делать так, то возникают проблемы с пингом: персонаж иногда слишком много бегал, иногда слишком много поворачивался, метод был совершенно нерабочим.

          Но я не унывал и начал думать, что делать дальше. Казалось бы, следующее решение — каким-то образом определить, где находится персонаж в данный момент, и на основании этого вычислить, куда ему следует двигаться дальше. Только как получить данные о положении и угле поворота персонажа без чтения памяти процесса игры? Анализировать всю картину или отдельные ее части довольно сложно, скриншот выхода с аукциона:

          После некоторых размышлений мы пришли к решению проблемы: нужно написать аддон для WoW, который будет получать данные о текущем положении персонажа (координаты и поворот персонажа) и отдавать команды, куда перемещать персонажа. Внешне это должно выглядеть как цветной «семафор», который будет показывать желаемое действие: движение вперед, вправо или влево, или поворот. Когда персонаж прибывает в необходимую точку, семафор должен символизировать, что персонаж прибыл в это место и необходимо выполнить следующее действие. Поскольку мой персонаж перемещается между двумя точками, я решила сделать 2 семафора: один на пути к аукционисту, другой на пути к почте С алгоритмом вроде бы разобрался сам, далее будут примеры кода (xml — шаблоны аддона, lua — собственно исходный код, и autoit), иногда кривые и корявые, но я думаю, простите меня: на этих языках писал первый раз, и еще не совсем разобрался.

          Читайте также:  Не удалось запустить bonjour warcraft 3

          Для реализации семафоров мне пришлось изучить процесс разработки аддонов для WoW, он очень хорошо описан в WoWwiki

          Самая первая версия семафора, он показывал только, если я в данный момент стою лицом к аукционисту, и подсвечивал соответствующие блоки зеленым цветом:

          В качестве основы для своего аддона я взял hello world! аддон, описанный в wowiki.
          Изначально в нем не было никаких графических элементов, поэтому мне пришлось добавить в него вывод прямоугольников, а также поставить обработчик . Конечным результатом является мой HelloWorld.xml стал выглядеть примерно так:

          Semafor_Onload(); CheckPosition();

          Соответственно, в HelloWorld.lua вам нужно написать соответствующие обработчики. Чтобы узнать, под каким углом в данный момент повернут персонаж, используйте функцию GetPlayerFacing, которая возвращает угол относительно севера в радианах. В ходе экспериментов было установлено, что когда персонаж смотрит прямо на аукциониста, его угол 5.42 радиана. Но довольно сложно повернуть персонажа точно под таким углом, поэтому допустим небольшой разброс (5.35 — 5.5 радиан).

          function Semafor_Onload() print(«Hi!»); end function CheckPosition() local facing = GetPlayerFacing(); — проверяем, куда смотрит персонаж, и рисуем, в какую сторону он должен повернуться, чтобы посмотреть на аукциониста if(facing = 5.35) then PlayerAucViewTrue:SetTexture(0,1,0); — установка цвета текстуры, цвет в формате RGB. 1,0,0,0 — красный, 0,1,0 — зеленый PlayerAucViewLeft:SetTexture(1,0,0); PlayerAucViewRight:SetTexture(1,0,0); elseif ((facing > 5.50))then PlayerAucViewTrue:SetTexture(1,0,0); PlayerAucViewLeft:SetTexture(1,0,0); PlayerAucViewRight:SetTexture(0,1,0); elseif (facing < 5.35) then PlayerAucViewTrue:SetTexture(1,0,0); PlayerAucViewLeft:SetTexture(0,1,0); PlayerAucViewRight:SetTexture(1,0,0); end end

          Теперь напишем скрипт на autoit, который будет смотреть, какого цвета семафор в данный момент, и поворачивать персонажа в нужную сторону, а заодно создадим каркас для нашего приложения для автоматической торговли на аукционе. Экспериментально было выяснено, что цвет пикселя 65280 — зеленый.

          Global $WinName = «World of Warcraft» Global $state = «stop» Opt(«PixelCoordMode», 2) ;Отсчет пиксельных координат от верхнего левого угла окна клиента Opt(«MouseCoordMode», 2) ; Отсчет координат мыши от левого верхнего угла клиентского окна HotKeySet(«», «GoRotate») HotKeySet(«», «_Exit») WinActivate($WinName) WinWaitActive($WinName) While 1 sleep(10) Running(); бесконечный вызов этой функции, которая выполняет необходимое действие WEnd Func _Exit() Exit EndFunc Func GoRotate() $state = «rotating» EndFunc Func Running() Switch $state Case «rotating» Rotating() EndSwitch EndFunc Func Rotating() While $state = «rotating» ; определяем угол поворота, нужно ли вращать; координаты точек, где мы берем цвет, взяты вручную на скриншоте семафором $angleOkColor = PixelGetColor(32,24) $angleLeftColor = PixelGetColor(29,36) $angleRightColor = PixelGetColor(40,32) if $angleOkColor = 65280 Then $state = «starttrading» ;если все в порядке, то мы на месте — начинаем торговать ElseIf $pxAngleLeftColor = 65280 Then; поворот налево Send(«»); нажимаем кнопку «влево» и засыпаем, пока не сработает сигнал семафора; поворот влево плавный, иногда он поворачивает слишком сильно из-за этого While PixelGetColor(29,36) = 65280 sleep(2) Wend Send(«») ElseIf $pxAngleRightColor = 65280 Then ; поворот вправо не плавный, для более точного поворота Send(«»); sleep(20); EndIf EndFunc

          Вот и все, сохраните аддон, запустите WoW, запустите скрипт AutoIt и посмотрите на персонажа, который сам повернется лицом в нужном направлении. Но помимо поворотов необходимо также реализовать движение персонажа вперед-назад, а также вправо-влево, чтобы он мог подойти к аукционисту из почтового ящика. Повезло, что на пути персонажа нет препятствий, иначе задача была бы сложнее.

          И это просто добавление дополнительных рамок в наш xml для еще 5 кнопок семафора: position OK!, двигаемся вперед, двигаемся назад, двигаемся вправо и двигаемся влево, а в lua файле дописываем код, который будет показывать, куда мы необходимо двигаться в данный момент. Мы знаем опорные координаты, куда мы хотим пойти. Казалось, что это тоже просто, но это было не так, как мы видели на карте и уже выяснили, когда делали повороты, мы двигались под северным углом. Т.е. При движении обе координаты персонажа постоянно меняются. Считать, куда идти дальше, не очень удобно, поэтому используем известные со школьных уроков формулы для поворота системы координат на заданный угол (в нашем случае 5).42 радиана)

          Теперь при движении к/от аукциониста и вправо-влево у нас будет меняться только одна координата. Добавим соответствующий код в наш lua-файл, и он будет выглядеть следующим образом

          function Semafor_Onload() print(«Hi! Все готово!»); end function CheckPosition() local facing = GetPlayerFacing(); SetMapToCurrentZone(); local posX, posY = GetPlayerMapPosition(«player»); — переходим в систему координат относительно аукциона (поворачиваем координаты на угол 5.42 радиана) newPosX = posX*math.cos(5.42) + posY*math.sin(5.42); newPosY = -posX*math.sin(5.42) + posY*math.cos(5.42); newPosX = -newPosX; — не люблю отрицательные числа 🙂 — проверяем, куда смотрит персонаж, и рисуем направление, в котором он должен повернуться, чтобы посмотреть на аукциониста if(facing = 5.35) then PlayerAucViewTrue:SetTexture(0,1,0); PlayerAucViewLeft:SetTexture(1,0,0); PlayerAucViewRight:SetTexture(1,0,0); elseif ((facing > 5.50 и направлена в сторону < 6.5))then PlayerAucViewTrue:SetTexture(1,0,0); PlayerAucViewLeft:SetTexture(1,0,0); PlayerAucViewRight:SetTexture(0,1,0); elseif (facing < 5.35) then PlayerAucViewTrue:SetTexture(1,0,0); PlayerAucViewLeft:SetTexture(0,1,0); PlayerAucViewRight:SetTexture(1,0,0); end — проверим позицию персонажа и определим куда бежать чтобы попасть к аукционеру if (newPosX =0.8875) then PlayerGoForvard:SetTexture(1,0,0); PlayerGoBack:SetTexture(1,0,0); PlayerGoLeft:SetTexture(1,0,0); PlayerGoRight:SetTexture(1,0,0); PlayerOnAuc:SetTexture(0,1,0); elseif (newPosY > 0.889) then PlayerGoForvard:SetTexture(1,0,0); PlayerGoBack:SetTexture(1,0,0); PlayerGoLeft:SetTexture(0,1,0); PlayerGoRight:SetTexture(1,0,0); PlayerOnAuc:SetTexture(1,0,0); elseif (newPosY < 0.8875) then PlayerGoForvard:SetTexture(1,0,0); PlayerGoBack:SetTexture(1,0,0); PlayerGoLeft:SetTexture(1,0,0); PlayerGoRight:SetTexture(0,1,0); PlayerOnAuc:SetTexture(1,0,0); elseif (newPosX >0.207) then PlayerGoForvard:SetTexture(0,1,0); PlayerGoBack:SetTexture(1,0,0); PlayerGoLeft:SetTexture(1,0,0); PlayerGoRight:SetTexture(1,0,0); PlayerOnAuc:SetTexture(1,0,0); end

          Вот и все, теперь у нас есть что-то вроде этого семафора:

          Теперь мне нужно написать AutoIt скрипт, чтобы когда семафор загорался, он посылал соответствующие кнопки в игру. Единственное, с чем я столкнулся, это то, что он не дает мне нормально нажимать кнопки с буквами (A/D), поэтому мне пришлось привязать strafe к F6/F7.

          Вот собственно и все, после этого мы получаем персонажа, который автоматически разворачивается, а затем бежит и встает рядом с аукционистом.

          Текст получился уже довольно большого объема, если тема интересна для HabraSociety, то в следующих частях я расскажу о том, как я реализовал взаимодействие с аукционером и как получал почту из почтового ящика.

          Сегодня в 12 часов я поставил бота бегать по аукциону, за время его работы (около 9 часов) мне пришлось 3 раза ему помешать — один раз он застрял в выступающих элементах стены, потом я немного переписал алгоритм, чтобы он бегал в сторону почты, и 2 раза он промахнулся мимо почтового ящика — надо это исправить, пока не получилось.
          Итоги дня:

          Неплохо, при условии, что я вообще не участвовал в процессе 🙂

          Источник: habr.com