Был замечательный ресурс 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)
Код:
## 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
Плугин ничего не делает, только демонстрирует себя в списке плуагинов. В папке с плагином лежат два пустых файла test.lua и test.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>
Но мы так делать не будем. Я вообще предлагаю использовать механику xml файлов только для двух вещей - бинды и зависимости. Вся информация о тегах и использовании потоков XML в исполняющей машине доступна по ссылкам выше.Для визуального построения XML описаний интерфейса есть такая плюшка
Код и технические особенности
Тут несколько соображений. Во-первых, язык 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
Код:
## 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
test_api.lua
Код:
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)
Работает. Исправно показывает текущие координаты, двигается мышкой. Показывает имя зоны. Занимает в памяти меньше 1 килобайта :) Что неплохо бы добавить - запоминание положения фрейма, чтобы при следующей загрузке обнаружить его там же, где и ожидалось, а не в позиции по умолчанию. Про сохранение переменных средствами WoW API читать здесь. Что может быть непонятно в этом коде? Мы не обрабатывали никаких событий, кроме приходящего во фрейм OnUpdate.
Мы не написали ни одной невстроенной функции. Но и результат не поражает функциональностью. При этом, мы получили таки от API некую информацию (координаты, имя зоны) и отобразили ее в удобном нам (ну типа) виде на экране, чем, собственно и занимаются 98 процентов всех аддонов.
Вступаем в 21 век. Или "тетя АСЯ приехала!!!"
Я не очень ценю работу, сделанную за меня другими. Поскольку с женой предпочитаю спать самостоятельно, без помошников. Но огромное количество населения пользуется благами цивилизации, и их нелепо за это считать неполноценными. Итак, базовая точка сейчас у нас - [http://www.wowace.com/wiki/Main_Page]. Библиотек много. Очень много. Некоторые из них даже имеют документацию, да и смешно говорить о отсутствии информации в случае библиотек с открытым кодом, будь то ACE или STL.
Традиционно напишем что-нибудь работающее, в случае с ACE это гораздо нагляднее любых разговоров.
test_ace.toc
Код:
## 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
test_ace.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 аддона, с одной стороны характеризующего хотя бы основы библиотеки (сериализацию, фреймворк, локализации, смешанные стили), а с другой стороны этот аддон должен быть прозрачно-учебным кодом, в идеале помещающимся в страницу кода, так вот, так как я не могу пока придумать такого примера, остановимся на этом.
Можно взять любой асе аддон, и посмотреть его код. Результат для обучения будет неплохой, я думаю.