Как отследить паузу игры / открытие окон меню

Содержание:
кратко: это поможет отследить паузу игры. Паузу можно отследить в сингл-плеере, т.е. в одиночной игре. Там сразу когда заходишь в меню, журнал, либо открываешь альянс-окно или квест-окно у вас игра автоматически паузится, и весь интерфейс затемняется. короче паузу можно 4 системными кнопками вызвать.
Примечание: когда игра паузится, триггеры перестают работать во время паузы. И поэтому во время паузы нельзя проверить ничего. Точно не уверен, но кажется таймеры во время паузы перестают работать. Иначе бы давно проверил. Поэтому надо успеть вовремя зафиксировать до паузы
В мультиплеере все устроено по-другому, там игра не затемняет интерфейс, не паузится при открытии окон, но в меню есть кнопка “Пауза игры/Возобновить игру”, вызывающая паузу игры. В melee-сражениях у игрока 2-3 попытки на паузу.
local PauseButton = BlzGetFrameByName("PauseButton",0) - но эту кнопку я так и не смог зарегистрировать, тк кнопка является потомком других фреймов, поэтому ее не достать, она пустая. В мультиплеере этот способ с проверкой открытия окон будет фиксировать лишь открытия окон меню, и не более. Поэтому ко всему сказанному выше в мультиплеере, да и во в синглеплеере отслеживание паузы теряет смысла, оно бессмысленно
» lua код
--как отследить паузу
local PauseGame = false    
--пауза игры вызывается 4 кнопками: квест, меню, союзники, чат
--мне не нужно пересоздавать новые, можно использовать имеющие
local QuestButton_origin = BlzGetFrameByName("UpperButtonBarQuestsButton", 0)
local MenuButton_origin = BlzGetFrameByName("UpperButtonBarMenuButton",0)
local AlliesButton_origin = BlzGetFrameByName("UpperButtonBarAlliesButton",0)
local ChatButton_origin = BlzGetFrameByName("UpperButtonBarChatButton",0)
--эти выше 4 кнопки являются SimpleButtons, а этот тип фрейма имеет ограничения по событиям. На SimpleButton можно повесить одно событие - событие клика. Но когда регистрируем новое, то старое перестает работать. Короче, когда вешают событие на одно из этих клавиш, то перестают работать менюшки, т.е. кнопками уже нельзя вызвать окна. Поэтому создаем копии фрейма:    
local BarMenuButton = BlzCreateSimpleFrame("UpperButtonBarFrame", BlzGetOriginFrame ( ORIGIN_FRAME_GAME_UI, 0 ), 0)
BlzFrameSetAbsPoint(BarMenuButton, FRAMEPOINT_TOPLEFT, 0,0.6)
BlzFrameSetSize(BarMenuButton, 0.34, 0.022)
 --при создании BarMenuButton, мы записываем в переменные 4 копии-кнопок, которые можно вызвать меню через BlzFrameClick
local QuestButton_clone = BlzGetFrameByName("UpperButtonBarQuestsButton", 0)
local MenuButton_clone = BlzGetFrameByName("UpperButtonBarMenuButton",0)
local AlliesButton_clone = BlzGetFrameByName("UpperButtonBarAlliesButton",0)
local ChatButton_clone = BlzGetFrameByName("UpperButtonBarChatButton",0)
--отслеживаем клики мышкой
--региструем на оригиналы события клика
local trigger_click_button = CreateTrigger()
BlzTriggerRegisterFrameEvent(trigger_click_button, QuestButton_origin, FRAMEEVENT_CONTROL_CLICK)
BlzTriggerRegisterFrameEvent(trigger_click_button, MenuButton_origin, FRAMEEVENT_CONTROL_CLICK)
BlzTriggerRegisterFrameEvent(trigger_click_button, AlliesButton_origin, FRAMEEVENT_CONTROL_CLICK)
BlzTriggerRegisterFrameEvent(trigger_click_button, ChatButton_origin, FRAMEEVENT_CONTROL_CLICK)
TriggerAddAction(trigger_click_button, function()
   if GetLocalPlayer() == GetTriggerPlayer() then
       print(GetPlayerName(GetTriggerPlayer()).." pressed button: "..BlzFrameGetText(BlzGetTriggerFrame()))
                
       PauseGame = true
       print("Пауза включена")
                
       --вызываем окно через BlzFrameClick
       if QuestButton_origin == BlzGetTriggerFrame() then
           BlzFrameClick(QuestButton_clone)
       elseif MenuButton_origin == BlzGetTriggerFrame() then
           BlzFrameClick(MenuButton_clone)
       elseif AlliesButton_origin == BlzGetTriggerFrame() then
           BlzFrameClick(AlliesButton_clone)
       elseif ChatButton_origin == BlzGetTriggerFrame() then
           BlzFrameClick(ChatButton_clone)    
       end    
   end
end)    
--отслеживаем клики клавиатурой, короче горячие клавиши кнопок
local trigger_pressed_key = CreateTrigger()
BlzTriggerRegisterPlayerKeyEvent(trigger_pressed_key, Player(0), OSKEY_F9, 0, true)
BlzTriggerRegisterPlayerKeyEvent(trigger_pressed_key, Player(0), OSKEY_F10, 0, true)
BlzTriggerRegisterPlayerKeyEvent(trigger_pressed_key, Player(0), OSKEY_F11, 0, true)
BlzTriggerRegisterPlayerKeyEvent(trigger_pressed_key, Player(0), OSKEY_F12, 0, true)
TriggerAddAction(trigger_pressed_key, function()

   if GetLocalPlayer() == GetTriggerPlayer() then
       print(GetPlayerName(GetTriggerPlayer()).." pressed key: "..GetHandleId(BlzGetTriggerPlayerKey()))
                
       PauseGame = true
       print("Пауза включена")
                
       --вызываем окно через BlzFrameClick
       if GetHandleId(BlzGetTriggerPlayerKey()) == 0x78 then
           BlzFrameClick(QuestButton_clone)
       elseif GetHandleId(BlzGetTriggerPlayerKey()) == 0x79 then
           BlzFrameClick(MenuButton_clone)
       elseif GetHandleId(BlzGetTriggerPlayerKey()) == 0x7A  then
           BlzFrameClick(AlliesButton_clone)
       elseif GetHandleId(BlzGetTriggerPlayerKey()) == 0x7B then
           BlzFrameClick(ChatButton_clone)    
       end    
   end     
end)
--запускаем периодический таймер
--таймер чекает выход из режима паузы, как известно во время паузы приостанавливается работа триггеров.
TimerStart(CreateTimer(),0.03,true,function()
                
   if BlzFrameGetEnable(MenuButton_origin) then
       --DestroyTimer(GetExpiredTimer())
       if PauseGame then
           PauseGame = false
           print("Пауза выключена")
       end
   end
end)
второй способ этой проверять видимость окон таймером. На доли секунд можно зафиксировать видимость окон. И тут же задаем инфу в переменной, что пауза наступила
» lua
    TimerStart(CreateTimer(),0.03,true,function()
        if BlzFrameIsVisible(BlzGetFrameByName("EscMenuBackdrop", 0)) then
            print("меню видно")
        elseif BlzFrameIsVisible(BlzFrameGetChild(gameUI, 7)) then
            print("чат-окно видно")
        elseif BlzFrameIsVisible(BlzGetFrameByName("QuestDialog",0)) then
            print("квест-окно видно")
        elseif BlzFrameIsVisible(BlzGetFrameByName("AllianceBackdrop", 0)) then
            print("альянс-окно видно")
        else
            print("окон не видно")
        end
    end)
» прочий мусор
и другие подделки. не помню для чего. тестил с паузой
» код
f (GetLocalPlayer() == whichPlayer) then
EnableUserControl(true)
if bj_isSinglePlayer then
PauseGame(true)
end
EnableUserUI(false)
end
local MenuButton_origin = BlzGetFrameByName("UpperButtonBarMenuButton",0)

--запускаем периодический таймер
--таймер чекает выход из режима паузы, как известно во время паузы приостанавливается работа триггеров.
TimerStart(CreateTimer(),0.03,true,function()

if BlzFrameGetEnable(MenuButton_origin) then
print("Пауза выключена")
else
print("Пауза включена")
end
end)

Как в мультиплеере убрать паузу?

кратко: в мультиплеере в игре melee-режиме у игрока 2-3 попытки на паузу. А после у игрока не будет шансов использовать паузу.
ссылка


Views: 37

There are no comments yet