Реклама

Поиск по сайту

Результаты поиска по тегам 'для разработчиков'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип публикаций


Категории

  • Аддоны
  • Версии доков Lua API
  • Программы и скрипты
  • Журнал "Вестник Сарнаута"

Категории и разделы

  • Общее
    • Новости и объявления
    • Журнал "Вестник Сарнаута"
    • Программы и скрипты
    • Работа сайта
    • Об игре
    • Флудилка
  • Разработка аддонов
    • Доки, ресурсы и полезная информация
    • Вопросы и ответы
    • Техподдержка
    • Форум для разработчиков

Категории

  • Объявления проекта
    • "Вестник Сарнаута"
  • Новости игры
  • Интервью
  • Особое мнение
  • Геймплей и руководства
  • Рейтинги и статистика
    • Топ 10
  • Игровой мир
  • Рассказы
  • Тесты и опросы
  • Юмор

Категории

  • "Вестник Сарнаута"

Категории

  • Маунты и окрасы

Категории

  • Allods Team posts



Фильтр по количеству...

Найдено 6 результатов

  1. LibTimer View File LibTimer is a library that allows the use of a timer function. This is intended for developers, not general players. The Allods API does not provide a way to call a function after a certain time, at least not without freezing the thread. So I've used something that the API does provide: animation of a widget. To be more exact, when we animate a widget, we can specify the duration of the animation. My library uses that. Usage is simple. First, include the file in AddonDesc.(UIAddon).xdb, in the <Scripts> section, but before your main script file. You can use the timer function like so: StartTimer(functionName,duration,arguments[...]) functionName is the name of the function that you want to execute. duration is the duration in milliseconds after wich the function will execute arguments is a list of the arguments that you want to pass to your function. You can pass any number of arguments This is an example that will run the function TestTimer 2 seconds after writing "Test Start". function TestTimer(param1, param2, param3) common.LogInfo("",param1.." "..param2.." "..param3) end common.LogInfo("","Test Start") StartTimer(TestTimer,2000,"First String","Second String","Third String") common.LogInfo("","Test End??") The result will be the following Test Start Test End?? First String Second String Third String Submitter cristimirt Submitted 11/02/16 Category Addons  
  2. LibTimer

    Версия 1.0.0

    100 скачиваний

    LibTimer is a library that allows the use of a timer function. This is intended for developers, not general players. The Allods API does not provide a way to call a function after a certain time, at least not without freezing the thread. So I've used something that the API does provide: animation of a widget. To be more exact, when we animate a widget, we can specify the duration of the animation. My library uses that. Usage is simple. First, include the file in AddonDesc.(UIAddon).xdb, in the <Scripts> section, but before your main script file. You can use the timer function like so: StartTimer(functionName,duration,arguments[...]) functionName is the name of the function that you want to execute. duration is the duration in milliseconds after wich the function will execute arguments is a list of the arguments that you want to pass to your function. You can pass any number of arguments This is an example that will run the function TestTimer 2 seconds after writing "Test Start". function TestTimer(param1, param2, param3) common.LogInfo("",param1.." "..param2.." "..param3) end common.LogInfo("","Test Start") StartTimer(TestTimer,2000,"First String","Second String","Third String") common.LogInfo("","Test End??") The result will be the following Test Start Test End?? First String Second String Third String

    Бесплатно

  3. Исследуя аддоны, заметил, что слишком мало информации преподносится в легко воспринимаемом графическом виде и решил, что это стоит попытаться исправить. Поэтому написал небольшую библиотечку, которая позволит без особых усилий строить диаграммы прям на клиенте. Прошу разработчиков принять участие в ее тестировании. Если кто-то заметит какой-либо баг, просьба писать сюда. Если есть предложения по работе аддона и фичам - тоже пишите сюда. Что может библиотека: -- Построить диаграмму по некоему набору числовых данных. -- Динамически менять свой вид при изменении данных. -- Динамически меняет свой вид при изменении параметров настроек. -- Довольно гибко настраивается под нужны каждого разработчика. -- Позволяет независимо работать с несколькими диаграммами в одном аддоне. -- Теоретически, должна работать на клиентах: 6.0.1, 6.0.0, 5.0.1, 4.0.2, 3.0.0, 1.1.02. -- Пока библиотека не понимает отрицательные значения. -- Покуда не реализованы серии. Ближайшие планы: -- Перерисовать часть текстур. -- Реализовать управляющие кнопки. -- Реализовать адекватное поведение библиотеки при отрицательных числах. Документацию к библиотеке можно найти в папке doc. Примеры использования библиотеки приведены в папке Sample. Ссылка на библиотеку: LibBarChart.
  4. LibBarChart

    Версия 1.0.0

    295 скачиваний

    LibBarChart - библиотека, позволяющая разработчикам аддонов рисовать диаграммы на экране. Рекомендуется использовать для наглядного представления информации в аддоне. Библиотека полностью берет на себя работу с интерфейсом игры. От разработчика требуются только параметры настройки, данные, по которым надо построить диаграмму и своевременное обновление информации на экране. Сама библиотека находится в папке BarChart. Документацию к библиотеке можно найти в папке doc. Простейшие примеры использования библиотеки можно найти в папке Sample. Исследуя аддоны, заметил, что слишком мало информации преподносится в легко воспринимаемом графическом виде и решил, что это стоит попытаться исправить. Поэтому написал небольшую библиотечку, которая позволит без особых усилий строить диаграммы прям на клиенте. Прошу разработчиков принять участие в ее тестировании. Если кто-то заметит какой-либо баг, просьба писать сюда. Если есть предложения по работе аддона и фичам - тоже пишите сюда. Что может библиотека: -- Построить диаграмму по некоему набору числовых данных. -- Динамически менять свой вид при изменении данных. -- Динамически меняет свой вид при изменении параметров настроек. -- Довольно гибко настраивается под нужны каждого разработчика. -- Позволяет независимо работать с несколькими диаграммами в одном аддоне. -- Теоретически, должна работать на клиентах: 6.0.1, 6.0.0, 5.0.1, 4.0.2, 3.0.0, 1.1.02. -- Пока библиотека не понимает отрицательные значения. -- Покуда не реализованы серии. Ближайшие планы: -- Перерисовать часть текстур. -- Реализовать управляющие кнопки. -- Реализовать адекватное поведение библиотеки при отрицательных числах.

    Бесплатно

  5. LibGS

    Версия 2014-11-24

    13 192 скачивания

    LibGS (LibGearScore) - библиотека инспектирования персонажей игроков. Рекомендуется использовать в аддонах, которые показывают гирскор, руны, и прочие характеристики экипировки персонажей игроков. Библиотека берет на себя всё общение с API игрового клиента (avatar.StartInspect, avatar.EndInspect, EVENT_INSPECT_STARTED, EVENT_INSPECT_FINISHED), скрывая от аддона особенности их работы, самостоятельно решая возможные конфликты между аддонами, и выдает в аддон результат инспектирования в удобном виде. Прошу разработчиков принять участие в тестировании Если кто-то увидит или наткнется на какой-либо баг, огромная просьба писать сюда. Если есть предложения по работе аддона, фичам и содержанию таблицы, то тоже пишите сюда. Библиотека позаимствовала многие идеи из аддона TPI и немного из LibreGS, так что их авторам look_at_you_ и vitaliy75 огромное спасибо за вклад. По умолчанию библиотека автоматически считает гирскор текущей цели и присылает в аддон через эвент или callback-функцию. Во избежании самопроизвольно открывающегося окна инспектирования рекомендуется пользоваться данной библиотекой (в особенности это касается аддона NewTarget3DPvP, с которым наблюдаются кофликты). Поддерживает функцию unit.GetGearScore, добавленную в хотфиксе 6.0.00.36. На данный момент отсутствует подсчет гирскора для версий Аллодов 1.1-4.x. Если кто может, пожалуйста, поделитесь формулой или исходником. Как пользоваться: Опускаю подробности о добавлении скрипта в AddonDesc.(UIAddon).xdb... Существует несколько вариантов использования библиотеки: Если ваш аддон только для инспектировния текущей цели аватара, то необходимо выполнить следующие действия:I. Инициализировать библиотеку любым из следующих способов: Вызвать функцию GS.Init: if GS.Init then GS.Init() end Вызвать функцию GS.EnableTargetInspection: GS.EnableTargetInspection( true )Платным аддонам рекомендуется это делать после прохождения проверки системы привязки к нику персонажа. II. Обеспечить прием данных любым из следующих способов: Подписаться на сообщение LIBGS_GEARSCORE_AVAILABLE common.RegisterEventHandler( ShowGearScore, "LIBGS_GEARSCORE_AVAILABLE" ) Установить функцию обратного вызова GS.Callback = ShowGearScore ShowGearScore - функция вашего аддона, которая будет отображать гирскор в нужное окно. Имя функции может быть любое. В этой функции необходимо проверять, что сообщение пришло для вашего юнита. ShowGearScore должна быть уже объявлена на момент попытки её использования. Например: function ShowGearScore( params ) if params.unitId == avatar.GetTarget() then if params.gearscore then MyWidget:SetClassVal("style", params.gearscoreStyle) MyWidget:SetVal("gs", tostring(params.gearscore)) MyWidget:Show(true) else MyWidget:SetClassVal("style", "tip_white") MyWidget:SetVal("gs", "N/A") MyWidget:Show(true) end end end Аддону следует позаботиться о том, чтобы скрывать интерфейс в случае переключения таргета на НПС или сброса таргета, т.к. LibGS не присылает в этих случаях никаких сообщений. function onTargetChaged(params) local unitId = avatar.GetTarget() if not unitId or not object.IsUnit( unitId ) or not unit.IsPlayer( unitId ) or unit.IsPet( unitId ) then MyWidget:Show(false) end end Если ваш аддон для инспектировния любых юнитов (без выделения юнита в таргет), то для получения гирскора вышеуказанным способом необходимо вызвать функцию GS.RequestInfo: GS.RequestInfo ( unitIdToInspect ) И в ShowGearScore, соответственно, сделать: if params.unitId == unitIdToInspect then ... В данном случае инициализировать библиотеку не обязательно, но желательно, несмотря на то, что она может инициализировать себя сама. На данный момент существует проблема особенность: если пользователь открыл встренное в клиент окно инспектирования, то инспектирование любого юнита не будет произведено, пока окно не будет закрыто. Стоит подождать следующих версий, в которых эта проблема будет решена. Если ваш аддон не предназначен для инспектировния текущей цели аватара, то рекомендуется отключить функцию автоматического инспектирования: GS.EnableTargetInspection( false ) Описание функций: GS.Init ( EnableTargetAutoInspection, SkipInitialTargetInspection )Инициализирует библиотеку. Параметры функции аналогичны параметрам функции GS.EnableTargetInspection. GS.EnableTargetInspection ( Enable, SkipInitial )Включает/отключает автоматическое инспектирование при смене цели аватара. Параметры: 1. Enable: boolean true/nil - Включить авто-испектирование false - Выключить авто-испектирование 2. SkipInitial: boolean Имеет смысл только при Enable=true/nil. По умолчанию, при перезагрузке аддона через меню дополнений LibGS автоматически проинспектирует текущую цель аватара. SkipInitial позволяет пропустить инспектирование, например, если библиотека инциализируется не с начала работы аддона. true - Пропустить инспектирование false/nil - Инспектировать текущую цель Следует помнить, что при перезагрузке всех аддонов, другие аддоны могут запрашивать инспектирование цели при инициализации, что приведет к приходу соообщения LIBGS_GEARSCORE_AVAILABLE раньше, чем может ожидаться. Функция аддона, получающая результат инспектирования (ShowGearScore) должна учитывать это. GS.RequestInfo ( unitId ) Запрашивает инспектирование юнита Параметры: unitId: ObjectId Id юнита, которого надо происпектировать. LIBGS_GEARSCORE_AVAILABLE ( params )Глобальное сообщение с результатами инспектирования, посылаемое из ведущей LibGS после завершения инспектирования. Следует помнить, что если аддон подписывается на сообщение LIBGS_GEARSCORE_AVAILABLE, то сообщение может приходить даже если аддон не запрашивал инспектирование какого-либо юнита. Также следует помнить, что при перезагрузке всех аддонов, другие аддоны могут запрашивать инспектирование цели при инициализации, что приведет к приходу дополнительных сообщений LIBGS_GEARSCORE_AVAILABLE. Функция аддона, получающая результат инспектирования (ShowGearScore) должна учитывать это. GS.Callback ( params )Функция аддона, которая будет вызвана из локального экземпляра LibGS при получении сообщения LIBGS_GEARSCORE_AVAILABLE. Аддон устанавливает это поле при необходимости, если не желает получать результат инспектирования через сообщение LIBGS_GEARSCORE_AVAILABLE. В качестве параметра в обработчик LIBGS_GEARSCORE_AVAILABLE (и в GS.Callback, если задана) передается таблица со следующими полями: unitId - ObjectId - Id юнита для которого подсчитан гирскор rank - number - ранг умения аватара Пристальный взгляд (0..6) inspected - boolean - можно ли происпектировать юнит частично или полностью (ранг достаточно высок) (false, true) reliable - boolean - полностью ли происпектирован юнит (ранг достаточно высок) (false, true) Поля gearscore* могут отсутствовать, если у аватара недостаточный ранг умения (inspected==false). gearscore - number - гирскор юнита gearscoreLevel - number - средний уровень экипировки юнита, кроме драконьего облика (1..66) gearscoreQuality - number - "актуальность" экипировки юнита - среднее качество, скорректированное с учетом разницы уровня игрока и экипировки, кроме драконьего облика (1..8 соответствует значениям между ITEM_QUALITY_JUNK..ITEM_QUALITY_RELIC) gearscoreStyle - string - рекомендуемый стиль для отображения значения гирскора ('Junk'..'Relic') Поля equipment* могут отсутствовать, если у аватара недостаточный ранг умения (inspected==false). equipmentLevel - number - средний уровень экипировки юнита, кроме драконьего облика (1..66) equipmentQuality - number - среднее качество экипировки юнита, кроме драконьего облика (1..8 соответствует значениям между ITEM_QUALITY_JUNK..ITEM_QUALITY_RELIC) equipmentStyle - string - рекомендуемый стиль для отображения среднего качества экипировки ('Junk'..'Relic') Поля runes* могут отсутствовать, если у аватара недостаточный ранг умения (inspected==false), или находимся на Pay-To-Play сервере. runes - таблица, индексированная по [DRESS_SLOT_*RUNE*], элемент - таблица с полями: runeScore - number - бонус к урону или лечению, даруемый данной руной в данный момент, в зависимости от того, куда она вставлена (0..?? runeQuality - number - ступень руны (0..13) runeStyle - string - рекомендуемый стиль для отображения ступени ('Junk', 'Common'..'Legendary') runesQuality - number - средняя ступень всех рун (0..13) runesQualityOffensive - number - средняя ступень всех рун в атакующих слотах (0..13) runesQualityDefensive - number - средняя ступень всех рун в защитных слотах (0..13) runesScoreOffensive - number - общий бонус всех рун в атакующих слотах (0..?? runesScoreDefensive - number - общий бонус всех рун в защитных слотах (0..?? runesStyle - string - рекомендуемый стиль для отображения runesQuality ('Junk', 'Common'..'Legendary') runesStyleOffensive - string - рекомендуемый стиль для отображения runesQualityOffensive ('Junk', 'Common'..'Legendary') runesStyleDefensive - string - рекомендуемый стиль для отображения runesQualityDefensive ('Junk', 'Common'..'Legendary') Некоторые поля fairy* могут отсутствовать в зависимости от версии игрового клиента. fairy - string - ступень покровителя для отображения ('-', 'I'..'V') fairyLevel - number - уровень покровителя (1..65) fairyQuality - number - ступень покровителя (0..5) fairyScore - number - [AO 3-4] бонус характиристики, даруемый покровителем (0..???) fairyScoreStat - number - [AO 3-4] тип характиристики (INNATE_STAT_*) fairyScorePower - number - [AO 5-6] бонус могущества (0..???) fairyScoreDamage - number - бонус к урону (0..250%) fairyScoreHeal - number - бонус к лечению (0..250%) fairyStyle - string - рекомендуемый стиль для отображения ступени покровителя ('Junk', 'Goods'..'Epic') Поля *Style можно напрямую передавать в функцию MyTextView:SetClassVal(). Пример аддона LibreGS, переделанного под использование LibGS. Можно также обратить внимание на onTargetChaged, скрывающий интерфейс аддона: -------------------------------------------------------------------------------- -- GLOBALS -------------------------------------------------------------------------------- local ouText=nil local vtHello=nil -------------------------------------------------------------------------------- -- EVENT HANDLERS -------------------------------------------------------------------------------- function onSize(params) local pco=widgetsSystem:GetPosConverterParams() local plc=mainForm:GetPlacementPlain() plc.alignY=WIDGET_ALIGN_LOW plc.highPosY=0 plc.posY=0 plc.sizeY=157 plc.alignX=WIDGET_ALIGN_LOW plc.posX=380 plc.sizeX=400 mainForm:SetPlacementPlain(plc) end function onTargetChaged(params) local tid=avatar.GetTarget() if not tid or not unit.IsPlayer(tid) then mainForm:Show(false) end end function ShowGearScore(params) if params.unitId == avatar.GetTarget() then ouText:SetVal("ttt",userMods.ToWString(tostring(math.floor(params.gearscore+0.5)))) mainForm:Show(true) end end -------------------------------------------------------------------------------- -- INITIALIZATION -------------------------------------------------------------------------------- function Init() if GS.Init then GS.Init() end onSize(nil) mainForm:SetPriority(7000) mainForm:SetTransparentInput(true) mainForm:Show(true) ouText=mainForm:GetChildChecked("ouText",false) vtHello=common.CreateValuedText() vtHello:SetFormat(userMods.ToWString([[<html><log fontsize="20"><r name="ttt"/></log></html>]])) ouText:SetValuedText(vtHello) ouText:Show(true) local plc=ouText:GetPlacementPlain() plc.posX=0 plc.posY=0 ouText:SetPlacementPlain(plc) ouText:SetBackgroundColor( { r = 0.1; g = 0.1; b = 0.05; a = 0.9 } ) common.RegisterEventHandler( onTargetChaged, "EVENT_AVATAR_TARGET_CHANGED") common.RegisterEventHandler( ShowGearScore, "LIBGS_GEARSCORE_AVAILABLE") common.RegisterEventHandler( onSize, "EVENT_POS_CONVERTER_CHANGED") end -------------------------------------------------------------------------------- Init() --------------------------------------------------------------------------------

    Бесплатно

  6. LibDnD

    Версия 2014-10-29

    3 821 скачивание

    Официальная версия LibDnD для аддонов. Рекомендуется разработчикам аддонов использовать данную версию LibDnD в своих аддонах. В ближайшем будущем планируется добавления новых плюшек, в т.ч. перенос некоторых плюшек из других аддонов. Если требуется какой-то особенный дополнительный функционал, или кто-то готов поделиться своим, то можно об этом попросить на странице разработки LibDnD. HOW-TO: LibDnD.lua - Библиотека Drag&Drop Простейший пример использования LibDnD Файл LibDnD.lua нужно включить в AddonDesc.(UIAddon).xdb, в секции <ScriptFileRefs>: <ScriptFileRefs> <Item href="LibDnD.lua" /> ... </ScriptFileRefs> DnD.Init() - Инициализирует виджет для Drag&Drop. Это нужно только один раз, во время инициализации аддона, или позже, когда угодно. Повторные вызовы для того же самого виджета на данный момент нежелательны. Пример: DnD.Init( wtMainPanel ) Всё, Drag&Drop УЖЕ работает ) Функция DnD.Init() Синтаксис: DnD.Init( wtMovable, wtReacting, fUseCfg, fLockedToScreenArea, Padding, KbFlag, Cursor ) Обязательные параметры: 1) wtMovable - ссылка на Widget. Виджет, КОТОРЫЙ нужно перемещать. НЕобязательные параметры (могут быть nil, или их можно вообще не писать): 2) wtReacting - ссылка на Widget (nil = wtMovable). Виджет, на который привязывается реакция, т.е. виджет, ЗА КОТОРЫЙ будет перетаскиваться wtMovable. Это может быть сам wtMovable, то есть сама перетаскиваемая панель, но НЕ обязательно (!), это может быть что угодно, например, ЗАГОЛОВОК ОКНА, "дочерний" по отношению к ОКНУ wtMovable. Если не указан - виджет wtMovable перемещается сам за себя. 3) fUseCfg - true/false (nil = false). Сохранять ли позицию виджета в конфиг-файл User.cfg. Если да, то сохранит в таблице с именем "DnD:<путь к виджету wtMovable в иерархии>", в секции, названной по имени аддона. Рекомендуется, чтобы все родительские виджеты wtMovable имели осмысленные, не динамические, уникальные имена. 4) fLockedToParentArea - true/false (nil = true). Если true, то передвигаемый виджет нельзя даже частично утащить за края родительского окна (чаще всего ими являются края экрана). Таким образом он всегда будет находиться целиком на экране (если не переопределено в параметре Padding, см. ниже). А если false, то его можно утащить полностью, точно так же, как можно утаскивать окна в ОС Microsuxx Windows. 5) Padding - число или таблица из 4 чисел {Верхний,Правый,Нижний,Левый} (nil = {0,0,0,0}). Если fLockedToParentArea=true, то действует Padding. Если хотите, чтобы за край окна всё-таки можно было частично утащить wtMovable на какую-то глубину, то можете заполнить таблицу. Например, это сделано в аддонах "PhanTime" и "HonorInfo", где по краям панели имеется "тень" толщиной 8 пикселей. Там эта таблица заполнена отрицательными числами, вот так: {-8,-8,-8,-8}. В случае передачи числа в качестве параметра, оно будет использовано в качестве глубины по всем направлениям. 6) KbFlag - флаги управляющих клавиш KBF_*. Если надо, чтобы wtMovable двигался только при нажатии клавиш Shift, Ctrl или Alt, передаем здесь соответствующие флаги KBF_*: nil - нажатие любой из перечисленных клавиш не имеет никакого эффекта. KBF_NONE - Перетаскивание только при не нажатых клавишах KBF_SHIFT - Перетаскивание только при нажатой "Shift" KBF_ALT - Перетаскивание только при нажатой "Alt" KBF_CTRL - Перетаскивание только при нажатой "Ctrl" KBF_ANY - Перетаскивание только при любой нажатой клавиши из перечисленных 7) Cursor - строка/false (nil = "drag"). Стиль курсора, который будет устанавливаться при перетаскивании. nil/true - используется курсор по умолчанию: "drag". false - курсор не меняется при перетаскивании. Примеры использования DnD.Init() Виджет Окно (wtWindow), которое можно таскать за виджет Заголовок-окна (wtTitle), являющийся дочерним виджетом Окна: DnD.Init( wtWindow, wtTitle ) Виджет таскается сам по себе, И его позиция сохраняется между игровыми сессиями (создаёт секцию по названию аддона в файле User.cfg): DnD.Init( wtPanel, wtPanel, true ) или: DnD.Init( wtPanel, nil, true ) Виджет не сохраняет позицию между игровыми сессиями, и его можно утащить почти полностью за край экрана: DnD.Init( wtPanel, nil, false, true ) Позицию в конфиг не сохраняет, но за то, "тень" по краям текстуры фона окна аддона, имеющая толщину 8 пикселей со всех сторон, будет красиво задвигаться за край экрана (так сделано в аддонах "PhanTime" и "HonorInfo"): DnD.Init( wtMainPanel, nil, nil, nil, {-8,-8,-8,-8} ) или: DnD.Init( wtMainPanel, nil, nil, nil, -8 ) Делаем сразу три разных виджета передвигаемыми в одном аддоне: DnD.Init( wtTrayButton ) DnD.Init( wtMainWindow ) DnD.Init( wtConfigWindow ) Делаем передвигаемую wtMainPanel и все её дочерние виджеты в пределах родителя с учетом рамки в 4 пикселя при нажатой клавише Ctrl, с сохранением всех позиций в User.cfg: DnD.Init( wtMainPanel, nil, true ) for _,wtChild in pairs( wtMainPanel:GetNamedChildren() ) do DnD.Init( wtChild, nil, true, nil, 4, KBF_CTRL ) end Функция DnD.Enable() Синтаксис: DnD.Enable( wtWidget, fEnable ) 1) wtWidget - ссылка на Widget. Это может быть wtReacting или wtMovable, не важно, т.к. оба варианта работают. 2) fEnable - true/false. Если true, то виджет будет реагировать на Drag&Drop, а если false, то Drag&Drop виджета будет запрещён (то есть, виджет будет "пристёгнут", и будет игнорировать все попытки перетаскивания). Этой функцией пользоваться НЕ обязательно, т.к. все виджеты, зарегистрированные в системе функцией DnD.Init(), по умолчанию, АКТИВНЫ. Но если возникнет необходимость "пристегнуть" такой виджет, то функция DnD.Enable() существует именно для этого. Она меняет статус виждета, перманентно разрешающий или запрещающий его Drag&Drop. "Пристегнуть" виджет можно командой DnD.Enable( ВашВиждет, false ), и он будет игнорировать все попытки перетаскивания. Если позже вам потребуется снова разблокировать его (снова сделать перетаскиваемым), то сделайте это командой DnD.Enable( ВашВиждет, true ). Функция DnD.Enable() может потребоваться вам, например, если вы захотите сделать в своём аддоне полноценную поддержку событий аддона AddonManager. Подробнее об этом написано здесь: Поддержка событий AddonManager в других аддонах Функция DnD.IsDragging() Синтаксис: DnD.IsDragging() Если в вашем аддоне есть перетаскиваемые кнопки (такие есть, например, в аддонах "DarkDPSMeter" и "GuildGui1b"), то вам пригодится функция DnD.IsDragging(). Чтобы при перетаскивании такой кнопки, ИЗБЕЖАТЬ нажатие на неё, вставьте такую строку в начало кода реакции на нажатие кнопки: if DnD.IsDragging() then return end Функция DnD.Remove() Синтаксис: DnD.Remove( wtWidget ) 1) wtWidget - ссылка на Widget. Виджет, который нужно разрегистрировать в системе DnD, чтобы его можно было безопасно уничтожить с помощью DestroyWidget. Передавать надо именно тот виджет, который собираетесь уничтожать. На данный момент не проверяет, зарегистрированы ли в системе дочерние по отношению к wtWidget виджеты, поэтому, если вы их регистрировали, то необходимо вызывать DnD.Remove и для них. Пример: for _,wtChild in pairs( wtMainPanel:GetNamedChildren() ) do DnD.Remove( wtChild ) end DnD.Remove( wtMainPanel ) wtMainPanel:DestroyWidget() Бонус: функции GetConfig() и SetConfig() Примеры: Получить весь конфиг аддона в виде ТАБЛИЦЫ (если он есть в User.cfg), или nil (если его там нет): Config = GetConfig() Получить из конфига значение переменной Name (если она есть) или nil (если её там нет). Имя переменной может быть строкой или числом, а значение - чем угодно, хоть таблицей. MyOption = GetConfig( Name ) Сохранить в конфиг-файл переменную Name со значением Value. Те же условия для имени и значения, что описаны в предыдущем примере. SetConfig( Name, Value ) Если передать только ОДИН параметр, но ТАБЛИЦУ, то все её переменные будут аккуратно добавлены (merged) в конфиг аддона. Именно добавлены. То есть, тупой перезаписи одной таблицы поверх другой эта функция НЕ делает. SetConfig( { ["A"] =5, [100] ={1,10,100}, ["Yes"] =true } ) Этим двум функциям НЕ нужно указывать название секции, т.к. они всегда пользуются секцией, названной именем аддона.

    Бесплатно