}{0TT@6bI4Jewill, с такой функцией не сталкивался, надо потестить. Идея перспективная, кроме одного пункта: зачем отслеживать выход из окна? Если мы не имеем возможности определить, из какого именно, то и смысла большого в действии нет...
Приведу некоторый пример, можно сказать псевдокодом. Моменты времени я решил не засекать,а засекать их условно, нам абсолютное время тут и правда совсем ни к чему.
Поправьте, если я где-то упустил логику - не особо детали продумывал, просто как принцип. Это не сказать что первостепенной важности задача, но если функция проверки показа сообщений работает по принципу "Если видишь сообщение - увидеть ещё одно не можешь", то это открывает возможности безболезненно писать скрипты на вышеупомянутые шахты,
гарнизоны, фактории(К примеру проверять, была ли приобретена та или иная боевая машина) и так далее.
-- Где угодно определенные переменные, желательно для каждого из игроков отдельно. --
WINDOW_CLOSED = nil;
WINDOW_NAME = "";
-------------------------------------------------------------------------
Trigger(OBJECT_TOUCH_TRIGGER,"mine_name","myCallback")
----------Предположим, мы где-то вызывали системное сообщение. -----------------
----------Например, подойдя к шахте. В принципе можно и не по конкретному имени вешать триггер -------
----------------- Я так написал просто для примера -------------
--В целом, так как у каждого строения вызывающего поп-апы(Или любые окна взаимодействия) есть TYPE,---------
----то можно повешать такой скрипт на все строения на карте в отдельном файле ----
---- Про собственные окна я ничего не говорю, их и ежу понятно как обработать. ----
---- Что до города, то, конечно,это темный лес, в котором я не сведущ, да и не очень интересно. Но работать такой принцип там не будет. ---.
function myCallback(heroname,obj) --- Функция колбека одна на любое из строений,т.к всё что она делает - пускает другой код в ход
local player = detectInteractor(heroname) -- тут просто определение игрока по герою.(Выдумал функцию, реализуется очень просто)
WINDOW_NAME = "MINE_WINDOW"
startThread(checkWindowState,player);
end;
function checkWindowState(player)
while(CanShowPlayer(player) == nil) do
sleep(2);
end;
WINDOW_CLOSED = not nil;
end;
function windowClosed()
while(1) do
sleep(3);
if(WINDOW_CLOSED ~= nil) then
--------Перебор вызовов по WINDOW_NAME --------
if(WINDOW_NAME == 'MINE_WINDOW') then
--- Вызов соответствующей функции,в ней поток на закрытие окна запустим заново----
--- В этой же функции обнуляем наши переменные, перед запуском потока -----
break;
end;
end;
end;
end;
startThread(windowClosed);