Invalid timer handle (error 1)

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

Young <

Now, finally free
Сообщения
1,263
Реакции
505
Сломал уже себе голову, не могу понять в чем причина.

Жизненный цикл таймера:


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

Handle
    hWatcher;

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

public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    if(hWatcher)
    {
        KillTimer(hWatcher);//Агрится на эту
        hWatcher = null;
    }
    hWatcher = CreateTimer(5.0, Timer_Watcher, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}

public Action Timer_Watcher(Handle hTimer)
{
    for (int i = 1; i <= MaxClients; i++)
    if (IsClientConnected(i) && !IsFakeClient(i) && !bPlayed[i] && IsPlayerAlive(i))
        bPlayed[i] = true;
}

public void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    if(hWatcher)
    {
        KillTimer(hWatcher);//и на эту
        hWatcher = null;
    }
    for (int i = 1; i <= MaxClients; i++)
        if (bPlayed[i])
            bPlayed[i] = false;
}

мб кто заметит в чем косяк
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,920
  • Команда форума
  • #2
Таймер "умерщвляется" в конце карты, и никто его в конце карты не занулливает.
 
Решение

Jugheadbomb

CTFPlayer
Сообщения
168
Реакции
24
@Young <, думаю, можно вот так:

Code:
#include <sdktools>

bool bPlayed[MAXPLAYERS+1];

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

public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    CreateTimer(5.0, Timer_Watcher, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}

public Action Timer_Watcher(Handle hTimer)
{
    if (GameRules_GetRoundState() == RoundState_TeamWin)
    {
        for (int i = 1; i <= MaxClients; i++)
        {
            if (bPlayed[i])
                bPlayed[i] = false;
        }

        return Plugin_Stop;
    }

    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientConnected(i) && !IsFakeClient(i) && !bPlayed[i] && IsPlayerAlive(i))
            bPlayed[i] = true;
    }

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

Grey83

не пишу плагины с весны 2022
Сообщения
8,534
Реакции
4,993
Как-то так:
C-подобный:
bool
    bPlayed[MAXPLAYERS+1];

Handle
    hWatcher;

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

public void OnMapEnd()
{
    if(hWatcher) delete hWatcher;
}

public void Event_Round(Event event, const char[] name, bool dontBroadcast)
{
    OnMapEnd()
    if(name[6] == 's') hWatcher = CreateTimer(5.0, Timer_Watcher, _, TIMER_REPEAT);
    else for(int i = 1; i <= MaxClients; i++) bPlayed[i] = false;
}

public Action Timer_Watcher(Handle hTimer)
{
    for(int i = 1; i <= MaxClients; i++) if(!bPlayed[i] && IsClientInGame(i) && !IsFakeClient(i) && IsPlayerAlive(i))
        bPlayed[i] = true;
}
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу