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

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

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

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

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

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

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

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

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

Подробнее

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

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

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

Какое событие отвечает за "выключение дополнения/аддона"?


Shavadre

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

Добрый день!

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

Для скрытия использую событие "EVENT_ADDON_LOAD_STATE_CHANGED". У него есть два параметра loading и unloading, которые должны отвечать за то, что произошло (loading = true and unloading = false - произошло включение аддона, loading = true and unloading = true - произошла перезагрузка аддона, loading = false and unloading = true - произошла выгрузка аддона). Вот только последнее не работает.

Я поставил логирование на хендлер "EVENT_ADDON_LOAD_STATE_CHANGED" и он вообще не срабатывает, если пользователь выключает аддон через галочку "выключить дополнение". А еще каких-то событий, подходящих под это, я в API не нашел. 

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

  • 2 недели спустя...

---------------------------------------------------------------------------------------------------
function AddonPS( params )

    local addons = common.GetStateManagedAddons()

    for i = 0, GetTableSize( addons ) - 1 do
        local info = addons[i]
        
        if info.name == "UserAddon/PetsSearch" then
            if not info.isLoaded then
                -- common.StateLoadManagedAddon( info.name )
                masPS(1)
                userMods.SendEvent( "U_EVENT_PS_IS_WORK", {sender = common.GetAddonName(), psIsWork = 0} )
            else
                masPS(0)
                userMods.SendEvent( "U_EVENT_PS_IS_WORK", {sender = common.GetAddonName(), psIsWork = 1} )
            end
        end
        
        -- LogInfo( "objectId=", info.name, info.isLoaded )
        
    end
    
    -- LogInfo( "objectId=", params.name )

end


---------------------------------------------------------------------------------------------------
function AddonPSEvent( params )

    if params.name == "UserAddon/PetsSearch" then
        if params.loading then
            -- common.StateLoadManagedAddon( info.name )
            masPS(0)
            userMods.SendEvent( "U_EVENT_PS_IS_WORK", {sender = common.GetAddonName(), psIsWork = 1} )
        elseif params.unloading then
            masPS(1)
            userMods.SendEvent( "U_EVENT_PS_IS_WORK", {sender = common.GetAddonName(), psIsWork = 0} )
        end
    end
    
    -- LogInfo( "objectId=", params.name )

end

 

    AddonPS()
    common.RegisterEventHandler(AddonPSEvent, "EVENT_ADDON_LOAD_STATE_CHANGED")

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

Вопрос а нафига? Если скрываешь сообщение от ContextUniMessageBox то тат сейчас только перезагрузка аддона причем для медленных машин с задержкой. В ближайшее время обещали допилить чтобы  просто ^Show(true/false) работало.

для стандартных не пользовательских

        common.StateUnloadManagedAddon( "ContextUniMessageBox" )
        common.StateLoadManagedAddon( "ContextUniMessageBox" )

и все возвращается как правило. А так частности. Местоположение видимость значит надо ранее запоминать.

 

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

20 минут назад, worm сказал:

Вопрос а нафига? Если скрываешь сообщение от ContextUniMessageBox то тат сейчас только перезагрузка аддона причем для медленных машин с задержкой. В ближайшее время обещали допилить чтобы  просто ^Show(true/false) работало.

для стандартных не пользовательских

        common.StateUnloadManagedAddon( "ContextUniMessageBox" )
        common.StateLoadManagedAddon( "ContextUniMessageBox" )

и все возвращается как правило. А так частности. Местоположение видимость значит надо ранее запоминать.

 

У меня проблема в том, что я скрываю кнопку сортировки в инвентаре пользователя. При отключении аддона (через галочку в Меню->Дополнения) аддон просто отключается, я так понимаю, что просто Lua-машина с запущенным аддоном выключается. И я не успеваю показать скрытые кнопки, т.е. вернуть все как было до включения аддона. Есть тут какой-то механизм, который запускается ПЕРЕД остановкой аддона? Аналог деструктора или финализатора...

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

Включите после

если нет реакция

    wdt.stateMapPanelTex = stateMainForm:GetChildChecked( "ContextShipDeviceNavigator", true ):GetChildChecked( "Visor", true )
    wdt.stateMapPanelTex:SetOnShowNotification( true )

 

    common.RegisterEventHandler(abc, "EVENT_WIDGET_SHOW_CHANGED")

if wdt.stateMapPanelTex:IsVisible() then
        wdt.PlatePlates:Show( true )

else

wdt.PlatePlates:Show( false)

end

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

Простите. Тороплюсь одной ногой не здесь. Но думаю этого будет достаточно чтобы решить проблему)

У лагранжа аддон по моему тоже на кнопку скрывает.. Если код открыт можете у него глянуть.

или просто скачать)

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

нет насколько я понимаю из доступного ничего такого нет. Мы работаем только с доступными нам функциями То что открыли и из этого колхозим. Чтобы решить онкретно вашу. задумку мне видится второй аддон который бы выполнял приведенный выше код

 

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

47 минут назад, worm сказал:

нет насколько я понимаю из доступного ничего такого нет. Мы работаем только с доступными нам функциями То что открыли и из этого колхозим. Чтобы решить онкретно вашу. задумку мне видится второй аддон который бы выполнял приведенный выше код

 

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

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

Ну событие о выключении приходит по факту выключения. Выключается через штатный аддон. Тут только такая логика. Либо вы выключаетесь через себя либо нанимает сторожа который смотрит со стороны.  Вообще вроде бы так часто никто не не выключает аддоны. Хотя было как-то что игра с большим ФПС пользовательские отрубала. А так предупредить юзера. Или костыль в свое аддоне что если при запуске аддона скрыта кнопка ее включить если включена то выключит. Таким образом сам себя личить будет 

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

4 часа назад, Shavadre сказал:

У меня проблема в том, что я скрываю кнопку сортировки в инвентаре пользователя. При отключении аддона (через галочку в Меню->Дополнения) аддон просто отключается, я так понимаю, что просто Lua-машина с запущенным аддоном выключается. И я не успеваю показать скрытые кнопки, т.е. вернуть все как было до включения аддона. Есть тут какой-то механизм, который запускается ПЕРЕД остановкой аддона? Аналог деструктора или финализатора...

Попробуй это

local function finalizer()
  local wtButtons = stateMainForm:GetChildChecked('ContextBag', false):GetChildChecked('Buttons', true)
  if not wtButtons:IsValid() then return end
  wtButtons:PlayFadeEffect(1, 0, 5000, EA_SYMMETRIC_FLASH)
end

rawset(_G, '_finalizerProxy', newproxy(true))
getmetatable(_finalizerProxy).__gc = finalizer
Ссылка на комментарий
Поделиться на другие сайты

49 минут назад, LEM сказал:

Попробуй это

local function finalizer()
  local wtButtons = stateMainForm:GetChildChecked('ContextBag', false):GetChildChecked('Buttons', true)
  if not wtButtons:IsValid() then return end
  wtButtons:PlayFadeEffect(1, 0, 5000, EA_SYMMETRIC_FLASH)
end

rawset(_G, '_finalizerProxy', newproxy(true))
getmetatable(_finalizerProxy).__gc = finalizer

Все работает в точности как нужно, спасибо!

Можете сказать как тут срабатывает сборщик мусора? При выключении lua-машины со скриптом? Если переменная _finalizerProxy не используется нигде в коде программы - не сработает ли сборщик мусора на нее раньше требуемого?

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

Могу. В этом коде создается прокси объект и к нему прикрепляется функция финализатор (в Lua 5.1 метаметод __gc срабатывает только для userdata, в Lua 5.2 завезли __gc и для таблиц). Этот прокси объект помещается в глобальное окружение (_G это таблица со всеми глобальными переменными). Когда оно разрушается (это происходит при выключении аддона), срабатывает финализатор для прокси объекта.

 

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

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

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

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

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

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

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

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

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

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