Как запустить lua скрипт wow

Обновлено: 05.07.2024

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

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

Предыстория

Коллекционирование

Люди, далекие от индустрии игр, могут без ущерба пропустить этот раздел. В игре WoW есть такой аспект — коллекционирование. Как и в нумизматике/филателии, чем больше у вас, например, верховых животных, тем вам приятнее. Точно так же важен процесс получения. Какие-то драконы требуют для получения выполнения десятка задач («ачивок»), какие-то — войти в лучшие 2% игроков в мире по навыку управления персонажем (сражения на арене), что-то можно просто купить за игровую валюту, что-то — за реальные деньги в магазине. Подробности можно почитать в другом источнике, речь не об этом. Так вот, некоторые из коллекционируемых предметов падают в подземелье с шансом около 0,5%. Если шанс выпадения дается игроку лишь раз в день (иногда в неделю), вам потребуется время, соизмеримое с годом, для забегов. И все ради того мгновения получения заветного выстраданного предмета. Чем больше вы потратили времени и сил на "фарм" предмета, тем приятнее вам его в итоге получить. По моему опыту радость очень мимолетна.

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

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

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

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

Задача

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


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

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

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

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

Подход

Движение и позиционирование
  1. Вам требуется воспроизвести первоначальное положение персонажа и направление его взгляда. Если вы перед автоматическим забегом повернетесь слегка в другую сторону, вы побежите кривовато и рано или поздно упретесь в стенку
  2. Если вы записали точные координаты и угол, то поставить персонажа туда же вам также не удастся. Реагирует на кнопки он как бульдозер и поворачивается так же. А даже ошибка в 1 градус через 100 метров выльется в метра (ширина дверного проема)
  3. Время нажатия и отпускания кнопок тоже далеко от идеала. Это похоже на передвижение по квартире с закрытыми глазами. Вроде бы шесть шагов вперед и строго направо, но на деле вместо туалета мы оказываемся в ванной. Попробуйте также открыть дверь с закрытыми глазами, не щупая ручку


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

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

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


Отдельно упомяну про «pitch» (наклон). Если персонаж смотрит в горизонт, он равен нулю. Если под ноги, наклон отрицателен. А в небо — положителен. Измеряется в радианах. Его пришлось добавить, как только персонажу захотелось летать.

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

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 будут хаотично менять свой цвет.

HasAura() проверяет есть ли на вас эта аура.
RemoveAura() снимает эту ауру.

Так же я добавил player:SendBroadcastMessage объяснять что это делает я не буду. Так как это понятно наглядно.

Конечно, вы все равно должны добавить end для "if" и "function".

Итак, теперь у нас есть два intids, давайте посмотрим на нашу функцию сейчас, и добавить последнюю.

Мы просто добавили в intid 3: GossipComplete(), потому что опция стоит, чтобы закрыть окно.

Теперь посмотрим что у нас получилось.

Молодцы! Вы создали свой первый сценарий функционирования. Или, по крайней мере, с помощью этого учебника. Сохраните его как TeleporterNPC.lua и поместить его в папку scripts. Поставьте нпс и перезагрузите сервер, и наслаждайтесь вашим первым сценарием!

Таким образом, вы знаете, как использовать If и elseif но, используя следующее довольно сложно читать ну и как то однообразно;

Вместо этого, вы можете заменить 2й и 3й if на elseIf, в зависимости от ситуации. elseIf в основном удаляет последующие if и заканчивается так, что они легко читаются. Вот наглядным пример.

Как вы можете видеть, это гораздо легче читать, чем предыдущие.

Ну что же. Вот и конец этого учебника. Вторая часть будет более позже.

Так же если вы будете использовать lua скрипты с русскими символами не забываем ставить кодировку UTF-8

Всем удачного изучения этого языка.

Если у вас есть какие то либо вопросы то не стесняйтесь задавайте их.



There is nothing better than .LUA

Скрытый текст

4. А вот Scprits.lua - является местом, куда мы и помещаем скрипт.


Скрипты Neilyo и не только здесь можно покопипастить себе море полезных скриптов

Если понравился мой интерфейс - прошу миловать (ctrl+c ---> ctrl+v) - просто скопируйте всё и вставьте в .lua файл. Когда вставите у вас:
1. Пропадут грифоны по бокам.
2. Будет тёмная, на мой взгляд приятная оковка фреймов.
3. Вместо портретов будут иконки класса.
4. Если спелл не достает до противника, то на панели он будет гореть красным.
5. Станет прозрачный бэкграунд фрейма игрока.
6. При нажатии на спелл, он будет приятно помигивать


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


Интерфейс WoW (например, строка меню, окно чата и другие 2D графические элементы) и также дополнения написаны на языке Lua. Обе стороны строки — RemoveExtraSpaces и также RunScript — легальные функции и часть WoW Lua API. Но введение этой строки кода в диалоговом окне изменяет поведение интерфейса WoW.

Что делает эта команда на самом деле?

/run — команда для интерпретации следующего текста как сценария Lua.
RemoveExtraSpaces — встроенная функция, которая удаляет ненужные пробелы из текста.
RunScript — функция, которая выполняет текст в качестве кода Lua (аналогично команде /run )

Чем это опасно?

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

Временное скрытие и сохранение команды



Атакующий устанавливает новый канал передачи данных

Для того, чтобы понять цель этой команды, нужно знать что в WoW есть возможность общаться с помощью скрытого канала (локально и удаленно). Этот канал установлен через использование событий “CHAT_MSG_ADDON”.


Сценарий создает фрейм (строка 2), к которому можно установить различные свойства. Сценарий регистрирует события CHAT_MSG_ADDON с конкретным префиксом (строка 6 и 25). Только тот, кто знает выбранный префикс, может тайно управлять интерфейсом жертвы. Это все равно что пароль для бэкдор.

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

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

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

Какой вред может быть причинен?

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

Как можно себя защитить?

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

В данном примере мы говорили об атакующем персонаже в игре, кто принадлежал к популярной гильдии. Но по факту он не принадлежал к этой гильдии. Он выбрал известную гильдию и скопировал имя, заменив “L” на “I”. Возможно, Вы уже знакомы с такими методом фишинг-атак.

Кроме того, будьте осторожны при загрузке дополнений используйте защищенные и популярные веб-сайты, сохраните свои дополнения, чтобы их можно было в любой момент заменить. Возможно, что некоторые из этих обновлений могут уже содержать вредоносный код. Подобная проблема была замечена в 2014, когда так называемый “ElvUI Backdoor” был обнаружен в одном из дополнений.


Скрытый текст


Теперь перейдём к скриптам. На данный момент я использую около 20-30 скриптов, но описывать буду не все.

Для начала, как же создать скрипт? Я делаю 1 аддон и закидываю в него кучу скриптов, но для новичков советую делать всё отдельно. И так, как создать аддон?

Здесь всё прекрасно описано Будь плохим @ Играй на дефолте но там описано создание аддонов на катаклизм. Различие в создании аддонов между Пандарией и Катаклизмом - это пару циферок ^_^

1. Заходим в WoW\Interface\Addons - создаём папку, например, "Scripts"
2. Далее делаем 2 блокнотика "Scripts.lua \ Scripts.toc"


3. В Scripts.toc пишем

Мой UI (Как создать и использовать скрипт)

Многие стремятся сделать свой UI - интерфейс наиболее приятным и комфортным для игры в плане PvP \ PvE. Для начала предлагаю вам посмотреть мою сборку скриптов и аддонов, скажу сразу, не очень большой любитель аддонов, так что пользуюсь ими по минимуму.

Вот мои список аддонов:


ExctraCD - Аддон отслеживает баффы, которые скрытые. Скрытые - это все проки от талантов, тринек (аксессуаров), энчантов, нашивок.
GladiatorlosSA - Противник юзает скилл - у вас произносится в речь.
LoseControl - Позволяет легко отслеживать контролли, которые лежат не Вашем персонаже.
SafeQueue - Убирает кнопку ""Leave Queue" при проке арены.
sArena - Замена аддона Gladius (т.к. Гладиус для меня не так хорошо смотрится, как данный аддон, можно сказать это вовсе не аддон, а просто доработанная замена скрипту)
SaySapped - В то время, когда Вас сапнули в чат будет писаться "Sapped"
И мои скрипты - О них чуть попозже.

Как всё это у меня смотрится -

Читайте также: