Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

ШАБЛОН для создания своего аддона


icreator

Рекомендуемые сообщения

если вы решились создать аддон то проще всего:

взять уже готовый шаблон, в котором есть меню настроек и команд и уже описаны программы для взаимодействия в другими аддонами, такими как AddonsMenu, AOpanel, AddonsMeneger

Такой аддон-шаблон уже есть в аддоне AddonsTools - в архиве Example3.zip. Достаточно архив распаковать в папку /Addons и переименовать:

- его папку

- тэг <Name> в файле AddonDesc.(UIAddon).xdb

- тэг <Name> в файле GUI/MainForm.(WidgetForm).xdb

Важно: новое имя папки и имя в теге <Name> должны совпадать

Перегрузите клиент игры и вы увидите новый аддон с меню настроек и команд. Останется лишь вставить свой код в шаблон

Структура шаблона такая:

1. Все общие переменные (массив настроек) описывается в Globals.lua

2. Обработка интерфейса задается в GUI.lua

3. Основные программы аддона записываем в Main.lua

4. в AddonsTools_Support.lua вставляем свои данные для передачи их другим аддонам-менеджерам

Важно - исправлять файлы *.lua можно в любом текстовом редакторе не меняющем кодировку (UTF-8) - например обычный NotePad.

Вашему аддону будет доступен набор готовых описателей часто используемых виджетов - глобальная переменная dsc

чтобы создать свой виджет, например кнопку, достаточно в коде записать:

-- WCD(descr, name, parent, place, show )
local wtButton1 = WCD( dsc.Button, "myName_btn", wtParent, { alignX = 3, alignY = 3 }, true )

К тому же вы можете использовать библиотеку ScriptLIB.lua из AddonsTools - эта библиотека уже подключена к вашему шаблону.

Например очень полезные функции для отладки:

LogToChat("text") --- выводит в чат игры текст

exObj("text", any_object, meta, exlude_list ) --- выводит в лог mods.txt структуру объекта, его значения, функции...

вид вашего меню в будет такой:

как вам такая раскраска - используя библиотеку menuCls3

post-3-0-02129500-1358631088_thumb.jpg

Описание шаблона Example3.zip

Описание меню menuCls3.lua

Ссылка на комментарий
Поделиться на другие сайты

создание откликов на события

после того как шаблон заработал - создаем обработчики событий - именно они обычно выполняют все действия в аддонах

например при смене цели писать в чат имя выбраного юнита

вставляем в текст Main.lua до кода

--------------------------------------------------------------
--- it is a COMMON functions, its need to define
--------------------------------------------------------------
function toConfig() --------------- SAVE TO CONFIG
...
...

вот такую простую функцию обработки события (имена событиф в АПИ даны)

onEvent.EVENT_AVATAR_PRIMARY_TARGET_CHANGED = function ( pars )
local unitId = avatar.GetTarget()
local name = "-nil-"
if not unitId then
else
name = FromWS( object.GetName( unitId ) )
end
LogToChat( name )
end

Ссылка на комментарий
Поделиться на другие сайты

ввод настроек в обработку событий

если вы хотите сделать настраиваемое событие то задаем настройку в меню. Например чтобы можно было включать/выключать обработку события, которое мы создали выше,, в файле GUI.lua в описании меню, там где код:

local strucMenu =
{
...
...

вставляем свою запись:

{ name = "my_targ_log", label = "My Target LOG to CHAT",
type = "_txt", valLabels = names, listVals = onoff },

после чего меняем свою процедуру в файле Main.lua так:

onEvent.EVENT_AVATAR_PRIMARY_TARGET_CHANGED = function ( pars )
--- проверка на разрешение работу из параметров, заданных через меню
if get_PS("my_targ_log") == OFF then return end
local unitId = avatar.GetTarget()
local name = "-nil-"
if not unitId then
else
name = FromWS( object.GetName( unitId ) )
end
LogToChat( name )
end

теперь если у вас в настройках стоит OFF (Выкл) то данная процедура не будет выполняться при появлении заданного события

Ссылка на комментарий
Поделиться на другие сайты

если вы хотите свой виджет создать и ловить нажатия кнопок по нему то нужно добавить в конец иницализации CUI создание этого виджета и задать обработчик для реакций виджетов:

widgetInit()
RegisterReactionHandlers( onReact )

вставить это в конце

function GUIinit()

файла GUI.lua

а чтобы вызвать свой виджет зададим в меню команду:

 { name = "show", label = "Show Main Panel", onclick = showMPanel },

тогда инициализация GUI у нас будет такая:

function GUIinit()
local pr = get_PS( "mfPrior" )
if mainForm and pr then mainForm:SetPriority( pr ) end
local strucMenu =
{
 { token = "_", label = "COMMANDS", }, --- создать разделитель
 { name = "load", label = "Load Settings", onclick = fromConfig }, --- создать пункт меню
 { name = "save", label = "Save Settings", onclick = toConfig },
 { name = "show", label = "Show Main Panel", onclick = showMPanel },
 { token = "_", label = "SETTINGS", },
...
...
...
 { token = "_", label = "", },
 { token = "_3", label = "------***------", },
 { name = "prior", label = "Inteface Priority", type = "_edl", chars=5 },
 { name = "reset", label = "Reset to Config.txt", onclick = reset_PS },
}
mnu = menu{ strucMenu = strucMenu, priority = 500, mouse_overRun = true, fadeOn = 100, fadeOff = 600,
 valGet = valGet, --- функция для получения значений для полей меню
 labelShapes = L, --- просто локализация
 valOnSet = valOnSet, --- функция, которая запомнит изменения сделанные пользователем и выполняет соотвествующие реакции
 valFormats = valFormats, --- форматы представления (цвет шрифт...) для разных значений
 valShapes = L, --- просто локализация
 itemSizeX = 300,
}
mnu:init({})
DnD:Init( mnu.wtMenu, mnu.wtMenu, false)
widgetInit()
RegisterReactionHandlers( onReact )
end

Ссылка на комментарий
Поделиться на другие сайты

допустим сама инициализация виджета будет такая:

--- создадим виджет на лету из описаний виджетов
local function widgetInit()
local w, wBase, n, p, pBase, txt
wtMainPanel =  WCD(dsc.Menu, "MainPanel" , nil, { sizeX = 300, sizeY = 300}, false )
w = wtMainPanel
--- зададим ДнД - без указания оригинального номера - благодаря DnD_ic.lua
DnD:Init(w, w, true )
wtMess = WCD(dsc.Text, "Mess", w, { alignX = 3, posX=35, highPosX = 35, sizeY = 100, alignY = 2 }, true )
wtMess:SetMultiline( true ) wtMess:SetWrapText( true ) wtMess:SetEllipsis( false )
wtStatusLine = WCD(dsc.Text, "StatusLine", w, { alignX = 3, posX=15, highPosX = 15, sizeY = 30, alignY=1, highPosY=60 }, true )
--- wtSetVal - функция определяет тип виджета по концовке в названии: _txt(по умолчанию) _btn _chk _mnu и т.д. -see in ScriptLIB
--- и присваивает значение в соотсвествии с типом
wtSetVal(wtMess, L("type any message here ... its a mess khk jh kjhkjhkjhk hkjh kjhkjh kjh kjhkjh kj"))
wtSetVal(wtStatusLine, "this is STATUS LINE")
wtRun = WCD(dsc.Button, "Run_btn", w, { alignX = 0, posX = 20, alignY=1, highPos=20}, true )
 wtSetVal(wtRun, L("RUN"))
wtStop = WCD(dsc.Button, "Stop_btn", w,  { alignX = 1, highPosX = 20, alignY=1, highPos=20}, true )
 wtSetVal(wtStop, L("STOP"))
wtClose = WCD(dsc.ButtonCornerCross, nil, w,  nil, true )
wtRandInput = WCD(dsc.EditLineNum,"RandInput_eld", w, { alignX = 0, posX = 20, alignY=0, pos=30}, true )
wtSetVal(wtRandInput, "2")
n = WCD( dsc.Check, "cristal_chk", w, { posX = 20, posY = 40}, true )
n:SetVariant( 1 )
wtCheck = n
wBase = n
n = WCD( dsc.Text, "cristal_txt", w, { posX = 20, posY = 40, sizeX = 100, sizeY = 30}, true )
n:SetFormat(ToWS("<html alignx='left' fontsize='14'><r name='value'/></html>"))
wtSetVal(n,L("in CRI"))
--- прицепляет к заданному виджету (как к базе) - чтобы на надо было следить за его положением.
--- See also wtChain, wtAttach, wtAttRight, wtAttLeft
wtAttRight( n, wBase, 5 )
n = WCD(dsc.Text, "calcCost_txt", w, { sizeX = 200, sizeY = 30, posX = 50, alignX = 0 }, true)
wtAttach(n, wtCheck, 0, 30)
n:SetFormat(ToWS("<html alignx='center' fontsize='16'><r name='rate1'/>" ..
 "<body fontsize='14'><r name='rate1m'/></body>" ..
 "  /  <r name='rate2'/>" ..
 "<body fontsize='14'><r name='rate2m'/></body>" ..
 "</html>" ))
n:SetVal("rate1", ToWS( "3" ) )
n:SetVal("rate1m", ToWS( 14 .."" ) )
n:SetVal("rate2", ToWS( "".. 22 ) )
n:SetVal("rate2m", ToWS( "01" ) )

end

Ссылка на комментарий
Поделиться на другие сайты

а обработчик нажатий на виджет (реакций виджета) и функция открывание виджета из меню будут такие:

---- пример как использовать библиотеку Script.LIB
--- на примере создания окна из аддона AucEDSman
local wtMainPanel, wtMess, wtStatusLine, wtRun, wtStop, wtClose, wtRandInput, wtCheck
local function showMPanel()
wtMainPanel:Show ( not wtMainPanel:IsVisible())
end
--- какие реакции у виджетов, созданых через описателив dsc можно посмотреть в файде AddonsTools/Scripts/menuCls3.lua
--- тут обрабатывам только нажатие мышки
onReact.mouse_left_click = function ( pars )
local name = pars.widget:GetName()
local IID = pars.widget:GetInstanceId()
if false then
elseif IID == wtRun:GetInstanceId() then
 wtSetVal( wtStatusLine, L("I'd go to RUN"))
elseif IID == wtStop:GetInstanceId() then
 wtSetVal( wtStatusLine, L("I'd STOP"))
elseif IID == wtClose:GetInstanceId() then
 showMPanel()
elseif IID == wtCheck:GetInstanceId() then
 local b = pars.widget:GetVariant() == 1
 if pars.widget:GetVariantCount() > 1 then
  pars.widget:SetVariant( b and 0 or 1 )
 end
 wtSetVal( W("cristal_txt", wtMainPanel), "in CRI" .. ( b and "+++" or "---" ) )
end
end

получим вот такой виджет:

post-3-0-57981000-1357063237_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования