Invalid timer handle (error 3) during timer end

SHAREN

Servers-Info.Ru
Сообщения
232
Реакции
32
Написал такой плагин (в исходнике вырезал лишнее) который каждый раунд через 80 секунд делает предупреждение в HintText и отсчитывает ежесекундно.

Но в логах всегда появляется такая ошибка. Прошу помочь решить эту проблему, а т.ж. напишите если есть замечание по коду, может есть что лишнее.

Plugin "jail_announcer.smx" encountered error 23: Native detected error
Invalid timer handle 7d741a13 (error 3) during timer end, displayed function is timer callback, not the stack trace
Unable to call function "LeaveTimeRepeat" due to above error(s).
PHP:
int g_iSeconds                = -1;
Handle hTimerLeave            = null;

Handle hTimerLeaveRepeat    = null;        // ежесекундно

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

public Action eV_round_start(Handle event, const char[] name, bool DB)
{
    if(hTimerLeave         != null)        delete hTimerLeave;
    hTimerLeave            = CreateTimer(80.0, LeaveTimeStart, TIMER_DATA_HNDL_CLOSE|TIMER_FLAG_NO_MAPCHANGE);
}

public Action LeaveCheckJRepeat(Handle timer)
{
    if(false) {
        return Plugin_Handled;
    }
    for (int i=1; i<MAXPLAYERS; i++)
        if (IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2 )
            return Plugin_Handled;
    return Plugin_Continue;
}

public Action LeaveTimeStart(Handle timer)
{
    hTimerLeave = null;
    if (false) {
        hTimerLeaveRepeat = CreateTimer(1.0, LeaveTimeRepeat, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
        g_iSeconds = 10;
    }
}

public Action LeaveTimeRepeat(Handle timer)
{
    if(!g_iSeconds) {
        KillTimer(hTimerLeaveRepeat);
        delete hTimerLeaveRepeat;
        g_iSeconds = -1;
        return Plugin_Handled;
    } else if (g_iSeconds > 0) {
        g_iSeconds--;
        for(int i=1; i<MAXPLAYERS; i++)
            if(IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 3)
                PrintHintText(i, "ТЕКСТ (%i сек)", g_iSeconds);
    }
    return Plugin_Continue;
}
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Зачем это ещё? Где 3 аргумент тогда? Plugin_Handled в таймерах не бывает. В общем, либо это злостный огрызок, либо всё плохо. Нужен более полный код функций.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Около того. Дальше сам справишься.
 

Вложения

  • jail_announcer.rar
    1.1 КБ · Просмотры: 34

SHAREN

Servers-Info.Ru
Сообщения
232
Реакции
32
@AlmazON,
Около того. Дальше сам справишься.
Большое спасибо, а то я с таймерами никогда не дружил.:good2:
--- Добавлено позже ---
L 02/19/2017 - 00:54:42: [SM] Exception reported: Handle c5a01b76 is invalid (error 1)
L 02/19/2017 - 00:54:42: [SM] Blaming: jail_announcer.smx
L 02/19/2017 - 00:54:42: [SM] Call stack trace:
L 02/19/2017 - 00:54:42: [SM] [0] CloseHandle
L 02/19/2017 - 00:54:42: [SM] [1] Line 28, /home/renat/GIT/announcer/scripting/jail_announcer.sp::eV_round_start

Походу перед delete hTimerCheckJRepeat; все таки нужно делать проверку if(hTimerCheckJRepeat != null)
 
Последнее редактирование:

Nekro

Терра инкогнита
Сообщения
4,032
Реакции
2,276
Судя по Timers (SourceMod Scripting) - AlliedModders Wiki
А именно

C-подобный:
public void OnClientDisconnect(int client)
{
 delete WelcomeTimers[client];
 
    /**
 * 'delete handle;' equates to:
 * if (handle != null) {
 * CloseHandle(handle);
 * handle = null;
 * }
 */
}
То проверять излишне?

C-подобный:
if(hTimer[client])
    {
        delete hTimer[client];
    }
И так тоже

C-подобный:
if(hTimer[client])
    {
        delete hTimer[client];
        hTimer[client] = null;
    }
Будет вполне достаточно
C-подобный:
 delete hTimer[client];
 
Сверху Снизу