|
Учимся делать аддоны
"На колоссальной четырехъярусной террасе вдова коллежского асессора Агриппина Саввишна угощала Аполлона Никитича, местного подьячего, винегретом с моллюсками и можжевеловым вареньем."(c)
1. Преквест.
Долго думал, что может называться гайдом по программированию аддонов для WoW. И в результате всех этих размышлений пришел примерно к такой концепции - человека далекого от программирования научить все равно не получится, а вот программисту помочь вполне возможно. Отсюда, краткий план таков : инструментальные средства, стркутура аддона, WoW API, где брать информацию, что делать, если не работает, какие есть библиотеки.
Самые главные вопросы - зачем вообще писать аддоны, какие аддоны надо бы писать и почему выбор библиотеки абсолютно неважен - так вот, все это мы обсуждать не будем. 2. Инструментальные средства.
Вообще то, из по-настоящему необходимых вещей вам понадобится любой текстовый редактор. То есть все, что способно запомнить текст, ктоторый вы набрали и сохранить его в файле, вполне может считаться редактором.
Для комфорта можно использовать редакторы с подсветкой lua'шного синтаксиса, с автозаполнением и прочими радостями. В конце-концов на дворе 21 век. Так же, для особых сибаритов вполне возможно использовать любой визуальный редактор xml. Так же неплохо бы забиндить макрос /script ReloadUI(); на кнопку, он вам понадобится.
Сложность (точнее, специфика) всего этого дела такова, что исполняющей машиной для скрипта, который вы пишете является сам WoW, софтинка немаленькая, требующая интернета и памяти внутри вашего компутера. Считайте, что это компилятор, с логом ошибок времени исполнения или просто исполняющей средой, интерпретатором, каковым он и является.
Файлы скрипта можно править во время работы WoW, после ReloadUI вы увидете, как работает ваша новая версия (и новыеошибки, возможно).
Еще одна неочивидная сложность - без особых телодвижений не получится сэмулировать условия для проверки вашего скрипта. То есть, если ваш скрипт считает что-то во время боя, вам при отладке придется имеено что вступать в бой.
(Есть, конечно WoWBench http://www.wowwiki.com/WoWBench, попытка сэмулировать WoWAPI в оффлайне, возможно вам это средство поможет.)
Редакторы кода : http://www.wowwiki.com/Lua_editors XML редакторы : http://www.xmlfox.com/download.htm http://symbolclick.com/ Разные плюшки : http://www.wowwiki.com/UI_FAQ/AddOn_Author_Resources 3. Структура аддона.
Аддон, как структура может состоять из двух типов файлов (*.lua и *.xml) и обязательно содержит файл управления *.toc. Честно говоря, ничего не делающий аддон может состоять из одного файла *.toc.
В файлах xml обычно содержаться определения интерфейса (окон, кнопок, виджетов управления), скриптов, биндов...
D файлах lua - код вызовов WoW API, пользовательские функции, логика работы аддона. Надо понимать, что используя файлы определения интерфейса исполняющая машина порождает те же самые вызовы WoWAPI, что и пользовательский код.
Глобальное адресное пространство является разделяемым, поэтому все переменные, функции и любые объекты не объявленные, как локальные, находятся в глобальной области видимости и могут быть использованы из любой еденицы интерпретации.
То есть, при определении бинда в файле xml вы вполне можете использовать привязку функции, определенной в lua файле 4. Заголовочный файл.
Формат 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 для последующих экспериментов. 5. Файлы определений интерфейса.
Основная информация Widget API
Вообще то можно поступить "правильно" (можно и без кавычек) и написать что-то типа : Код:
<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 описаний интерфейса есть такая плюшка : WoW UI Designer 6. Код и технические особенности
Тут несколько соображений. Во-первых, язык 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, то есть управляемое событиями приложение. В общем случае вы пишете обработчики, регистрируете их, а исполняющая среда дергает их калбеком по приходу события. Важен также порядок обработки событий. Он таков :
1.Обработка всех нажатий клавиатурных кнопок, нажатий кнопок мыши. (то есть всего ввода) 2.Выполнение OnUpdate для каждого видимого фрейма. 3.Перерисовка всего UI поверх отрендеренной картинки мира.
Еще раз - при любых вопросах жать сюда, информации много, есть примеры. 7. Первый блин
Есть традиции, не нами придуманные. Не будем их нарушать : 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 local frame_y = -300 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") frame.text:SetAllPoints(frame) frame:SetClampedToScreen(true) frame:SetPoint("CENTER",UIParent,"CENTER",frame_x,frame_y) frame:EnableMouse(true) frame:SetMovable(true) frame:RegisterForDrag("LeftButton") frame:Show() frame:SetScript("OnDragStart", function(this) this:StartMoving() end) frame:SetScript("OnDragStop", function(this) this:StopMovingOrSizing() frame_x,frame_y = this:GetCenter() frame_x = frame_x - GetScreenWidth() / 2 frame_y = frame_y - GetScreenHeight() / 2 this:ClearAllPoints() this:SetPoint("CENTER",UIParent,"CENTER",frame_x,frame_y) end) frame:SetScript("OnUpdate", function(this) local posx,posy=GetPlayerMapPosition("player") this.text:SetText(floor(posx*100)..","..floor(posy*100).." [".. GetZoneText().."]") end)
Работает. Исправно показывает текущие координаты, двигается мышкой. Показывает имя зоны. Занимает в памяти меньше 1 килобайта :) Что неплохо бы добавить - запоминание положения фрейма, чтобы при следующей загрузке обнаружить его там же, где и ожидалось, а не в позиции по умолчанию.
Про сохранение переменных средствами WoW API читать здесь http://www.wowwiki.com/HOWTO:_Save_V..._Game_Sessions
Что может быть непонятно в этом коде? Мы не обрабатывали никаких событий, кроме приходящего во фрейм OnUpdate.
Мы не написали ни одной невстроенной функции. Но и результат не поражает функциональностью. При этом, мы получили таки от API некую информацию (координаты, имя зоны) и отобразили ее в удобном нам (ну типа) виде на экране, чем, собственно и занимаются 98 процентов всех аддонов. 8. Вступаем в 21 век.
Я не очень ценю работу, сделанную за меня другими. Поскольку с женой предпочитаю спать самостоятельно, без помошников. Но огромное количество населения пользуется благами цивилизации, и их нелепо за это считать неполноценными.
Итак, базовая точка сейчас у нас - http://www.wowace.com/wiki/Main_Page
Библиотек много. Очень много.Некоторые из них даже имеют документацию, да и смешно говорить о отсутствии информации в случае библиотек с открытым кодом, будь то ACE или STL.
(Тут возникает одна сложность - чтобы не писать лишнего кода надо бы знать функциональность если не всех, то хотя бы распространенных библиотек. Очень помогает вдумчиво читать все здесь :
http://www.wowace.com/wiki/Category:API_Documentation
Так как мне пока не удалось придумать идеи ACE аддона, с одной стороны характеризующего хотя бы основы библиотеки (сериализацию, фреймворк, локализации, смешанные стили), а с другой стороны этот аддон должен быть прозрачно-учебным кодом, в идеале помещающимся в страницу кода, так вот, так как я не могу пока придумать такого примера, остановимся на этом.
Можно взять любой асе аддон, и посмотреть его код. Результат для обучения будет неплохой, я думаю.
Если есть конкретные вопросы или идеи, требующие реализации - всегда пожалуйста, будем писать вторую серию, третью и т.д.
Буду рад, если все это кому-то помогло.
|
|