Был замечательный ресурс woh.ru, но канул в Лету.
Покопавшись у себя и в инете нашел статью для новичков, которая была написана Don Caban.
Пост делаю так, как он был, без изменений, поэтому могут быть побиты ссылки, т.к. статья была написано довольно давно.
Статья довольно интересная, как по мне, надеюсь кому-то пригодится.
На вопросы начинающих аддонописателей если смогу, отвечу. Надеюсь поможет еще Alt. ))
Перепечатка статьи Don Caban
"На колоссальной четырехъярусной террасе вдова коллежского асессора Агриппина Саввишна угощала Аполлона Никитича,
местного подьячего, винегретом с моллюсками и можжевеловым вареньем."(c)^^
Преквест.
Долго думал, что может называться гайдом по программированию аддонов для WoW. И в результате всех этих размышлений пришел примерно к такой концепции - человека далекого от программирования научить все равно не получится, а вот программисту (или, что чаще бывает - человеку, считающему себя таковым) помочь вполне возможно. Отсюда, краткий план таков :
инструментальные средства
структура аддона
WoW API
где брать информацию?
что делать, если не работает?
Самые главные вопросы - зачем вообще писать аддоны, какие аддоны надо бы писать и почему выбор библиотеки абсолютно неважен - так вот, все это мы обсуждать не будем.
Инструментальные средства.
Вообще то, из по-настоящему необходимых вещей вам понадобится любой текстовый редактор. То есть все, что способно запомнить текст, ктоторый вы набрали и сохранить его в файле, вполне может считаться редактором. Для комфорта можно использовать редакторы с подсветкой lua'шного синтаксиса, с автозаполнением и прочими радостями. В конце-концов на дворе 21 век. Так же, для особых сибаритов вполне возможно использовать любой визуальный редактор xml. Так же неплохо бы забиндить макрос /script ReloadUI() на кнопку, он вам понадобится.
Сложность (точнее, специфика) всего этого дела такова, что исполняющей машиной для скрипта, который вы пишете является сам WoW, софтинка немаленькая, требующая интернета и памяти внутри вашего компутера. Считайте, что это компилятор, с логом ошибок времени исполнения или просто исполняющая среда, интерпретатор, каковым он и является.
Файлы скрипта можно править во время работы WoW, после ReloadUI вы увидете, как работает ваша новая версия (и новые ошибки, возможно). Еще одна неочивидная сложность - без особых телодвижений не получится сэмулировать условия для проверки вашего скрипта. То есть, если ваш скрипт считает что-то во время боя, вам при отладке придется имеено что вступать в бой.
(Есть, конечно WoWBench, попытка сэмулировать WoWAPI в оффлайне, возможно вам это средство поможет.)
Редакторы кода :
http://www.wowwiki.com/Lua_editors
XML редакторы :
http://www.philo.de/xmledit/
http://www.xmlfox.com/download.htm
http://symbolclick.com/
Разные плюшки :
http://www.wowwiki.com/UI_FAQ/AddOn_Author_Resources
Структура аддона.
Аддон, как структура может состоять из двух типов файлов (*.lua и *.xml) и обязательно содержит файл управления *.toc.
Честно говоря, ничего не делающий аддон может состоять из одного файла *.toc. В файлах xml обычно содержаться определения интерфейса (окон, кнопок, виджетов управления), скриптов, биндов…
В файлах lua - код вызовов WoW API, пользовательские функции, логика работы аддона. Надо понимать, что используя файлы определения интерфейса исполняющая машина порождает те же самые вызовы WoWAPI, что и пользовательский код. Глобальное адресное пространство является разделяемым, поэтому все переменные, функции и любые объекты не объявленные, как локальные, находятся в глобальной области видимости и могут быть использованы из любой единицы интерпретации.
То есть, при определении бинда в файле xml вы вполне можете использовать привязку функции, определенной в lua файле.
Заголовочный файл.
Формат toc файла
Информация, содержащаяся в файле управления во-первых рассказывает исполняющей системе о файловой структуре нашего аддона и, во-вторых доступна из исполняющей среды во время выполнения (к примеру, номер версии, метатеги)
Вот наш управляющий файл (test.toc)
Плугин ничего не делает, только демонстрирует себя в списке плуагинов. В папке с плагином лежат два пустых файла test.lua и test.xml для последующих экспериментов.Код:## Interface: 20400 ## Title: |cff7fff7f SUPER |cffffff2f DUPER|r ## Author: Don Kaban ## Version: 0.1 ## X-eMail: k.shabordin@gmail.com ## Notes: example plugin for WordOfWarcraft.ru forum test.xml test.lua
Файлы определений интерфейса.
Основная информация
Вообще то можно поступить "правильно" (можно и без кавычек) и написать что-то типа :
Но мы так делать не будем. Я вообще предлагаю использовать механику xml файлов только для двух вещей - бинды и зависимости. Вся информация о тегах и использовании потоков XML в исполняющей машине доступна по ссылкам выше.Для визуального построения XML описаний интерфейса есть такая плюшкаКод:<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/C:\Projects\WoW\Bin\Interface\FrameXML\UI.xsd"> <Script file="test.lua"/> <Frame name="test"> <Scripts> <OnLoad> Test_OnLoad(); </OnLoad> <OnEvent> Test_OnEvent(event); </OnEvent> </Scripts> </Frame> </Ui>
Код и технические особенности
Тут несколько соображений. Во-первых, язык Lua неплохо бы хоть поверхностно знать. В помощь -
http://www.lua.org/manual/5.1/
http://www.lua.ru/doc - на языке Пушкина и Путина
http://www.wowace.com/wiki/Coding_Tips - прочитать обязательно
Во-вторых, местный MSDN расположен здесь - http://www.wowwiki.com/World_of_Warcraft_API, поиск не очень, но это лучшее, что у нас есть.
WoW - это event driven, то есть управляемое событиями приложение. В общем случае вы пишете обработчики, регистрируете их, а исполняющая среда дергает их калбеком по приходу события. Важен также порядок обработки событий. Он таков :
Обработка всех нажатий клавиатурных кнопок, нажатий кнопок мыши. (то есть всего ввода)
Выполнение OnUpdate для каждого видимого фрейма.
Перерисовка всего UI поверх отрендеренной картинки мира.
Еще раз - при любых вопросах жать сюда - http://www.wowwiki.com/Interface_Customization, информации много, есть примеры.
Первый блин.
Есть традиции, не нами придуманные. Не будем их нарушать :
test.lua
Работает. Давайте сообразим что-то хоть на грамм пополезнее :Код:local print = function(msg) ChatFrame1:AddMessage(tostring(msg)) end print "Hello, fucking world!"
test_api.toc
test_api.luaКод:## Interface: 20400 ## Title: |cff7fff7f API |cffffff2f TEST|r ## Version: 0.1 ## Author: Don Kaban ## X-eMail: k.shabordin@gmail.com ## Notes: example API plugin for WordOfWarcraft.ru forum test_api.lua
Работает. Исправно показывает текущие координаты, двигается мышкой. Показывает имя зоны. Занимает в памяти меньше 1 килобайта :) Что неплохо бы добавить - запоминание положения фрейма, чтобы при следующей загрузке обнаружить его там же, где и ожидалось, а не в позиции по умолчанию. Про сохранение переменных средствами WoW API читать здесь. Что может быть непонятно в этом коде? Мы не обрабатывали никаких событий, кроме приходящего во фрейм OnUpdate.Код:local frame_x = 0 -- смещение фрейма по x от центра экрана local frame_y = -300 -- смещение фрейма по y от центра экрана local frame_w = 300 -- ширина фрейма local frame_h = 20 -- высота фрейма frame = CreateFrame("Frame", "coord", UIParent) -- создаем именованный фрейм frame:SetWidth(frame_w) -- задаем его ширину и высоту frame:SetHeight(frame_h) frame.text=frame:CreateFontString(nil,"OVERLAY","GameFontNormal") -- создаем объект FontString frame.text:SetAllPoints(frame) -- привязываем размеры строки к размеру нашего фрейма frame:SetPoint("CENTER",UIParent,"CENTER",frame_x,frame_y) - размещаем наш фрейм frame:EnableMouse(true) - разрешаем обработку мыши во фрейме frame:SetMovable(true) - разрешаем передвигать фрейм frame:RegisterForDrag("LeftButton") -- регистрируем нажатие левой кнопки мыши для передвижения фрейма frame:Show() -- показываем фрейм frame:SetScript("OnDragStart", function(self) -- задаем функцию обработки перемещения self:StartMoving() -- end) -- frame:SetScript("OnDragStop", function(self) -- задаем функцию прекращения перемещения self:StopMovingOrSizing() end) frame:SetScript("OnUpdate", function(self) -- задаем функцию перерисовки фрейма local posx,posy=GetPlayerMapPosition("player") -- получили текущие координаты игрока self.text:SetText(floor(posx*100)..","..floor(posy*100).." [".. GetZoneText().."]") -- выводим локацию и координаты end)
Мы не написали ни одной невстроенной функции. Но и результат не поражает функциональностью. При этом, мы получили таки от API некую информацию (координаты, имя зоны) и отобразили ее в удобном нам (ну типа) виде на экране, чем, собственно и занимаются 98 процентов всех аддонов.
Вступаем в 21 век. Или "тетя АСЯ приехала!!!"
Я не очень ценю работу, сделанную за меня другими. Поскольку с женой предпочитаю спать самостоятельно, без помошников. Но огромное количество населения пользуется благами цивилизации, и их нелепо за это считать неполноценными. Итак, базовая точка сейчас у нас - [http://www.wowace.com/wiki/Main_Page]. Библиотек много. Очень много. Некоторые из них даже имеют документацию, да и смешно говорить о отсутствии информации в случае библиотек с открытым кодом, будь то ACE или STL.
Традиционно напишем что-нибудь работающее, в случае с ACE это гораздо нагляднее любых разговоров.
test_ace.toc
test_ace.luaКод:## Interface: 20400 ## Title: |cff7fff7f ACE |cffffff2f TEST|r ## Version: 0.1 ## Author: Don Kaban ## X-eMail: k.shabordin@gmail.com ## Notes: example ACE plugin for WordOfWarcraft.ru forum Libs\AceLibrary\AceLibrary.lua Libs\AceOO-2.0\AceOO-2.0.lua Libs\AceAddon-2.0\AceAddon-2.0.lua Libs\AceDB-2.0\AceDB-2.0.lua Libs\AceConsole-2.0\AceConsole-2.0.lua Libs\AceEvent-2.0\AceEvent-2.0.lua
Да. Нам придется тем или иным способом сказать, что мы будем использовать библиотеку. Либо заданием тега зависимостей, либо созданием файла embeds.xml, либо просто погрузить как здесь.
По сложившийся традиции первый блин :
Работает. Было бы странно, если бы не работало :)Код:my_addon = AceLibrary("AceAddon-2.0"):new("AceConsole-2.0") function my_addon:OnEnable() self:Print("Hello, fucking world!") end
(Тут возникает одна сложность - чтобы не писать лишнего кода надо бы знать функциональность если не всех, то хотя бы распространенных библиотек. Очень помогает вдумчиво читать все здесь :
http://www.wowace.com/wiki/Category:API_Documentation
Так как я не могу придумать идеи ACE аддона, с одной стороны характеризующего хотя бы основы библиотеки (сериализацию, фреймворк, локализации, смешанные стили), а с другой стороны этот аддон должен быть прозрачно-учебным кодом, в идеале помещающимся в страницу кода, так вот, так как я не могу пока придумать такого примера, остановимся на этом.
Можно взять любой асе аддон, и посмотреть его код. Результат для обучения будет неплохой, я думаю.





