Новости ВоВ в Google+ Новости ВоВ в Facebook Новости ВоВ Вконтакте Новости WoWRaider.Ru через RSS Видео World of Warcraft Новости WowRaider.Ru в Твиттере Поддержите проект WowRaider.Ru

Как написать аддон для ВоВ. Пишем автоинвайтер.

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

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

Посему, я решил отойти от примера "Hello World" и сразу сделать что-то полезное в реальной жизни.

Готовый автоинвайтер можно скачать тут:

Техническое задание


Всем, кто часто собирал группы, или рейды может быть полезен аддон, который мы хотим написать. В бытность РЛ-ом, мне очень быстро надоело приглашать людей в рейд руками и я пользовался замечательным аддоном CT_Mod в котором была функция приглашения по висперу. Т.е. вы задаете ключевое слово, и если получаете его шепотом от игрока, то игрок автоматически приглашается в группу. Давайте напишем продвинутый вариант такого аддона. Что же он должен уметь:

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

Создаём TOC файл


Можно, конечно, поизгаляться и обойтись без XML файла, а, иногда, без LUA файла, но мы будем делать всё по правилам. В нашем аддоне будет и XML и LUA файл.

## Interface: 40000 ## Title: WowRaider.Ru auto inviter ## Notes: WowRaider.Ru auto inviter ## SavedVariables: magics autoinviter.xml autoinviter.lua

Таким образом, наш аддон будет называться autoinviter и будет состоять из трех файлов: autoinviter.toc, autoinviter.lua и autoinviter.xml.

Переменные мы будем хранить на уровне учетных записей в таблице magics. Т.о. "волшебные слова" для инвайта будут общими для всех персонажей нашей учетной записи.

Создаём XML файл


В нашем аддоне не будет графического интерфейса, будет только интерфейс командной строки. Так что XML файл и фрейм нам нужны лишь формально, для обработки событий.

Да, небольшое отступление, касающееся именования переменных и функций. В аддонах ВоВ принято соглашение называть глобальные функции и переменные как НазваниеАддона_ФункцияИлиПеременная. Это позволяет избежать пересечения имён, поскольку работают аддоны в общем глобальном пространстве имен. Локальные переменные и функции для вашего аддона вы можете называть как хотите.

Итак, создадим файл:

... <Frame name="autoinviter_Frame"> <onLoad> self:RegisterEvent("VARIABLES_LOADED"); </onLoad> <onEvent> if( event == "VARIABLES_LOADED" ) then autoinviter_Init() elseif( event == "CHAT_MSG_WHISPER") then autoinviter_Whisper(...) end </onEvent> </Frame> ...

Мы создали фрейм, который обрабатывает два события виджетов:

onLoad - срабатывающий при загрузке аддона и регистрирующий для нашего аддона обработку события VARIABLES_LOADED.

onEvent - который обрабатывает два игровых события - VARIABLES_LOADED (срабатывающий после загрузки переменных) и CHAT_MSG_WHISPER (срабатывающий при получении шепота).

Обработчик этого события вызывает две функции-обработчика: autoinviter_Init и autoinviter_Whisper. Первая вызывается без параметров, второй передаются все параметры события.

Интерфейс и данные


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

Чтобы не плодить слэш команды, давайте выберем одну команду для нашего аддона, например /acm, и сделаем управление им примерно следующим:

/acm [команда] [ключевое слово]

Где команда - это опциональная команда для аддона, в нашем случае их будет две:

  • help - выводит подсказку по использованию.
  • list - выводит список активных "волшебных слов".

А ключевое слово - это "волшебное слово" которое мы хотим включить или выключить.

Данные у нас хранятся в таблице magics. Возьмём для неё следующую структуру:

magics = { ["magic1"] = 1, ["magic2"] = 1, ["magic3"] = 1, ... }

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

LUA: Инициализация аддона


При загрузке нашего аддона, первой функцией которая будет вызвана, будет autoinviter_Init, которая должна проинициализировать таблицу magic при первом запуске и зарегистрировать обработку слэш команды.

function autoinviter_Init() if( not magics) then print "Первый запуск, инициализирую таблицу волшебных слов." magics = { ["inv"] = 1 } end SLASH_ACM1 = '/acm'; SlashCmdList["ACM"] = autoinviter_Handler autoinviter_Frame:RegisterEvent("CHAT_MSG_WHISPER") print "Автоинвайтер WowRaider.Ru загружен." end

Данная функция проверяет, что если таблица magics у нас не инициализирована, то функция инициализирует её, выводя соответствующее сообщение. По умолчанию, аддон будет понимать только шепот "inv".

Затем, мы регистрируем слэш команду "/acm" и говорим игровому клиенту, что обработчиком нашей слэш команды будет функция autoinviter_Handler.

И после этого, мы регистрируем событие CHAT_MSG_WHISPER для обработки нашего аддона. Т.о. это событие будет нами обрабатываться только после инициализации, но не до неё.

LUA: Обработчик слэш команд


Теперь давайте напишем диспетчера для слеш команды нашего аддона, функцию autoinviter_Handler.

function autoinviter_Handler( msg, box) msg = msg:lower() if( not msg or msg == "" or msg == "help" ) then print ("Использование:") print (" /acm [слово] включает/выключает авто-инвайт по данному слову") print (" /acm help выводет подсказку") print (" /acm list показывает список активных слов") elseif( msg == "list" ) then print ("Список волшебных слов:"); for i, _ in pairs (magics) do print( " "..i) end else if( magics[msg] ) then magics[msg] = nil print ("Волшебное слово '"..msg.."' удалено") else magics[msg] = 1 print ("Вы будете приглашать по шепоту: '"..msg.."'") end end end

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

Дальше идёт простое ветвление в зависимости от текста команды. Если после /acm ничего не написано, или идет команда help, то выводится подсказка по использованию аддона.

Если идет команда list, то выводится список известных аддону слов из таблицы magics.

В противном случае, текст после /acm считается волшебным словом. И, если оно уже есть в таблице magics, то слово удаляется оттуда, в противном случае - добавляется. С соответствующим подтверждением в чате.

LUA: Обработчик шепотов


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

function autoinviter_Whisper(...) local msg, user = ... msg = msg:lower() if( magics[msg] ) then SendChatMessage("Автоматическое приглашение аддоном.", "WHISPER", nil, user); InviteUnit(user) end end

Параметрами события CHAT_MSG_WHISPER являются message и character - сообщение и имя персонажа, от которого оно получено. Мы проверяем, есть ли текст сообщения в таблице magics и, если есть, приглашаем человека в группу, отправив ему также сообщение об автоматическом приглашении.

Вот собственно и всё.

Самые оперативные новости: RSS, , Вконтакте, Facebook, Google+

Боги мои, ассемблер в сто раз проще чем LUA!

я бы не был таким категоричным... объектно-ориентированное програмирование имеет свои плюсы... например - наглядность

Как раз в этот момент читаю СиШарп для школьников, хотя школу закончил 10 лет тому назад...

По статье сделал аддон, но он не работает. В игре нет реакции на команды /acm, acm help и /acm list. При вводе этих команд пишет "Введите /помощь, что бы получить список основных команд.", в настройках включено отображение ошибок LUA, но никаких сообщений не выдает.

Вот ссылочка на мой автоинвайтер - http://rghost.ru/4847226

Подскажите в чем может быть проблема.

Спасибо за хорошую и полезную статью. Правда после её прочтения появилось еще больше вопросов чем было "до" ) К примеру в первой статье Вы в файле.toc в первую очередь описали файлы со скриптами (.lua) и только потом.xml. В данном примере Вы делаете наоборот. В.xml файле вы регистрируете событие VARIABLES_LOADED но при этом нет регистрации события CHAT_MSG_WHISPER. Почему так? )

ЗЫ Даже если мои вопросы покажутся глупыми но Вы в состоянии будете ответить на них - буду очень рад.

Ангмарец:По статье сделал аддон, но он не работает. В игре нет реакции на команды /acm, acm help и /acm list. При вводе этих команд пишет "Введите /помощь, что бы получить список основных команд.", в настройках включено отображение ошибок LUA, но никаких сообщений не выдает.

Вот ссылочка на мой автоинвайтер - http://rghost.ru/4847226

Подскажите в чем может быть проблема.

Больше всего похоже, что аддон не загружен.

спасибо за статью! очень помогло освоиться в аддоностроении

подскажите почему и для чего нужна конструкция

SLASH_ACM1 = '/acm'

без нее не работают консольные команды.

Rapteell:Спасибо за хорошую и полезную статью. Правда после её прочтения появилось еще больше вопросов чем было "до" ) К примеру в первой статье Вы в файле.toc в первую очередь описали файлы со скриптами (.lua) и только потом.xml. В данном примере Вы делаете наоборот. В.xml файле вы регистрируете событие VARIABLES_LOADED но при этом нет регистрации события CHAT_MSG_WHISPER. Почему так? )

ЗЫ Даже если мои вопросы покажутся глупыми но Вы в состоянии будете ответить на них - буду очень рад.

просто первое что происходит после подгрузки и сборки всех файлов, это создание фреймов и события OnLoad, обработчик которого описан в xml файле.

Возникла идея написать аддон наподобие AfterСast но уже для катаклизма. И все бы хорошо, сообщения он в чат посылает. Но мне надо чтобы он выполнял защищенные действия (например /targetlasttarget). Есть ли возможность обойти защиту клиента? Ведь есть тот же хилбот, например, который тоже использует защищенные касты.

korochinskiy:Возникла идея написать аддон наподобие AfterСast но уже для катаклизма. И все бы хорошо, сообщения он в чат посылает. Но мне надо чтобы он выполнял защищенные действия (например /targetlasttarget). Есть ли возможность обойти защиту клиента? Ведь есть тот же хилбот, например, который тоже использует защищенные касты.

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