Руководство по макросам
Хотите узнать ответ на свой вопрос как можно быстрее? Посетите канал #russian на нашем Discord-сервере.
Написать комментарий
Скриншоты, содержащие элементы пользовательского интерфейса, как правило, удаляются немедленно. То же самое относится к скриншотам, сделанным с помощью Model Viewer или окна выбора персонажа.
Чем выше качество, тем лучше!
Перед загрузкой скриншота, пожалуйста, ознакомьтесь с требованиями к скриншотам!
Пожалуйста, введите ссылку на видео в поле ниже.
Клиент Wowhead — небольшая программа, которую мы используем для поддержания нашей базы данных в актуальном состоянии. Пользователи Wowhead Client получают доступ к дополнительным инструментам на сайте.
У Wowhead Client две основные цели:
Он устанавливает и обновляет аддон Wowhead Looter, Которая собирает данные, пока вы играете!
Загружается собранные данные на Wowhead, что помогает поддерживать базу данных в актуальном состоянии!
Вы также можете использовать клиент Wowhead для просмотра выученных рецептов, выполненных квестов, собранных маунтов и компаньонов, а также полученных рангов!
(iCCup.com) DOTA — Мистер Нога у микрофона! Warcraft 3 Уютный стрим
Источник: www.wowhead.com
Создание простого бота для WoW, программирование маршрутов
2013-08-12 в 7:56, admin , Темы: autoit, diy или do-it-yourself, разработка игр, Lua, tutorial, world of warcraft, wow, робототехника, метки: autoit, бот, lua, tutorial, world of warcraft, wow, аддон, робототехника
Введение
Недавно я прочитал пост, в котором автор рассказывал о своем боте для аукционной торговли в World of Warcraft. Его персонаж бегал челноком на короткие расстояния и выполнял определенные действия, строго оговоренные в управляющей программе. Воспользовавшись его идеями, я решил пойти немного дальше: пусть персонаж сможет пробежать маршрут продолжительностью не менее пяти минут, при этом сохранив возможность записи маршрута и выполненных действий извне, без необходимости менять саму управляющую программу. То, что я описал, является развитием оригинального поста, однако я постарался сделать его ни к чему не обязывающим чтением.
В посте я опишу
- Процесс создания тривиального аддона для пользовательского интерфейса WoW на языке Lua
- Сериализация данных для передачи между частями системы
- Передача цвета пикселей
- Процесс управления персонажем в AutoIt
- Программа для записи выполненных действий
- Программа для игры
- Мат.вычисление направления движения
- Почему бы не прибегнуть к чтению/записи памяти процесса
- Программа управления (роботом) с командами, понятными непрограммисту
Предупреждение
Я прекрасно понимаю, что использование ботов запрещено лицензионным соглашением Blizzard. Это может привести к перманентному бану аккаунта. Я буду разочарован, если узнаю, что кто-то, используя материал в этом посте, получил прибыль, ухудшив экономику игры и вызвав неодобрение со стороны других игроков. И да, я понимаю, что поступаю несправедливо.
КАК ПИСАТЬ МАКРОСЫ В WORLD OF WARCRAFT ? УРОК 1
Цель поста — рассказать о своем опыте и описать трудности, с которыми я столкнулся, узнать от вас, что можно было бы сделать лучше.
Справочная информация
Коллекционирование
Люди, далекие от игровой индустрии, могут без предубеждения пропустить этот раздел. В игре WoW существует аспект коллекционирования. Как и в нумизматике/филателии, чем больше у вас, например, ездовых животных, тем больше удовольствия вы получаете. Не менее важным является процесс получения.
Некоторые драконы требуют выполнения десятка заданий («ачивок»), некоторые требуют быть в топ-2% игроков в мире по навыкам управления персонажем (бои на арене), некоторых можно просто купить за внутриигровую валюту, некоторых — за реальные деньги в магазине. Подробнее об этом вы можете прочитать в другом месте, но суть не в этом.
Итак, некоторые коллекционные предметы выпадают в подземелье с шансом около 0.5%. Если игрок имеет шанс выпасть только раз в день (иногда в неделю), то для запуска вам потребуется время, соизмеримое с годом. И все ради того момента, когда можно будет получить заветный многострадальный предмет. Чем больше времени и усилий вы потратите на «добычу» предмета, тем приятнее вам будет в итоге его получить. По моему опыту, радость очень мимолетна.
Зависимость шанса выпадения от количества попыток
Небольшое отступление. Какова вероятность того, что при шести бросках игральной кости выпадет «6? Очевидно, . То есть, наше событие противоположно тому, чтобы не выпало «6» во всех шести попытках.
Используя второе замечательное ограничение, нетрудно показать, что .
Вероятность получить лошадь с 1% шансом «выпадения» за 100 попыток составляет около 63%.
Некоторые игроки, сделав триста попыток, думают, что им вот-вот повезет — ведь вероятность лопнуть за такое количество попыток мала. Они будут разочарованы, потому что в следующей сотне им снова повезет на 63%. А старые работы ничего не дают.
Задание
Есть подземелье. По пути нужно пробежать с размахом, выполнить пару простых заданий. Убить финального босса и забрать лут. Не бежать к выходу пешком, телепортироваться в ближайшую деревню и лететь к входу. Повторите 5 раз.
Карта подземелья и маршрут:
Задание max. Запустил и оставил на полчаса. Процесс полностью автоматический.
Проблем минимум. Запустить его и сесть рядом, читать или играть на гитаре, глядя на монитор. При необходимости время от времени помогайте персонажу выбраться из непредвиденной ситуации.
Важно иметь возможность при желании описать маршрут другого подземелья, не влезая в код.
Подойти
Движение и позиционирование
Просто записывайте нажатие и отпускание клавиш, позиционирование и клики мыши не работают. Вы можете записать это, но когда вы воспроизведете это, это будет не то, что вы ожидаете по следующим причинам:
- Вам нужно воспроизвести исходное положение персонажа и направление его взгляда. Если перед автоматическим бегом немного повернуться в другую сторону, то вы будете бежать криво и рано или поздно врежетесь в стену
- Если вы записали точные координаты и угол, вы также не можете поместить туда персонажа. На кнопки реагирует как бульдозер и поворачивает точно так же. И даже ошибка в 1 градус на 100 метров измеряется в метрах (ширина дверного проема)
- Время нажатия и отпускания кнопок также далеко от идеала. Это все равно что ходить по квартире с закрытыми глазами. Кажется, что это шесть шагов вперед и точно правильно, но в итоге мы используем ванную вместо туалета. Попробуйте также открыть дверь с закрытыми глазами, не касаясь ручки
По этим причинам нам необходимо позиционировать себя в мире с помощью координат. В этом случае вам необходимо регулярно, каждые 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 двигаться 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
О части «подача» я упомяну в отдельной заметке. Если персонаж смотрит на горизонт, то угол равен нулю. Если под ногами, то наклон отрицательный. И небо позитивно.
Измеряется в радианах. Ее нужно было добавить, как только персонаж захотел летать.
Модули
Таким образом, мы имеем следующие детали программно-аппаратный комплекс бот:
- Мы напишем Аддон интерфейса WoW, который будет определять положение персонажа, азимут, наклон. Аддоны не запрещены правилами игры, указанная информация доступна через внутриигровой API внутри аддона. Все это будет рисоваться на экране. Сам аддон написан на Lua, потому что так решили разработчики игры.
- В аддоне вы можете что-то определить, можете нарисовать, но не можете заставить персонажа двигаться. Еще в аддоне нельзя записать в файл, спросить у игры, где стены, где враги, и многое другое нельзя. Итак, нам нужно написать внешнее управляющее приложение. Я не стал оригинальничать и использовал AutoIt. Это действительно быстро и удобно, хотя немного странно для меня, привыкшего программировать на строго типизированном языке.
- Приложение должно уметь записывать мои действия. Назовем эту функциональность Recorder
- Аддон должен быть способен воспроизведения запись. Назовем ее Player
- Записанные действия и координаты мы будем сохранять в текстовом файле построчно. Их можно и нужно редактировать вручную. Добавить костыли, убрать мусор. Сразу скажу, это самая сложная часть.
Аддон для WoW на языке Lua
Аддон для WoW представляет собой скрипт на языке Lua. Язык полноценный, гибкий, эффективный. Мы не можем ничего сделать с системой. Вы можете делать с игрой все, что угодно, но только в рамках API, который предоставляет вам игра. Поскольку Blizzard не хочет, а точнее запрещает игрокам и предпринимателям писать ботов, то API не дает нам много полезной информации, кроме вышеупомянутых координат.
Конечно же, полезные для наших нужд. Хорошее руководство по написанию аддонов сразу с описанием Lua можно найти здесь. Ну а я опишу свою версию.
Манифест и графический интерфейс
Детали и источник. В папке World of WarcraftInterfaceAddOns создать папку HelloWorld. В него вы поместите HelloWorld.toc с содержимым
## Интерфейс: 50001 ## Название: Hello, World! ## Примечания: Мой первый AddOn HelloWorld.lua
Если бы я хотел добавить несколько небольших форм и кнопок (для чего обычно и предназначены аддоны), то в последней строке я бы добавил HelloWorld.xml С описанием этих кнопок. AddOn Studio очень помогает в разработке и написании GUI-аддона. Мощный инструмент, основанный на 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_IMEN.
Где НАЗВАНИЕ является уникальной для всех аддонов, а n является либо пустым, либо порядковым числом с 1. И мы добавим функцию под названием НАЗВАНИЕ в какой-то объект. Для программиста на C++ может показаться странным, что мы нигде явно не регистрируем эту функцию-обработчик. А со строковой переменной мы связываемся чисто по имени переменной. Но в этом и заключается сила и магия Lua.
Теперь команда в консоли WoW /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 в своем посте. Но мы не будем передавать цвет одного бита информации, а сериализуем его и передадим больше.
Рисование
Поскольку нам также нужны рамки для рисования, давайте создадим их
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).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 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
Заключение первой части
Давайте рассмотрим, о чем мы говорили
- Мы рассчитали вероятность получения предмета при большом количестве попыток
- Мы определили задачу, проработали подход к решению и разбили его на модули
- Мы рассмотрели код простейшего аддона для WoW на языке Lua (прим. пер
- научился передавать координаты с помощью цвета
- научился рисовать, разбираться с событиями
- Узнали, как работать со слэш-командами
И если вы что-то разрабатываете и хотите позволить себе или пользователям участвовать, гибко настраивать программное обеспечение, используя свой API (e.g., написать искусственный интеллект для противников, позволить брокерам размещать позиции на основе котировок, позволить администраторам выполнять свои действия на основе системных запасов пользователя и т.д.п.), то вы знаете, что Lua очень гибок и очень прост для встраивания. Рассмотрим эту возможность.
Что ж, в следующей части мы поговорим о следующем
- Запись ключей и координат регистратора в AutoIt
- Написание инструкций для бота
- 2D математика, как ориентироваться в декартовой системе координат без теоремы косинусов
- управление роботом при недостаточном количестве датчиков
- анти-бот меры
Источник: www.pvsm.ru
Сленг в англоязычных серверах wow
Как русскоговорящему игроку понять, кто где собирает и что означают различные аббревиатуры.
Общие сведения:
WTB — Want To Buy
WTS — Хочу продать
WTT — Хочу торговать
LF — Looking For
LFM — Looking For More
LFG — Ищу группу
LFW — Ищу работу
OMW — On My Way
TY — Thank You
NP — No Problems — нет проблем — нет необходимости (в случае ответа «спасибо»)
AH — Аукционный дом
ASAP — As Soon As Possible
ATM — На данный момент
NM/NVM — Never Mind
BRB — Be Right Back — скоро вернусь
AFK — Away From the Keyboard
DPS — Damage Per Second. Иногда этот термин используется для обозначения действия по нанесению урона или для обозначения игрока, чья основная роль в рейде заключается в нанесении урона.
Подземелья:
HC — Heroic — Героический уровень сложности подземелий или рейдов
RDF — Random Dungeon Finder
RHC — Random Heroic — нахождение случайного подземелья героического уровня
VOA — Vault of Archavon
EOE — Eye of Eternity
OS — Obsidian Sanctum
Naxx — Naxxramas
ULD — Ульдуар
ToC — Trial of Crusader
ICC — Цитадель Ледяной Короны
RS — Рубиновый Санктум
Поля сражений:
RBG — Random Battleground — случайное поле боя
WG — Wintergrasp — Озеро ледяных оков
WSG — Warsong Gulch
AB -Arathi Basin
SOTA — Strand of the Ancients
EOTS — Eye of the Storm
AV — Alterac Valley
Профессии:
JC — Ювелирное дело
BS — Blacksmithing
LW — Обработка кожи
ENCH — Зачарование
TAIL — Портняжное дело
INSC — Inscription
ALCH — Алхимия
ENGI — Engineering
Herbalism — траволечение
Скиннинг
Добыча
Источник: slaventik.wordpress.com