Обратный отсчёт

Nekro

Терра инкогнита
Сообщения
4,042
Реакции
2,295
Приветствую, подскажите.
Есть команда, активация который запускает таймер. Вопрос, как узнать сколько осталось времени до старта таймера?


C-подобный:
Handle hTimerCmd[MAXPLAYERS+1];

public void OnPluginStart()
{
    RegConsoleCmd("sm_cmd", cmd);
}

public Action cmd(int iClient, any args)
{
    hTimerCmd[iClient] = CreateTimer(100.0, TimerCmd, iClient);
}

public Action TimerCmd(Handle hTimer, int iClient)
{
    PrintToChat(iClient, "Время истекло");
}
 

Tomiks

Участник
Сообщения
419
Реакции
288
Самое первое что приходит в голову - создать таймер на 1.0 секунду, который будет это считать(ну получается два таймера одновременно).
А так вроде бы в апи сурсмода нельзя получить то, сколько прошло с момента старта таймера.

Ещё один вариант - записываешь через GetTime() время запуска таймера и где надо делаешь GetTime() - записанное_время_старта_таймера; и получаешь сколько секунд прошло, только таким образом доли секунд не посмотреть
 

Nekro

Терра инкогнита
Сообщения
4,042
Реакции
2,295
Самое первое что приходит в голову - создать таймер на 1.0 секунду, который будет это считать(ну получается два таймера одновременно).
А так вроде бы в апи сурсмода нельзя получить то, сколько прошло с момента старта таймера.

Ещё один вариант - записываешь через GetTime() время запуска таймера и где надо делаешь GetTime() - записанное_время_старта_таймера; и получаешь сколько секунд прошло, только таким образом доли секунд не посмотреть
C-подобный:
int[] iTimeCmd = new int[MaxClients + 1];
if(bEnable[iClient]) iTimeCmd[iClient] = GetTime();
PrintHintText(iClient, "Вам необходимо выждать [%d] секунд", GetTime() - iTimeCmd[iClient]);
Выдаёт огромные значения
Сообщения автоматически склеены:

Проблема была в локальном массиве
 
Последнее редактирование:

romeo7

Участник
Сообщения
189
Реакции
93
Countdown:
Handle g_hTimerCmd[MAXPLAYERS+1];
int g_iCountdown[MAXPLAYERS+1];

public void OnPluginStart()
{
    RegConsoleCmd("sm_cmd", cmd);
}

public Action cmd(int iClient, any args)
{
    g_iCountdown[iClient] = 100;
 
    if(g_hTimerCmd[iClient] != INVALID_HANDLE)
    {
        KillTimer(g_hTimerCmd[iClient]);
        g_hTimerCmd[iClient] = INVALID_HANDLE;
    }
    g_hTimerCmd[iClient] = CreateTimer(1.0, TimerCmd, GetClientUserId(iClient), TIMER_REPEAT);
}

public Action TimerCmd(Handle hTimer, int userid)
{
    int iClient = GetClientOfUserId(userid);
 
    if(iClient)
    {
        g_iCountdown[iClient]--;
    
        if(g_iCountdown[iClient] <= 0)
        {
            // Your code here
            PrintToChat(iClient, "Время истекло");
        
            g_hTimerCmd[iClient] = INVALID_HANDLE;
            return Plugin_Stop;
        }
    
        PrintHintText(iClient, "Вам необходимо выждать [%i] секунд", g_iCountdown[iClient]);
    }
 
    return Plugin_Continue;
}
 
Последнее редактирование:

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
@romeo7, В твоем исполнение таймеру требуется устанавливать время 1.0 иначе оно не будет работать как ты задумал, точнее будет но с задержкой в 100 секунд.
Убивать таймер через delete/killtimer внутри самого таймера нельзя.
C-подобный:
Handle g_hTimerCmd[MAXPLAYERS+1];
int g_iCountdown[MAXPLAYERS+1];

public void OnPluginStart()
{
    RegConsoleCmd("sm_cmd", cmd);
}

public Action cmd(int iClient, any args)
{
    g_iCountdown[iClient] = 100;
 
    if(g_hTimerCmd[iClient] != null)
        delete g_hTimerCmd[iClient]

    g_hTimerCmd[iClient] = CreateTimer(1.0, TimerCmd, GetClientUserId(iClient), TIMER_REPEAT);
}

public Action TimerCmd(Handle hTimer, int UserId)
{
    int iClient = GetClientOfUserId(UserId);
    if(!iClient)
        return Plugin_Stop;

    if(--g_iCountdown[iClient] > 0)
    {
        PrintHintText(iClient, "Вам необходимо выждать [%i] секунд", g_iCountdown[iClient]);
        return Plugin_Continue;
    }

    PrintToChat(iClient, "Время истекло");

    g_hTimerCmd[iClient] = null;
    return Plugin_Stop;
}
 

romeo7

Участник
Сообщения
189
Реакции
93
@romeo7, требуется устанавливать время 1.0
забыл изменить
Сообщения автоматически склеены:

@romeo7, Убивать таймер через delete/killtimer внутри самого таймера нельзя.
Зачем? Скопировал этот код из старого рабочего плагина и не хотел тратит время для Plugin_Stop.
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
Зачем? Скопировал этот код из старого рабочего плагина и не хотел тратит время для Plugin_Stop.
а потом придёшь жаловаться на ошибки в логах?
Тем более там у тебя return;, хотя должен возращаться Action.
 

Madness aka null138

Участник
Сообщения
713
Реакции
739
C++:
// время допустим 61.5 секунд.

static float endTime;

function()
{
    endTime = GetGameTime() + 61.5;
    CreateTimer(61.5, TimerFunction, _, TIMER_FLAG_NO_MAPCHANGE);
}

// получить оставщееся время

float timeLeft = endTime - GetGameTime();
print("%f", timeLeft);
 
Сверху Снизу