Handle:CreateTimer(Float:interval, Timer:TIMER_CallBack, any:data=INVALID_HANDLE, flags=0);
Код
interval - через сколько секунд сработает таймер (если повторяющийся, то будет вызываться каждые interval сек, минимум 0.1)
TIMER_CallBack - функция, которая будет вызвана
any:data - любое число (например, индекс игрока), или Handle DataPack'а
flags - флаги (если их несколько, то через символ |
Функция возвращает Handle таймера, зная который можно его остановить с помощью KillTimer(Handle:timer); (нельзя использовать CloseHandle)
Код
TIMER_REPEAT // повторяющийся таймер, чтобы остановить его, нужно сделать return Plugin_Stop (Plugin_Continue = продолжить выполнение)
TIMER_FLAG_NO_MAPCHANGE // SM сам убьёт (остановит) таймер перед сменой карты
TIMER_HNDL_CLOSE // устарело, не используется
TIMER_DATA_HNDL_CLOSE // После остановки таймера, SM сделает CloseHandle() на том Handle:hVar, что вы передавали (если вы сами сделаете CloseHandle, будет ошибка)
Функции-обработчики таймеров могут быть такими:
Код
public Action:TIMER_CallBack(Handle:timer)
{
return Plugin_Stop;
}
public Action:TIMER_CallBack(Handle:timer, any:data)
{
return Plugin_Stop;
}
public Action:TIMER_CallBack(Handle:timer, Handle:hndl)
{
return Plugin_Stop;
}
Думаю в Handle:hndl нет особого смысла, т.к. и any:data без проблем примет вашу Handle: переменную.
Если вы передали таймеру какое-то значение (any:data), то и используйте функцию с any:data, но даже если вы сделаете так:
Код
CreateTimer(1.0, TIMER_CallBack, 5);
public Action:TIMER_CallBack(Handle:timer)
{
PrintToServer("Это сработает, но доступа к 5, что мы передавали, у нас нет");
return Plugin_Stop;
}
Если ваш таймер повторяющийся (TIMER_REPEAT), то чтобы он продолжил выполняться, сделайте return Plugin_Continue;
Во всех остальных случаях делайте return Plugin_Stop;
Пример с TIMER_DATA_HNDL_CLOSE
Код
public OnPluginStart()
{
new Handle:pack = CreateDataPack();
WritePackCell(pack, 5);
CreateTimer(3.0, Timer_Func, pack, TIMER_FLAG_NO_MAPCHANGE | TIMER_DATA_HNDL_CLOSE); // перед сменой карты будет убит и SM сделает CloseHandle(pack)
}
public Action:Timer_Func(Handle:timer, any:pack)
{
ResetPack(pack);
PrintToServer("-> %d", ReadPackCell(pack));
// Делать CloseHandle(pack) здесь НЕ НУЖНО, иначе увидите ошибку.
}
Приветствие игрока через 15 сек после входа на сервер:
Код
new Handle:g_hTimer[MAXPLAYERS + 1];
public OnClientPutInServer(client)
g_hTimer[client] = CreateTimer(15.0, Hello, client); // Сохраняем Handle таймера
public OnClientDisconnect(client) // Если игрок покидает сервер, не увидев приветствие, то убиваем таймер.
{
if (g_hTimer[client] != INVALID_HANDLE)
{
KillTimer(g_hTimer[client]);
g_hTimer[client] = INVALID_HANDLE;
}
}
public Action:Hello(Handle:timer, any:client)
{
// Сбрасываем Handle таймера на INVALID_HANDLE, чтобы знать, что активного таймера НЕТ.
g_hTimer[client] = INVALID_HANDLE;
// Приветствуем через чат
PrintToChat(client, "Hello, %N!", client);
return Plugin_Stop;
}
Пример повторяющегося таймера:
Код
public OnPluginStart()
CreateTimer(1.0, Timer_Func, _, TIMER_REPEAT);
public Action:Timer_Func(Handle:timer)
{
static x = 0;
if (++x < 10)
{
PrintToServer("-> %d", x);
return Plugin_Continue;
}
return Plugin_Stop;
}