Jump to content
Alloder.pro: about Allods with love
Search In
  • More options...
Find results that contain...
Find results in...

Alloder 2.0

We have started the process of project evolve, and this relates not only, and not even primarily of the site's view

Read more

Game tooltips

Tooltips provide a way for 3rd party fansites and extensions to display detailed information on mouseover.

Read more

New program for writers

We turn from quantity to quality and tell you how we will supplement the Allods Team program with rewards in rubles.

More

The new Updater

Let us to introduce the new addon updater software and to share the details

Read more

Alloder 2.0

We have started the process of project evolve, and this relates not only, and not even primarily of the site's view

Read more

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


 Share

Recommended Posts

Добрый день!

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

Для скрытия использую событие "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 не нашел. 

Link to comment
Share on other sites

  • 2 weeks later...

---------------------------------------------------------------------------------------------------
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")

Link to comment
Share on other sites

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

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

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

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

 

Link to comment
Share on other sites

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

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

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

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

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

 

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

Link to comment
Share on other sites

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

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

    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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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

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

 

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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
  • Thanks 1
Link to comment
Share on other sites

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 не используется нигде в коде программы - не сработает ли сборщик мусора на нее раньше требуемого?

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

By using our site you agree to the Terms of Use