Как написать аддон для ВоВ. Пишем автоинвайтер.
|
В университете меня очень напрягало отсутствие прикладной состовляющей некоторых наук. Т.е. идёт очень большое количество теории и абсолютно не ясно, как и где это можно применить на практике. Много позже я сталкивался в работе или в жизни с реальными примерами и брал в руки учебник. Надо заметить - учёба шла значительно быстрее. Посему, я решил отойти от примера "Hello World" и сразу сделать что-то полезное в реальной жизни. Готовый автоинвайтер можно скачать тут:
Техническое заданиеВсем, кто часто собирал группы, или рейды может быть полезен аддон, который мы хотим написать. В бытность РЛ-ом, мне очень быстро надоело приглашать людей в рейд руками и я пользовался замечательным аддоном CT_Mod в котором была функция приглашения по висперу. Т.е. вы задаете ключевое слово, и если получаете его шепотом от игрока, то игрок автоматически приглашается в группу. Давайте напишем продвинутый вариант такого аддона. Что же он должен уметь:
Создаём TOC файлМожно, конечно, поизгаляться и обойтись без XML файла, а, иногда, без LUA файла, но мы будем делать всё по правилам. В нашем аддоне будет и XML и LUA файл.
Таким образом, наш аддон будет называться autoinviter и будет состоять из трех файлов: autoinviter.toc, autoinviter.lua и autoinviter.xml. Переменные мы будем хранить на уровне учетных записей в таблице magics. Т.о. "волшебные слова" для инвайта будут общими для всех персонажей нашей учетной записи. Создаём XML файлВ нашем аддоне не будет графического интерфейса, будет только интерфейс командной строки. Так что XML файл и фрейм нам нужны лишь формально, для обработки событий. Да, небольшое отступление, касающееся именования переменных и функций. В аддонах ВоВ принято соглашение называть глобальные функции и переменные как НазваниеАддона_ФункцияИлиПеременная. Это позволяет избежать пересечения имён, поскольку работают аддоны в общем глобальном пространстве имен. Локальные переменные и функции для вашего аддона вы можете называть как хотите. Итак, создадим файл:
Мы создали фрейм, который обрабатывает два события виджетов: onLoad - срабатывающий при загрузке аддона и регистрирующий для нашего аддона обработку события VARIABLES_LOADED. onEvent - который обрабатывает два игровых события - VARIABLES_LOADED (срабатывающий после загрузки переменных) и CHAT_MSG_WHISPER (срабатывающий при получении шепота). Обработчик этого события вызывает две функции-обработчика: autoinviter_Init и autoinviter_Whisper. Первая вызывается без параметров, второй передаются все параметры события. Интерфейс и данныеПеред написанием кода аддона, неплохо бы определиться с интерфейсом пользователя и форматом хранения данных. Чтобы не плодить слэш команды, давайте выберем одну команду для нашего аддона, например /acm, и сделаем управление им примерно следующим:
Где команда - это опциональная команда для аддона, в нашем случае их будет две:
А ключевое слово - это "волшебное слово" которое мы хотим включить или выключить. Данные у нас хранятся в таблице magics. Возьмём для неё следующую структуру:
Таким образом, список слов у нас будет храниться в таблице, или ассоциативном массиве, что очень удобно для наших целей. LUA: Инициализация аддонаПри загрузке нашего аддона, первой функцией которая будет вызвана, будет autoinviter_Init, которая должна проинициализировать таблицу magic при первом запуске и зарегистрировать обработку слэш команды.
Данная функция проверяет, что если таблица magics у нас не инициализирована, то функция инициализирует её, выводя соответствующее сообщение. По умолчанию, аддон будет понимать только шепот "inv". Затем, мы регистрируем слэш команду "/acm" и говорим игровому клиенту, что обработчиком нашей слэш команды будет функция autoinviter_Handler. И после этого, мы регистрируем событие CHAT_MSG_WHISPER для обработки нашего аддона. Т.о. это событие будет нами обрабатываться только после инициализации, но не до неё. LUA: Обработчик слэш командТеперь давайте напишем диспетчера для слеш команды нашего аддона, функцию autoinviter_Handler.
В начале, мы приводим текст после /acm к нижнему регистру, чтобы команды и слова были у нас регистронезависимыми. Дальше идёт простое ветвление в зависимости от текста команды. Если после /acm ничего не написано, или идет команда help, то выводится подсказка по использованию аддона. Если идет команда list, то выводится список известных аддону слов из таблицы magics. В противном случае, текст после /acm считается волшебным словом. И, если оно уже есть в таблице magics, то слово удаляется оттуда, в противном случае - добавляется. С соответствующим подтверждением в чате. LUA: Обработчик шепотовНу и в завершении написания аддона, добавим самую маленькую и самую важную функцию - которая будет анализировать получаемые шепоты и приглашать людей в группу, а именно - autoinviter_Whisper.
Параметрами события CHAT_MSG_WHISPER являются message и character - сообщение и имя персонажа, от которого оно получено. Мы проверяем, есть ли текст сообщения в таблице magics и, если есть, приглашаем человека в группу, отправив ему также сообщение об автоматическом приглашении. Вот собственно и всё. |

Данная статья является продолжением цикла статей об аддонах. Предыдущая часть: 


