Как остановить (удалить) глобальный таймер

Dragokas

Добрая душа
Сообщения
229
Реакции
213
Тогда если внутри OnPlayerCheckHP() вы не делаете ничего странного с хендлом таймера, то непонятно почему так.
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Тогда если внутри OnPlayerCheckHP() вы не делаете ничего странного с хендлом таймера, то непонятно почему так.
Только проверяю у кого из игроков меньше ХП.
Попробуйте сделать два таймера повторяющих.
Первый таймер запускает второй таймер если первый меньше 0.0 и сразу обнуляем и останавливаем первый таймер.
 
Последнее редактирование:

xstage

🏹
Сообщения
726
Реакции
754
Привет всем, скажите а это нормально что калбек в ошибке не правильное название?
Удаляю таймер в конце раунда и карты.
SM 1.11

C-подобный:
[SM] Plugin "[OS]FightArenaV2.smx" encountered error 23: Native detected error
[SM] Invalid timer handle adc0046c (error 3) during timer end, displayed function is timer callback, not the stack trace
[SM] Unable to call function ".9576.Timer_Duration" due to above error(s).

//
//
//
//============================
//Продолжительность битвы(игры)
//============================
void OnTimerDuration()
{
    g_hGameDuration.GetValue(g_sGameName, g_fTimeDuration);
    if(g_fTimeDuration > 0.0)
    {
        delete g_hTimerDuration;
        g_hTimerDuration = CreateTimer(1.0, Timer_Duration, _, TIMER_REPEAT);
        PrintHintTextToAll("● %s ●\n==============================\n● До конца битвы %.1f сек ●\n==============================", g_sGameName, g_fTimeDuration);
    }
}

Action Timer_Duration(Handle timer)
{
    g_fTimeDuration -= 1.0;
    PrintHintTextToAll("● %s ●\n==============================\n● До конца битвы %.1f сек ●\n==============================", g_sGameName, g_fTimeDuration);

    if(g_fTimeDuration <= 0.0)
    {
        OnPlayerCheckHP();

        g_hTimerDuration = null;
        return Plugin_Stop;
    }

    return Plugin_Continue;
}
C:
Action Timer_Duration(Handle timer)
{
    g_fTimeDuration -= 1.0;
    PrintHintTextToAll("● %s ●\n==============================\n● До конца битвы %.1f сек ●\n==============================", g_sGameName, g_fTimeDuration);

    if(g_fTimeDuration <= 0.0)
    {
        g_hTimerDuration = null;
        OnPlayerCheckHP();
        
        return Plugin_Stop;
    }

    return Plugin_Continue;
}
 
Последнее редактирование:

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
C-подобный:
Action Timer_Duration(Handle timer)
{
    g_fTimeDuration -= 1.0;
    PrintHintTextToAll("● %s ●\n==============================\n● До конца битвы %.1f сек ●\n==============================", g_sGameName, g_fTimeDuration);

    g_hTimerDuration = null;

    if(g_fTimeDuration <= 0.0)
    {
        OnPlayerCheckHP();
       
        return Plugin_Stop;
    }

    return Plugin_Continue;
}
Почему так должно, есть объяснение ?
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
@Dragokas, Да все так же как и в 1 посту, в конце раунда и конце карты.

C-подобный:
public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    delete g_hTimerDuration;
}


public void OnMapEnd()
{
    delete g_hTimerDuration;
}
delete он вроде и каляет таймеры и нулит их сразу же, тебе нужно просто их обнулять каждый раз
 

xstage

🏹
Сообщения
726
Реакции
754
Почему так должно, есть объяснение ?
Я не много поправил. Как уже говорили, лучше обнулять таймер намного выше, в твоем случае в начале условия. Сам столкнулся с такой же проблемой:

Вот код выхода из таймера в callback'e:
C-подобный:
        // ....
        else
        {
            ForcePlayerSuicide(client);

            g_hTimer[client] = null;
            return Plugin_Stop;
        }

Как итог его работы:
C-подобный:
[SM] Plugin "*****.smx" encountered error 23: Native detected error
[SM] Invalid timer handle 424003ec (error 3) during timer end, displayed function is timer callback, not the stack trace
[SM] Unable to call function "Timer_UpdateTime" due to above error(s).

Переносим обнуление выше убийства игрока, ошибка пропадает:
C-подобный:
        // ....
        else
        {
            g_hTimer[client] = null;

            ForcePlayerSuicide(client);
            return Plugin_Stop;
        }
 
Сверху Снизу