кратко: это поможет отследить паузу игры. Паузу можно отследить в сингл-плеере, т.е. в одиночной игре. Там сразу когда заходишь в меню, журнал, либо открываешь альянс-окно или квест-окно у вас игра автоматически паузится, и весь интерфейс затемняется. короче паузу можно 4 системными кнопками вызвать.
Примечание: когда игра паузится, триггеры перестают работать во время паузы. И поэтому во время паузы нельзя проверить ничего. Точно не уверен, но кажется таймеры во время паузы перестают работать. Иначе бы давно проверил. Поэтому надо успеть вовремя зафиксировать до паузы
В мультиплеере все устроено по-другому, там игра не затемняет интерфейс, не паузится при открытии окон, но в меню есть кнопка “Пауза игры/Возобновить игру”, вызывающая паузу игры. В melee-сражениях у игрока 2-3 попытки на паузу.
local PauseButton = BlzGetFrameByName("PauseButton",0) - но эту кнопку я так и не смог зарегистрировать, тк кнопка является потомком других фреймов, поэтому ее не достать, она пустая. В мультиплеере этот способ с проверкой открытия окон будет фиксировать лишь открытия окон меню, и не более. Поэтому ко всему сказанному выше в мультиплеере, да и во в синглеплеере отслеживание паузы теряет смысла, оно бессмысленно
Примечание: когда игра паузится, триггеры перестают работать во время паузы. И поэтому во время паузы нельзя проверить ничего. Точно не уверен, но кажется таймеры во время паузы перестают работать. Иначе бы давно проверил. Поэтому надо успеть вовремя зафиксировать до паузы
В мультиплеере все устроено по-другому, там игра не затемняет интерфейс, не паузится при открытии окон, но в меню есть кнопка “Пауза игры/Возобновить игру”, вызывающая паузу игры. В 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
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)
--запускаем периодический таймер
--таймер чекает выход из режима паузы, как известно во время паузы приостанавливается работа триггеров.
TimerStart(CreateTimer(),0.03,true,function()
if BlzFrameGetEnable(MenuButton_origin) then
print("Пауза выключена")
else
print("Пауза включена")
end
end)
Как в мультиплеере убрать паузу?
кратко: в мультиплеере в игре melee-режиме у игрока 2-3 попытки на паузу. А после у игрока не будет шансов использовать паузу.
ссылка
ссылка
Ред. Brilock
Ред. Brilock