Неправильно работает таймер

xtance

Участник
Сообщения
513
Реакции
743
Хочу создать повторяющийся таймер, который будет автоматически убиваться на следующем раунде.

Делаю указатель :
C-подобный:
new Handle:hTimerDecider;

Ловлю начало раунда :
C-подобный:
public void OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart, EventHookMode_Post);
}

Убиваю таймер и начинаю его заново :
C-подобный:
public Action Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    PrintToConsoleAll("Начался новый раунд");
    if (hTimerDecider != INVALID_HANDLE) 
    { 
        PrintToConsoleAll("Сейчас будем убивать таймер");
        KillTimer(hTimerDecider); //Почему-то таймер таки не убивается
        hTimerDecider = INVALID_HANDLE; 
    } 
    hTimerDecider = CreateTimer(3.0, rTimerDecider, _, TIMER_REPEAT); 
    return Plugin_Handled;
}

public Action rTimerDecider(Handle timer)
{
    static int iTimerCounter = 0;
    if (iTimerCounter == 10)
    {
        iTimerCounter = 0;
        hTimerDecider = INVALID_HANDLE; 
        return Plugin_Stop;
    }
    iTimerCounter++;
    PrintToConsoleAll("Таймер сработал %i раз", iTimerCounter);
    return Plugin_Continue;
}

Но в итоге таймер так и остаётся и не убивается. =(
Что в этом коде не так. Сижу уже пятый час, прочитал все темы об этих таймерах, что были.
--- Добавлено позже ---
Придумал костыль. Как вы думаете, вредит ли такое серверу? Но вообще, мне бы хотелось разобраться до конца, как же работать с таймерами.
Оффтоп
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
Попробуй так:
PHP:
Handle hTimerDecider;

public void OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    PrintToChatAll("Начался новый раунд");
    if(hTimerDecider != null)
    {
        PrintToChatAll("Сейчас будем убивать таймер");
        KillTimer(hTimerDecider); //Почему-то таймер таки не убивается
        hTimerDecider = null;
    }
    else PrintToChatAll("Таймер не существует");
    hTimerDecider = CreateTimer(3.0, rTimerDecider, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}

public Action rTimerDecider(Handle timer)
{
    static int iTimerCounter = 1;

    PrintToChatAll("Таймер сработал %i-й раз", iTimerCounter++);

    if(iTimerCounter > 9)
    {
        iTimerCounter = 1;
        hTimerDecider = null;
        return Plugin_Stop;
    }
    return Plugin_Continue;
}
 

xtance

Участник
Сообщения
513
Реакции
743
Спасибо большое :ab: Работает отлично. Только счётчик iTimerCounter пришлось сделать глобальным - не знаю почему. Ну, главное что работает.
Игрокам наверно понравится, ибо от моего костыля лагал сервер.
 
Сверху Снизу