[OS] Overlay System

[OS] Overlay System 2.5

suremiur

♂ overlay master ♂
Сообщения
537
Реакции
586
@Emptyc Да, занесла нелёгкая!)
Давай тогда вызовем @Rostu, там делов на 6 строк, только ему все это будет удобнее сделать, чем мне. Брат, выручай людей. <3
 

Rostu

Добрая душа
Сообщения
986
Реакции
622
@Emptyc, Если еще актуально, то должно помочь

Квары
sm_spec_overlay_enable
sm_spec_path_overlay
 

Вложения

  • OverlaySystem.sp
    12.2 КБ · Просмотры: 16

k31z1

Участник
Сообщения
106
Реакции
2
Здравствуйте. Помогите пожалуйста. Установил этот плагин, но он не работает, в консоле пишет:

Error reading file resource/flash/undefined_small.png.
KeyValues Error: LoadFromBuffer: missing { in file materials/overlay/k31z.vmt line 2

KeyValues Error: LoadFromBuffer: missing { in file materials/overlay/k31z.vmt line 4

KeyValues Error: LoadFromBuffer: missing { in file materials/overlay/k31z.vmt line 5

KeyValues Error: LoadFromBuffer: missing { in file materials/overlay/k31z.vmt line 6
 

Хан

Участник
Сообщения
310
Реакции
99
Здравствуйте. Помогите пожалуйста. Установил этот плагин, но он не работает, в консоле пишет:

Error reading file resource/flash/undefined_small.png.
KeyValues Error: LoadFromBuffer: missing { in file materials/overlay/k31z.vmt line 2

KeyValues Error: LoadFromBuffer: missing { in file materials/overlay/k31z.vmt line 4

KeyValues Error: LoadFromBuffer: missing { in file materials/overlay/k31z.vmt line 5

KeyValues Error: LoadFromBuffer: missing { in file materials/overlay/k31z.vmt line 6
Ошибка в оверлее
 

ALSHiN

Участник
Сообщения
222
Реакции
14
А можно сделать, чтобы всегда показывался баннер с рекламой? Или может это другой плагин какой-то?
 

ALSHiN

Участник
Сообщения
222
Реакции
14
ставим баннер при появлении на 2930290 секунд.
upload_2019-6-26_21-1-15.png
сделал вот так, было просто 0.0, но оверлей пропадал , с 2930290 секунд прокатит? Если макс написано 30 *_*
--- Добавлено позже ---
а вывод сообщений с рекламы типа C , которые по середине экрана появляются, могут убирать баннер?
--- Добавлено позже ---
не понимаю почему пропадает оверлей, один тестирую все ок, заходит еще пару человек и начинается( как только заходит еще один человек на серв, оверлей пропадает у меня, у него появляется, потом тоже пропадает, если я себя убиваю, то оверлей возвращается при возрождении, но серв бхоп, поэтому что-то не то
 

Вложения

  • upload_2019-6-26_21-1-50.png
    upload_2019-6-26_21-1-50.png
    45.5 КБ · Просмотры: 22
Последнее редактирование:

gtixon

Участник
Сообщения
1,078
Реакции
401
сделал вот так, было просто 0.0, но оверлей пропадал , с 2930290 секунд прокатит? Если макс написано 30 *_*
--- Добавлено позже ---
а вывод сообщений с рекламы типа C , которые по середине экрана появляются, могут убирать баннер?
--- Добавлено позже ---
не понимаю почему пропадает оверлей, один тестирую все ок, заходит еще пару человек и начинается( и начинается вроде все при смене карты
Баннер убирают только другие баннеры, есть пагин при попадании делает красную обводку у прицела - это мини оверлей, из-за него пропадает.

Можно засунуть что бы этот оверлей показывало при смерти, в конце раунда, при спавне - и он точно не будет выключаться. И не 392482 сек, а 0 - навсегда
 

ALSHiN

Участник
Сообщения
222
Реакции
14
Баннер убирают только другие баннеры, есть пагин при попадании делает красную обводку у прицела - это мини оверлей, из-за него пропадает.

Можно засунуть что бы этот оверлей показывало при смерти, в конце раунда, при спавне - и он точно не будет выключаться. И не 392482 сек, а 0 - навсегда
сейчас все включу, просто проблема в том, что сервер bhop , тут карты по 20+ минут и люди 20 + минут не умирают и т.д.((( но и плагина прицела тоже нет
--- Добавлено позже ---
вообщем потестил, все было включено, сижу один на сервере, все ок, заходит второй игрой пропадает кот, пока не убьешь себя и не возродишься заново (((( у игрока тоже самое, при смене карты, как карта сменяется, захожу я значит один - все ок, заходит второй игрок, все , пропадает оверлей, менялись местами с игроком, он заходит первый на серв, у него есть кот, захожу потом я, кот у него пропадает, у меня есть, что делац? Есть идеи?
--- Добавлено позже ---
такая же история и со вторым подобным серверов, отличие их лишь в том, что один у себя на пк, второй на myarena
--- Добавлено позже ---
и с некоторыми вип настройками похожая проблема, меняется карта, пока игрок их в вип меня не выкл и не включить обратно, не заработает, но если он умрет и восстановится, то все ок
 
Последнее редактирование:

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
Выпала ошибочка, решил пробежать по коду ;)
Ошибочка
PHP:
[SM] Exception reported: Client index 0 is invalid
[SM] Blaming: OverlaySystem.smx
[SM] Call stack trace:
[SM]   [0] ClientCommand
[SM]   [1] Line 345, \OverlaySystem.sp::ShowDeathOverlayToClient
[SM]   [2] Line 235, \OverlaySystem.sp::Timer_Death

Причина ошибочки, не верное условие в таймере выше:
PHP:
public Action Timer_Death(Handle hTimer, int iUserId)
{
    int iClient = GetClientOfUserId(iUserId);
    float l_TimerPostOverlay = g_cDeathOverlayPostTimer.FloatValue;
 
    if (iClient && !IsPlayerAlive(iClient)) // Если игрок 0, то идем дальше ;)
    {
        return Plugin_Continue;
    }
    if (l_TimerPostOverlay == 0.0)
    {
        ShowDeathOverlayToClient(iClient);
    }
    if (l_TimerPostOverlay > 0.0)
    {
        CreateTimer(l_TimerPostOverlay, Timer_PostOverlay, iUserId, TIMER_FLAG_NO_MAPCHANGE);
    }
    return Plugin_Continue;
}
Вероятно должно быть так:
PHP:
public Action Timer_Death(Handle hTimer, int iUserId)
{
    int iClient = GetClientOfUserId(iUserId);
    float l_TimerPostOverlay = g_cDeathOverlayPostTimer.FloatValue;
 
    if (!iClient || IsPlayerAlive(iClient)) // Если игрок 0 или он жив, то прерываем
    {
        return Plugin_Continue;
    }
 
    if (l_TimerPostOverlay == 0.0)
    {
        ShowDeathOverlayToClient(iClient);
    }
    if (l_TimerPostOverlay > 0.0)
    {
        CreateTimer(l_TimerPostOverlay, Timer_PostOverlay, iUserId, TIMER_FLAG_NO_MAPCHANGE);
    }
    return Plugin_Continue;
}
-------------------------------
Немного того, как я бы подредактировал код ;)
PHP:
if ( sBuffer[0]  && sBuffer[0] != '/' && sBuffer[1] != '/' )
Можно заменить на
PHP:
if ( !sBuffer[0]  || sBuffer[0] == '/' || sBuffer[1] == '/' ){ continue; }
В SP условие ИЛИ работает по упрощенной схеме (Наглядный пример: Пример для уроков 6 и 7 из личной практики.), но это не главная причина, просто проще читается код, когда условия везде по одному типу, кто понял о чем я, тот понял ;-)
PHP:
public void Event_PlayerTeam(Event hEvent, const char[] sName, bool bDontBroadcast)
{
    int iUserId = hEvent.GetInt("userid");
    int iClient = GetClientOfUserId(iUserId);
    int OldTeam = GetEventInt(hEvent, "oldteam");
    if (OldTeam == 0)
    {
        g_bJoinOverlay[iClient] = true;
    }
}
Нет необходимости создавать переменную iUserId, она используется только один раз.
PHP:
public void Event_PlayerTeam(Event hEvent, const char[] sName, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    int OldTeam = GetEventInt(hEvent, "oldteam");
    if (OldTeam == 0)
    {
        g_bJoinOverlay[iClient] = true;
    }
}
Тоже лишние переменные
PHP:
public void OnClientPostAdminCheck(int iClient)
{
    int iUserId = GetClientUserId(iClient);
    int l_EnableOverlayWelcome = g_cWelcomeOverlay.IntValue;
    float l_TimerWelcomeOverlay = g_cWelcomeOverlayTimer.FloatValue;
    GetConVarString(g_cFlagHide, g_szFlag, sizeof(g_szFlag));
    if(!iClient || IsFakeClient(iClient) || CheckAdminFlags(iClient, ReadFlagString(g_szFlag)))
    {
        return;
    }
    if(l_EnableOverlayWelcome == 1 && l_TimerWelcomeOverlay > 0.0)
        {
            g_hKillWelcomeTimer[iClient] = CreateTimer(10.0, Timer_ToWelcome, iUserId, TIMER_FLAG_NO_MAPCHANGE);
        }
}
-->
PHP:
public void OnClientPostAdminCheck(int iClient)
{
    GetConVarString(g_cFlagHide, g_szFlag, sizeof(g_szFlag));
    if(!iClient || IsFakeClient(iClient) || CheckAdminFlags(iClient, ReadFlagString(g_szFlag)))
    {
        return;
    }
    if(g_cWelcomeOverlay.IntValue == 1 && g_cWelcomeOverlayTimer.FloatValue > 0.0)
        {
            g_hKillWelcomeTimer[iClient] = CreateTimer(10.0, Timer_ToWelcome, GetClientUserId(iClient), TIMER_FLAG_NO_MAPCHANGE);
        }
}
И в блоке Timer_ToWelcome, можно сделать так
PHP:
public Action Timer_ToWelcome (Handle hTimer, int iUserId)
{
    int iClient = GetClientOfUserId(iUserId);
    if (!iClient) { return Plugin_Stop; }
 
    ShowWelcomeOverlayToClient(iClient);
    CreateTimer(g_cWelcomeOverlayTimer.FloatValue, Timer_WelcomeOverlay, iUserId, TIMER_FLAG_NO_MAPCHANGE);
 
    if( g_cWelcomeOverlay.IntValue == 1 && g_hKillWelcomeTimer[iClient])
    {
        KillTimer(g_hKillWelcomeTimer[iClient]);
        g_hKillWelcomeTimer[iClient] = null;
    }
    return Plugin_Stop;
}
В Timer_WelcomeOverlay можно не создавать дополнительные переменные, например
PHP:
public Action Timer_WelcomeOverlay(Handle hTimer, int iData)
{
    iData = GetClientOfUserId(iData);
 
    if (!iData || g_hKillSpawnTimer[iData]) { return Plugin_Stop; }
 
    ResetOverlayToClient(iData);
 
    return Plugin_Stop;
}
В Event_PlayerDeath опять же лишнее переменные, они используются только по одному разу
PHP:
    int l_EnableOverlayDeath = g_cDeathOverlay.IntValue;
    int l_EnableOverlaySpawn = g_cSpawnOverlay.IntValue;
Тут можно не создавать iClient, а также проверка !IsFakeClient(iClient) не нужна, так как выше уже есть проверка на бота
PHP:
public Action Timer_Spawn(Handle hTimer, int iUserId)
{
    int iClient = GetClientOfUserId(iUserId);
 
    if ((iClient) && !IsFakeClient(iClient))
    {
        ResetOverlayToClient(iClient);
    }
    g_hKillSpawnTimer[iClient] = null;
    return Plugin_Stop;
}
------------------------
Не претендую на качество, мог и сам допустить опитяпки или косяки ;-)
--- Добавлено позже ---
Кстати, только заметил. Почему-то в таймере возвращается Plugin_Continue, хотя обычно Plugin_Stop . Так и было задумано?
 

Вложения

  • OverlaySystem.sp
    11.1 КБ · Просмотры: 14

ALSHiN

Участник
Сообщения
222
Реакции
14
Хм, так и не нашел решения проблемы, что при входе игрока на сервер баннер пропадает и остается только у игрока, который только что зашле
Как только раунд перезапускается - все ок у всех ,пока не зайдет новый игрок на сервер. Кто-то сталкивался?
На бхоп и сюрф серверах получается баннер виден только последнему игроку, который зашел на сервер )
 

DarkEssence

Участник
Сообщения
206
Реакции
3
Выпала ошибочка, решил пробежать по коду ;)
Ошибочка
PHP:
[SM] Exception reported: Client index 0 is invalid
[SM] Blaming: OverlaySystem.smx
[SM] Call stack trace:
[SM]   [0] ClientCommand
[SM]   [1] Line 345, \OverlaySystem.sp::ShowDeathOverlayToClient
[SM]   [2] Line 235, \OverlaySystem.sp::Timer_Death

Причина ошибочки, не верное условие в таймере выше:
PHP:
public Action Timer_Death(Handle hTimer, int iUserId)
{
    int iClient = GetClientOfUserId(iUserId);
    float l_TimerPostOverlay = g_cDeathOverlayPostTimer.FloatValue;

    if (iClient && !IsPlayerAlive(iClient)) // Если игрок 0, то идем дальше ;)
    {
        return Plugin_Continue;
    }
    if (l_TimerPostOverlay == 0.0)
    {
        ShowDeathOverlayToClient(iClient);
    }
    if (l_TimerPostOverlay > 0.0)
    {
        CreateTimer(l_TimerPostOverlay, Timer_PostOverlay, iUserId, TIMER_FLAG_NO_MAPCHANGE);
    }
    return Plugin_Continue;
}
Вероятно должно быть так:
PHP:
public Action Timer_Death(Handle hTimer, int iUserId)
{
    int iClient = GetClientOfUserId(iUserId);
    float l_TimerPostOverlay = g_cDeathOverlayPostTimer.FloatValue;

    if (!iClient || IsPlayerAlive(iClient)) // Если игрок 0 или он жив, то прерываем
    {
        return Plugin_Continue;
    }

    if (l_TimerPostOverlay == 0.0)
    {
        ShowDeathOverlayToClient(iClient);
    }
    if (l_TimerPostOverlay > 0.0)
    {
        CreateTimer(l_TimerPostOverlay, Timer_PostOverlay, iUserId, TIMER_FLAG_NO_MAPCHANGE);
    }
    return Plugin_Continue;
}
-------------------------------
Немного того, как я бы подредактировал код ;)
PHP:
if ( sBuffer[0]  && sBuffer[0] != '/' && sBuffer[1] != '/' )
Можно заменить на
PHP:
if ( !sBuffer[0]  || sBuffer[0] == '/' || sBuffer[1] == '/' ){ continue; }
В SP условие ИЛИ работает по упрощенной схеме (Наглядный пример: Пример для уроков 6 и 7 из личной практики.), но это не главная причина, просто проще читается код, когда условия везде по одному типу, кто понял о чем я, тот понял ;-)
PHP:
public void Event_PlayerTeam(Event hEvent, const char[] sName, bool bDontBroadcast)
{
    int iUserId = hEvent.GetInt("userid");
    int iClient = GetClientOfUserId(iUserId);
    int OldTeam = GetEventInt(hEvent, "oldteam");
    if (OldTeam == 0)
    {
        g_bJoinOverlay[iClient] = true;
    }
}
Нет необходимости создавать переменную iUserId, она используется только один раз.
PHP:
public void Event_PlayerTeam(Event hEvent, const char[] sName, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    int OldTeam = GetEventInt(hEvent, "oldteam");
    if (OldTeam == 0)
    {
        g_bJoinOverlay[iClient] = true;
    }
}
Тоже лишние переменные
PHP:
public void OnClientPostAdminCheck(int iClient)
{
    int iUserId = GetClientUserId(iClient);
    int l_EnableOverlayWelcome = g_cWelcomeOverlay.IntValue;
    float l_TimerWelcomeOverlay = g_cWelcomeOverlayTimer.FloatValue;
    GetConVarString(g_cFlagHide, g_szFlag, sizeof(g_szFlag));
    if(!iClient || IsFakeClient(iClient) || CheckAdminFlags(iClient, ReadFlagString(g_szFlag)))
    {
        return;
    }
    if(l_EnableOverlayWelcome == 1 && l_TimerWelcomeOverlay > 0.0)
        {
            g_hKillWelcomeTimer[iClient] = CreateTimer(10.0, Timer_ToWelcome, iUserId, TIMER_FLAG_NO_MAPCHANGE);
        }
}
-->
PHP:
public void OnClientPostAdminCheck(int iClient)
{
    GetConVarString(g_cFlagHide, g_szFlag, sizeof(g_szFlag));
    if(!iClient || IsFakeClient(iClient) || CheckAdminFlags(iClient, ReadFlagString(g_szFlag)))
    {
        return;
    }
    if(g_cWelcomeOverlay.IntValue == 1 && g_cWelcomeOverlayTimer.FloatValue > 0.0)
        {
            g_hKillWelcomeTimer[iClient] = CreateTimer(10.0, Timer_ToWelcome, GetClientUserId(iClient), TIMER_FLAG_NO_MAPCHANGE);
        }
}
И в блоке Timer_ToWelcome, можно сделать так
PHP:
public Action Timer_ToWelcome (Handle hTimer, int iUserId)
{
    int iClient = GetClientOfUserId(iUserId);
    if (!iClient) { return Plugin_Stop; }

    ShowWelcomeOverlayToClient(iClient);
    CreateTimer(g_cWelcomeOverlayTimer.FloatValue, Timer_WelcomeOverlay, iUserId, TIMER_FLAG_NO_MAPCHANGE);

    if( g_cWelcomeOverlay.IntValue == 1 && g_hKillWelcomeTimer[iClient])
    {
        KillTimer(g_hKillWelcomeTimer[iClient]);
        g_hKillWelcomeTimer[iClient] = null;
    }
    return Plugin_Stop;
}
В Timer_WelcomeOverlay можно не создавать дополнительные переменные, например
PHP:
public Action Timer_WelcomeOverlay(Handle hTimer, int iData)
{
    iData = GetClientOfUserId(iData);

    if (!iData || g_hKillSpawnTimer[iData]) { return Plugin_Stop; }

    ResetOverlayToClient(iData);

    return Plugin_Stop;
}
В Event_PlayerDeath опять же лишнее переменные, они используются только по одному разу
PHP:
    int l_EnableOverlayDeath = g_cDeathOverlay.IntValue;
    int l_EnableOverlaySpawn = g_cSpawnOverlay.IntValue;
Тут можно не создавать iClient, а также проверка !IsFakeClient(iClient) не нужна, так как выше уже есть проверка на бота
PHP:
public Action Timer_Spawn(Handle hTimer, int iUserId)
{
    int iClient = GetClientOfUserId(iUserId);

    if ((iClient) && !IsFakeClient(iClient))
    {
        ResetOverlayToClient(iClient);
    }
    g_hKillSpawnTimer[iClient] = null;
    return Plugin_Stop;
}
------------------------
Не претендую на качество, мог и сам допустить опитяпки или косяки ;-)
--- Добавлено позже ---
Кстати, только заметил. Почему-то в таймере возвращается Plugin_Continue, хотя обычно Plugin_Stop . Так и было задумано?
по-моему редактированный плагин не хочет загружать оверлей из файла overlay_downloads.ini, дефолтный загрузил на ура *_*
Сообщения автоматически склеены:

Когда заходит новый игрок пропадет оверлей у всех, пока не начнется другой раунд(
 
Последнее редактирование:

suremiur

♂ overlay master ♂
Сообщения
537
Реакции
586
.news
Дорогие пользователи моего плагина!
Да, я знаю что он несовершенен и во множество раз его можно сократить, но это была моя первая работа, которая получила огромную поддержку от вас, и потому - обещаю его обновить, вновь вникнуть, добавить новых функций:
от минимальной системы оповещений (звуки к оверлеям), до новых вариаций показа оверлея.

Дайте только время, как минимум приду из армии через 17 дней и начну вникать во все обновления произошедшие с движком, играми и мелочами! :)

Благодарю всех, кто пользуется им вплоть до нынешних времен!
Еще спасибо всем, кто помогает новым пользователям с настройкой, вы прекрасны!

Не забывайте перед установкой читать инструкции, всех целую!

Те, кто хотят помочь, можете присылать в личку пожелания и ошибки, все сделаю ;)

оверлей гуру - suremiur
 

SLAME

Флуд/Оффтоп
Сообщения
351
Реакции
222
.news
Дорогие пользователи моего плагина!
Да, я знаю что он несовершенен и во множество раз его можно сократить, но это была моя первая работа, которая получила огромную поддержку от вас, и потому - обещаю его обновить, вновь вникнуть, добавить новых функций:
от минимальной системы оповещений (звуки к оверлеям), до новых вариаций показа оверлея.

Дайте только время, как минимум приду из армии через 17 дней и начну вникать во все обновления произошедшие с движком, играми и мелочами! :)

Благодарю всех, кто пользуется им вплоть до нынешних времен!
Еще спасибо всем, кто помогает новым пользователям с настройкой, вы прекрасны!

Не забывайте перед установкой читать инструкции, всех целую!

Те, кто хотят помочь, можете присылать в личку пожелания и ошибки, все сделаю ;)

оверлей гуру - suremiur

Я, конечно, плагины не пишу, но может мне кто-то объяснить

C-подобный:
// Время в секундах СКОЛЬКО показывать оверлей игроку после смерти. Где 0.0 - показывать оверлей на все время пока игрок мертв.
// -
// Default: "0.0"
// Minimum: "0.000000"
// Maximum: "20.000000"
sm_death_overlay_time "2.0"
Вот тут есть таймер для оверлея. У меня он прописан на "2.0", а показывается до окончания раунда и не пропадает, что делать ?. В чем разница вообще между "2.0", 2.0, "2", 2 ?
Я пробовал все варианты цифры 2, все равно не убирается он через 2 секунды, а показывается всегда...
 
Последнее редактирование:

Boxmode

Участник
Сообщения
111
Реакции
8
Почему не работает? Файлы скачались с сервера, пути прописаны все. В чем проблема?
 

LEII4A

Участник
Сообщения
741
Реакции
135
Del.

Upd. Решил попробовать залить на фастд без архивации. Текстуры все равно скачиваются не в изначальном размере. Странно. Как будто битые. Плагин то работает, но с загрузкой текстур какая то беда.
Проблема решена
 
Последнее редактирование:

SLAME

Флуд/Оффтоп
Сообщения
351
Реакции
222
На моем сервере было много проблем с этим плагином, которые я писал выше. Решилось все одним способом, изменением квара sv_pure в sefver.cfg. И отображается адекватно, и таймер работает и убирается (не багается).
 

LEII4A

Участник
Сообщения
741
Реакции
135
На моем сервере было много проблем с этим плагином, которые я писал выше. Решилось все одним способом, изменением квара sv_pure в sefver.cfg. И отображается адекватно, и таймер работает и убирается (не багается).
у меня был баг не с плагином вовсе, а с архивацией текстуры. Она будто билось и после распаковки весила гораздо меньше изначального размера. Я был удивлен, потому, что и так есть плагин для оверлеев в конце раунда и там всё исправно. Грешил на этот плаг и был не прав. Я на впс сделал автоархивацию фастд при заливки) И оно так за архивировало криво. Отсюда и были проблемы.
 

suremiur

♂ overlay master ♂
Сообщения
537
Реакции
586
Приветствую всех, кто еще использует этот плагин!
Понемногу начинаю его дорабатывать, исправлять какие-либо моменты и прочее. Но тестирую не в полном объеме, просто на локалке. Ни сервера нет, ни времени, т.к. работа.
На сегодняшний день добавил оверлеи для победивших команд и звуки для победы. (Я знаю что много серверов использует RES, либо другие подобные плагины, но кому-то может понадобиться.)

Прошу откликнуться и написать что еще хотите видеть в данном плагине.

В планах:
- Меню администратора для управления оверлеями. (Показать какой-то из оверлеев, какому-либо игроку, либо всем)
- Добавить оверлей для наблюдателей.
- Добавить возможность VIP отключать какие-либо оверлеи (в конце раунда, постоянный оверлей, и т.п.)
- Добавить оверлей при заходе администратора. (по просьбе т.к. конструкция не тяжелая и сервер не нагрузит - может кому-то понадобиться)


Отдельно ищу тестеров, кто сможет накатить новую версию и проверить на какие-либо конфликты.
Отозвавшихся отблагодарю в виде упоминания и своим чистым уважением.


Делать плагин модульным в ближайшее время не собираюсь, переходить на KeyValues тоже.
 
Сверху Снизу