• Страница 1 из 1
  • 1
Учимся делать аддоны
pro100Witya
Старейшина форума
"На колоссальной четырехъярусной террасе вдова коллежского асессора Агриппина Саввишна угощала Аполлона Никитича,
местного подьячего, винегретом с моллюсками и можжевеловым вареньем."
©


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:EnableMo use(true)
frame:SetMovable(true)
frame:RegisterForDrag("LeftButton")
frame:Show()
frame:SetScript("OnDragStart",   function(this)    
                      t his:StartMoving()    
                      end)
frame:SetScript("OnDragStop",    function(this)     
                      this:StopMovingOrSizi ng()
                      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)
                      e nd)
frame:SetScript("OnUpdate",      function(this)
                      local posx,posy=GetPlayerMapPosition("player")
                      this.text:SetText(floor(posx*100)..","..floor(posy*100).." [".. GetZoneText().."]")
                      end)

Работает. Исправно показывает текущие координаты, двигается мышкой. Показывает имя зоны. Занимает в памяти меньше 1 килобайта smile Что неплохо бы добавить - запоминание положения фрейма, чтобы при следующей загрузке обнаружить его там же, где и ожидалось, а не в позиции по умолчанию.

Про сохранение переменных средствами 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 аддона, с одной стороны характеризующего хотя бы основы библиотеки (сериализацию, фреймворк, локализации, смешанные стили), а с другой стороны этот аддон должен быть прозрачно-учебным кодом, в идеале помещающимся в страницу кода, так вот, так как я не могу пока придумать такого примера, остановимся на этом.

Можно взять любой асе аддон, и посмотреть его код. Результат для обучения будет неплохой, я думаю.

Если есть конкретные вопросы или идеи, требующие реализации - всегда пожалуйста, будем писать вторую серию, третью и т.д.

Буду рад, если все это кому-то помогло.
(с)worldofwarcrafters.ru
shatunoff95 (профиль вк)
Сообщение # 1 отредактировано Juline - Понедельник, 10.06.2013, 20:23
Soulstice
Опытный Рыцарь смерти
Сообщение # 2 написано 10.01.2009 в 11:37
Moonkin
Рыцарь
Ты все это сам пичатал? biggrin но всеравно спасибо !
Сообщение # 3 написано 10.01.2009 в 11:44
Soulstice
Опытный Рыцарь смерти
Чтоб делать аддоны нужны руки прямые, а если даже сервер не можеш настроить, то и за аддоны братся не нужно. Это я так, для тех кто не понимает biggrin
Сообщение # 4 написано 10.01.2009 в 11:45
pro100Witya
Старейшина форума
Moonkin, открой глаза и прочитай описание темы
shatunoff95 (профиль вк)
Сообщение # 5 написано 10.01.2009 в 11:48
Mo[N]STeR
Addons
спасибо Pro100witya!
ХоТь Я уЖе Не МоДЕраТОр Как РАнЬШе И хОтЬ у МеНя 120% зАмЕчаНий и дето -50 -60 репы от одного чела ReaM я всЕраФно ТУт =)
Сообщение # 6 написано 01.02.2009 в 00:45
Noon
Капрал
Ого читать, ппц , скопирую патом посмотрю - спасибо
Поставь мне +
Участник Large Project
Сообщение # 7 написано 04.02.2009 в 17:25
Mo[N]STeR
Addons
Часа 3 их делать
ХоТь Я уЖе Не МоДЕраТОр Как РАнЬШе И хОтЬ у МеНя 120% зАмЕчаНий и дето -50 -60 репы от одного чела ReaM я всЕраФно ТУт =)
Сообщение # 8 написано 06.02.2009 в 13:36
RaSSk
Скаут
хм..)) а есть статейика как перевести аддоны на другую версию wink
помог? ставь +++
да здравствует WotLK))))
Сообщение # 9 написано 11.02.2009 в 22:05
pro100Witya
Старейшина форума
это уже делают создатели аддона, ибо много кода надо иногда поменять, чтоб зароботал на другой версии, а что-то даже дополнить.
shatunoff95 (профиль вк)
Сообщение # 10 написано 12.02.2009 в 16:26
RaSSk
Скаут
а жаль)) было бы хорошо
помог? ставь +++
да здравствует WotLK))))
Сообщение # 11 написано 12.02.2009 в 21:51
pro100Witya
Старейшина форума
было бы.....:)
shatunoff95 (профиль вк)
Сообщение # 12 написано 13.02.2009 в 19:30
SPD
Скаут
ух надо попробывать=) спс
Сообщение # 13 написано 05.03.2009 в 17:58
Jetar
Капрал
Спасибо за темку. Мне пригодилось)
Жизнь надо прожить так, что бы вспоминать было приятно, а рассказывать стыдно.....
Сообщение # 14 написано 09.03.2009 в 23:17
Rumiho
Скаут
Может кто подсказать - как сделать в аддоне проверку на наличие определённого бафа (как только баф появляется, то сразу пишется босс-варнинг сообщение (это когда жёлтым цветом посреди экрана с громким звучком)).
Сообщение # 15 написано 17.05.2009 в 23:38
KoKs_AnD_Viski
••►Хитрец◄••
pro100Witya, мда уж ! копипаст
Сообщение # 16 написано 03.10.2011 в 14:06
Nightdied
Старший Маршал
Quote (KoKs_AnD_Viski)
pro100Witya, мда уж ! копипаст

Quote (pro100Witya)
Дата: Суббота, 10.01.2009

Да Вы гений прямо! Честно. Пожалуйста, прекратите флудить и говорите только по теме.

А вообще, вполне неплохой гайд. Для начинающего (или, даже незнающего) в самый раз. Например, для меня.
Сообщение # 17 написано 06.10.2011 в 20:07
Asakura97
<<*Will Never Die*>>
Спасибо
Сообщение # 18 написано 03.01.2012 в 00:07
Goolden
Скаут
Сообщение # 19 написано 04.01.2012 в 09:43
laikan
были бы сайты с ссылок русские еще было бы отлично, и к стати многие ссылки не работают
Сообщение # 20 написано 16.03.2012 в 10:35
  • Страница 1 из 1
  • 1
Поиск: