Таймер / Обратный отсчет

Статус
В этой теме нельзя размещать новые ответы.

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
208
Симпатии
5
Пол
Мужской
Всем доброго времени суток, товарищи. Имеется мод со своим сценарием.
Хотел сделать таймер до запуска сценария при спауне 1ого игрока на сервере.
То есть. Заходит первый игрок, после спауна этого игрока вызывается таск на таймер и последовательно после таймера запускается сценарий.
Переменная сценария g_IsGameStarted. Пытался сделать таким макаром:

Код:
#define TIMER_TO_START 45

public RespawnPlayer(id)
{
    if(!g_IsGameStarted)
        new params[1] = {TIMER_TO_START + 1};
        set_task(1.0, "StartTimer", id, params, sizeof(params))

...//далее идет функция респауна
}

public StartTimer(params[], id)
{
        if(GetAlivePlayers() == 0)
        ResetGame();

        esle if(--params[0] > 0)
        {
            set_dhudmessage(255, 255, 0, -1.0, 0.40, 0, 0.1, 1.1, 0.1, -1)
            show_dhudmessage(0, "Игра начнется через %d сек", --params[0]);
            set_task(1.0, "StartTimer", id, params, 1)
        }
        else
        {
            StartGame()
        }
}
Но таймер, почему то, отсчитывает не по секунде, а по две. Не знаю, как это поправить.
И еще, подскажите, как грамотно сделать запуск этого таймера только при коннекте первого игрока? Что бы этот такс игнорировался после запуска, дабы воизбежать накладок запуска сценария при последующих подключениях других игроков? Пропустил запуск таймера через условие if(!g_IsGameStarted), вроде работает, но мне кажется, что это далеко не самое оптимизированное решение и с ним могут быть бока в будущем :) Прошу вашей помощи, гайз :)
 
Последнее редактирование:

Safety1st

Заблокированные
Пользователь
Регистрация
10 Ноя 2017
Сообщения
114
Симпатии
36
Пол
Мужской
В RespawnPlayer(id) надо добавить первым If( is_user_alive(id) ) return, если используется Ham_Spawn: он вызывается для игроков и при входе на сервер. Считает по две, поскольку в StartTimer ты дважды вычитаешь: --params[0].

Вообще алгоритм плохой. Таймер глобальный, его не нужно передавать параметрами. Достаточно одной задачи с флагом 'a' и рандомным идентификатором. При спавне ты можешь проверить её наличие и новую не запускать. При уменьшении на 1 число всегда через 0 проходит, потому в условиях достаточно использовать if (a) вместо if (a > 0).
 
  • Мне нравится
Симпатии: rxki

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
208
Симпатии
5
Пол
Мужской
Safety1st, от души, уже реализовал нормальную работу через случайный идентификатор, как ты написал выше) посмотрел, как сделаны плагинцы авторестарта и вник. Теперь не могу удалить этот таймер при условии, что на сервере нет живых игроков (спектаторы не в счет).
Делаю условие
Код:
public StartTimer()
{
    if(GetAlivePlayers() == 0)
    {
    remove_task(TASK_ID_START_COUNTDOWN)
    ResetGame()
    }

    if(g_start_countdown--)
    {
        set_dhudmessage(255, 255, 0, -1.0, 0.40, 0, 0.1, 1.1, 0.1, 0.1)
        show_dhudmessage(0, "Игра начнется через %d сек", g_start_countdown);
        set_task(1.0, "StartTimer", TASK_ID_START_COUNTDOWN)
    }
    else
    {
            StartGame()
            remove_task(TASK_ID_START_COUNTDOWN)
    }
}
}
public GetAlivePlayers()
{
    new num = 0;
    for(new i = 1 ; i <= g_MaxPlayers; i ++)
    {
        if(is_user_alive(i))
            num++;
    }

    return num;
}
но когда ухожу в наблюдатели - таймер не пропадает...
 

Safety1st

Заблокированные
Пользователь
Регистрация
10 Ноя 2017
Сообщения
114
Симпатии
36
Пол
Мужской
C++:
public StartTimer()
{
    if (!GetAlivePlayers())
    {
        ResetGame()
        return
    }

    if(g_start_countdown--)
    {
        set_dhudmessage(255, 255, 0, -1.0, 0.40, 0, 0.1, 1.1, 0.1, 0.1)
        show_dhudmessage(0, "Игра начнется через %d сек", g_start_countdown);
        set_task(1.0, "StartTimer", TASK_ID_START_COUNTDOWN)
    }
    else
        StartGame()
}
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
208
Симпатии
5
Пол
Мужской
Safety1st, ты мой кайф, ты мой шоколад!
От души, все сработало.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу