root | Дата: Воскресенье, 03.02.2013, 01:13 | Сообщение # 1 |
Генералиссимус
Группа: Администраторы
Сообщений: 561
Статус: Offline
| Handle:CreateTimer(Float:interval, Timer:func, any:data=INVALID_HANDLE, flags=0);
Код interval - через сколько секунд сработает таймер func - функция, которая будет вызвана any:data - любое число (например, индекс игрока), или Handle DataPack'а flags - флаги (если их несколько, то через символ | Функция возвращает Handle таймера, зная который можно его остановить с помощью KillTimer(Handle:timer);
Код В таких случаях:
CreateTimer(1.0, Timer_Func); CreateTimer(1.0, Timer_Func, _, флаги); CreateTimer(1.0, Timer_Func, INVALID_HANDLE, флаги);
Функция выглядит так:
public Action:Timer_Func(Handle:timer) {
}
В других, например: CreateTimer(1.0, Timer_Func, client);
Так:
public Action:Timer_Func(Handle:timer, any:value) {
} Делать return Plugin_Stop; (стоп) или return Plugin_Continue; (продолжить) нужно лишь тогда, когда таймер был создан с флагом TIMER_REPEAT (повторяющийся). Если вы хотите использовать DataPack в таком таймере, то обязательно добавьте флаг TIMER_DATA_HNDL_CLOSE, чтобы пак закрылся автоматически, после смерти таймера, например:
Код #include <sourcemod>
public OnPluginStart() { new Handle:pack = CreateDataPack(); WritePackCell(pack, 5); CreateTimer(1.0, Timer_Func, pack, TIMER_DATA_HNDL_CLOSE); }
public Action:Timer_Func(Handle:timer, any:pack) { ResetPack(pack); PrintToServer("-> %d", ReadPackCell(pack));
// делать CloseHandle(pack) здесь НЕ НУЖНО }
Пример скрипта. Приветствие игрока через 15 сек после входа на сервер:
Код #include <sourcemod>
new Handle:wS_Timer[MAXPLAYERS+1];
public OnClientPutInServer(client) { // Сохраняем Handle таймера wS_Timer [client]= CreateTimer(15.0, wS_Hello, client); }
// Если игрок покидает сервер, не увидев приветствие, то убиваем таймер.
public OnClientDisconnect(client) { if (wS_Timer [client]!= INVALID_HANDLE) { KillTimer(wS_Timer[client]); wS_Timer [client]= INVALID_HANDLE; } }
public Action:wS_Hello(Handle:timer, any:client) { // Приветствуем через чат PrintToChat(client, "Hello, %N!", client);
// Сбрасываем Handle таймера на INVALID_HANDLE, чтобы знать, что активного таймера НЕТ. wS_Timer [client]= INVALID_HANDLE; } Можно запускать повторяющийся таймер:
Код #include <sourcemod>
public OnPluginStart() { CreateTimer(2.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; }
Флаг TIMER_REPEAT значит, что функция Timer_Func будет вызываться через каждые две секунды, пока не будет сделано return Plugin_Stop; или отключится скрипт.return Plugin_Continue; значит 'продолжить'.
Флаг TIMER_FLAG_NO_MAPCHANGE значит, что таймер остановится после смены карты. Если хотите указать несколько флагов сразу, то их надо перечислить через символ|
Код CreateTimer(2.0, Timer_Func, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
Ещё есть CreateDataTimer, специально для DataPack (в него можно упаковывать разные типы данных). Но в этом случае не нужно делать CreateDataPack(), делают так:
Код new Handle:pack; CreateDataTimer(10.0, xz_Func, pack);
// и ниже можно добавлять данные в пак: WritePackCell(pack, 5);
// А внутри функции:
public Action:xz_Func(Handle:timer, Handle:pack) { ResetPack(pack); new x = ReadPackCell(pack); PrintToServer("x = %d", x);
// Handle пака создается и закрывается автоматически }
|
|
| |