Реклама
  • Объявления

    • Fye D. Flowright

      Проблема с отображением баффов, хп, маны и урона в аддонах   20.04.2017

      После хотфикса 8.0.1.21 от 19 апреля в аддонах перестала отображаться информация о баффах, дебаффах, уроне, здоровье, входящем отхиле и изменении маны. Связано это с изменениями, внесенными разработчиками в API аддонов в данном хотфиксе. Восстановление работоспособности тех аддонов, которых затронуло это изменение, требует некоторого времени, поскольку не является легко поправимым. Авторам платных аддонов необходимо как можно быстрее, в срок до конца апреля, исправить проблемы. В случае невозможности исправить проблему и фактической бесполезности и неработоспособности аддона в отсутствие этих исправлений такой аддон будет снят с продажи. В случае снятия аддона с продажи покупателям будут проведены возвраты. По аддонам, работоспособность которых будет возобновлена, будут продлены сроки подписки. В случае, если окажется, что ситуация сложнее, чем представляется, в приведенные выше условия могут быть внесены изменения, о чем я обязательно сообщу. Подробности об изменении авторам аддонов: common.RegisterEventHandler(eventFunction, sysEventName, params) Для следующих событий params является обязательным параметром, в котором должен быть указан идентификатор интересующего объекта ObjectId: EVENT_HEALING_RECEIVED EVENT_UNIT_HEALTH_CHANGED EVENT_UNIT_MANA_PERCENTAGE_CHANGED EVENT_UNIT_DAMAGE_RECEIVED EVENT_DEVICE_DAMAGE_RECEIVED EVENT_OBJECT_BUFFS_CHANGED EVENT_OBJECT_BUFF_ADDED EVENT_OBJECT_BUFF_REMOVED Пример: local onEventObjectBuffsChanged = function(p)     -- событие придет для аватара end local params = {objectId = avatar.GetId()} -- Подписываем обработчик: common.RegisterEventHandler(onEventObjectBuffsChanged, 'EVENT_OBJECT_BUFFS_CHANGED', params) -- Отписываем обработчик: common.UnRegisterEventHandler(onEventObjectBuffsChanged, 'EVENT_OBJECT_BUFFS_CHANGED', params) Обращаем внимание на одну маленькую деталь в этом примере: -- Подписываем обработчик: common.RegisterEventHandler(onEventObjectBuffsChanged, 'EVENT_OBJECT_BUFFS_CHANGED', {objectId = avatar.GetId()}) -- Отписываем обработчик: common.UnRegisterEventHandler(onEventObjectBuffsChanged, 'EVENT_OBJECT_BUFFS_CHANGED', {objectId = avatar.GetId()}) -- здесь будет ошибка, поскольку params не равен тому, который использовали при регистрации. Оставить комментарий

1 скриншот

Описание файла

Официальная версия 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 } )

Этим двум функциям НЕ нужно указывать название секции, т.к. они всегда пользуются секцией, названной именем аддона.


Изменения в версии 2014-10-29   Просмотреть список изменений

Выпущена

  • 2014-10-29:
  • DnD.Init также поддерживает старый список параметров: DnD:Init(ID, wtReacting, wtMovable). Таким образом для перехода на новую версию LibDnD достаточно просто заменить файл LibDnD.lua на новый.
  • 2014-10-28:
  • Функции DnD.Init, DnD.Enable, DnD.IsDragging, DnD.Remove поддерживают вызов через двоеточие. Для этого не надо менять эти вызовы в LibDnD.lua.
  • 2014-10-24:
  • Изменились прототипы большинства функций, при обновлении библиотеки LibDnD в своих аддонах необходимо править код, обращающийся к переменной DnD.
  • Изменен прототип функции DnD:Init. Изменен способ вызова функции на DnD.Init. Параметр ID удален. Параметры wtMovable и wtReacting поменялись местами. Добавлены параметры KbFlag и Cursor. Параметр Padding теперь может быть числом.
  • Добавлена функция DnD.Remove для удаления виджета из системы DnD. Функцию необходимо вызывать перед DestroyWidget.
  • Изменен способ вызова функции DnD:Enable на DnD.Enable
  • Изменен способ вызова функции DnD:IsDragging на DnD.IsDragging.
  • Уникальные идентификаторы для передачи в mission.DNDRegister теперь выделяются самой LibDnD с помощью RequestIntegerByInstanceId в диапазоне 300200+ (с целью обезопасить от возможных конфликтов).
  • LibDnD больше не поддерживает старый формат хранения позиции виджета в настройках ("w<ID>x" и "w<ID>y").
  • LibDnD протестирована на клиентах: 6.0.00, 5.0.01, 4.0.02, 3.0.00, 1.1.02.




Отзывы пользователей

Вы можете оставить отзыв к файлу только после его скачивания.


Ollaf

  • 5
  

Поделиться отзывом


Ссылка на отзыв
GRuSHa

  • 5
  

Поделиться отзывом


Ссылка на отзыв