Shavadre Posted June 4, 2022 Share Posted June 4, 2022 Добрый день! Пишу свой маленький аддон для сокрытия некоторых кнопок в стандартных игровых виджетах. С этим проблем нет, но вот как вернуть все обратно? Для скрытия использую событие "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 не нашел. Quote Link to comment Share on other sites More sharing options...
worm Posted June 13, 2022 Share Posted June 13, 2022 --------------------------------------------------------------------------------------------------- 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") Quote Link to comment Share on other sites More sharing options...
worm Posted June 13, 2022 Share Posted June 13, 2022 Вопрос а нафига? Если скрываешь сообщение от ContextUniMessageBox то тат сейчас только перезагрузка аддона причем для медленных машин с задержкой. В ближайшее время обещали допилить чтобы просто ^Show(true/false) работало. для стандартных не пользовательских common.StateUnloadManagedAddon( "ContextUniMessageBox" ) common.StateLoadManagedAddon( "ContextUniMessageBox" ) и все возвращается как правило. А так частности. Местоположение видимость значит надо ранее запоминать. Quote Link to comment Share on other sites More sharing options...
worm Posted June 13, 2022 Share Posted June 13, 2022 Последнее это первое потом второе Quote Link to comment Share on other sites More sharing options...
Shavadre Posted June 13, 2022 Author Share Posted June 13, 2022 20 минут назад, worm сказал: Вопрос а нафига? Если скрываешь сообщение от ContextUniMessageBox то тат сейчас только перезагрузка аддона причем для медленных машин с задержкой. В ближайшее время обещали допилить чтобы просто ^Show(true/false) работало. для стандартных не пользовательских common.StateUnloadManagedAddon( "ContextUniMessageBox" ) common.StateLoadManagedAddon( "ContextUniMessageBox" ) и все возвращается как правило. А так частности. Местоположение видимость значит надо ранее запоминать. У меня проблема в том, что я скрываю кнопку сортировки в инвентаре пользователя. При отключении аддона (через галочку в Меню->Дополнения) аддон просто отключается, я так понимаю, что просто Lua-машина с запущенным аддоном выключается. И я не успеваю показать скрытые кнопки, т.е. вернуть все как было до включения аддона. Есть тут какой-то механизм, который запускается ПЕРЕД остановкой аддона? Аналог деструктора или финализатора... Quote Link to comment Share on other sites More sharing options...
worm Posted June 13, 2022 Share Posted June 13, 2022 Включите после если нет реакция 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 Quote Link to comment Share on other sites More sharing options...
worm Posted June 13, 2022 Share Posted June 13, 2022 Простите. Тороплюсь одной ногой не здесь. Но думаю этого будет достаточно чтобы решить проблему) У лагранжа аддон по моему тоже на кнопку скрывает.. Если код открыт можете у него глянуть. или просто скачать) Quote Link to comment Share on other sites More sharing options...
worm Posted June 13, 2022 Share Posted June 13, 2022 нет насколько я понимаю из доступного ничего такого нет. Мы работаем только с доступными нам функциями То что открыли и из этого колхозим. Чтобы решить онкретно вашу. задумку мне видится второй аддон который бы выполнял приведенный выше код Quote Link to comment Share on other sites More sharing options...
Shavadre Posted June 13, 2022 Author Share Posted June 13, 2022 47 минут назад, worm сказал: нет насколько я понимаю из доступного ничего такого нет. Мы работаем только с доступными нам функциями То что открыли и из этого колхозим. Чтобы решить онкретно вашу. задумку мне видится второй аддон который бы выполнял приведенный выше код создавать еще один аддон ради управления мелким аддоном - это такое себе) ладно, спасибо за информацию, подумаю как выйти из этого положения. Quote Link to comment Share on other sites More sharing options...
worm Posted June 13, 2022 Share Posted June 13, 2022 Ну событие о выключении приходит по факту выключения. Выключается через штатный аддон. Тут только такая логика. Либо вы выключаетесь через себя либо нанимает сторожа который смотрит со стороны. Вообще вроде бы так часто никто не не выключает аддоны. Хотя было как-то что игра с большим ФПС пользовательские отрубала. А так предупредить юзера. Или костыль в свое аддоне что если при запуске аддона скрыта кнопка ее включить если включена то выключит. Таким образом сам себя личить будет Quote Link to comment Share on other sites More sharing options...
LEM Posted June 13, 2022 Share Posted June 13, 2022 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 1 Quote Link to comment Share on other sites More sharing options...
Shavadre Posted June 13, 2022 Author Share Posted June 13, 2022 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 не используется нигде в коде программы - не сработает ли сборщик мусора на нее раньше требуемого? Quote Link to comment Share on other sites More sharing options...
LEM Posted June 13, 2022 Share Posted June 13, 2022 Могу. В этом коде создается прокси объект и к нему прикрепляется функция финализатор (в Lua 5.1 метаметод __gc срабатывает только для userdata, в Lua 5.2 завезли __gc и для таблиц). Этот прокси объект помещается в глобальное окружение (_G это таблица со всеми глобальными переменными). Когда оно разрушается (это происходит при выключении аддона), срабатывает финализатор для прокси объекта. Quote Link to comment Share on other sites More sharing options...
worm Posted June 13, 2022 Share Posted June 13, 2022 Хм. Недодудумал до такого. Был неправ. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.