Заказать Сервер Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

Страница 1 из 11
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Таймер (Выполнить команду через время)
Таймер
_wS_ Дата: Среда, 30.11.2011, 18:12:36 | Сообщение # 1
Handle:CreateTimer(Float:interval, Timer:func, any:data=INVALID_HANDLE, flags=0);

Code
interval - через сколько секунд сработает таймер
func - функция, которая будет вызвана
any:data - любое число (например, индекс игрока), или Handle DataPack'а
flags - флаги (если их несколько, то через символ |

Функция возвращает Handle таймера, зная который можно его остановить с помощью KillTimer(Handle:timer);

Code
В таких случаях:

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, чтобы пак закрылся автоматически, после смерти таймера, например:

Code
#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 сек после входа на сервер:

Code
#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;
}
 
_wS_ Дата: Понедельник, 09.01.2012, 01:26:19 | Сообщение # 2
Можно запускать повторяющийся таймер:

Code
#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 значит, что таймер остановится после смены карты. Если хотите указать несколько флагов сразу, то их надо перечислить через символ |

Code
CreateTimer(2.0, Timer_Func, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
 
_wS_ Дата: Воскресенье, 13.05.2012, 23:55:09 | Сообщение # 3
Ещё есть 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 пака закрывается само, после остановки (убийства) таймера.
     return Plugin_Stop;
}
 
Vitaminoz Дата: Понедельник, 03.02.2014, 22:49:04 | Сообщение # 4
Сообщений: 139
Репутация: 1 [ +/- ]
Вопрос:
CloseHandle() надо делать, если таймер мы используем через Handle
Код
new Handle:h_timer = CreateTimer(...);

Или даже если такой код:
Код
CreateTimer(...)

То потом в конце CallBack делать CloseHandle(); - без аргументов ...
 
Geny Дата: Пятница, 14.03.2014, 11:00:56 | Сообщение # 5
Сообщений: 111
Репутация: 0 [ +/- ]
Код
public OnPluginStart()  
{  
      CreateTimer(90.0, Rekl_Func, _, TIMER_REPEAT);  
}
public Action:Rekl_Func(Handle:timer)  
{  
     PrintToChatAll("1");  
  return Plugin_Continue;  
}

На сколько опасна вот такого рода запись? Т.е таймер не выключиться НИКОГДА... серер в один прекрасный момент не загнется?
 
BarD Дата: Пятница, 14.03.2014, 11:28:15 | Сообщение # 6
Сообщений: 944
Репутация: 132 [ +/- ]
Нет, после смены карты все таймеры киляются и Handle закрываются!
 
dron216 Дата: Пятница, 14.03.2014, 12:38:06 | Сообщение # 7
Сообщений: 152
Репутация: 18 [ +/- ]
Уверен что остановится?
Цитата
Флаг TIMER_FLAG_NO_MAPCHANGE значит, что таймер остановится после смены карты.

Только после рестарта он по идее остановится


Сообщение отредактировал dron216 - Пятница, 14.03.2014, 12:38:42
 
BarD Дата: Среда, 18.06.2014, 12:07:53 | Сообщение # 8
Сообщений: 944
Репутация: 132 [ +/- ]
Согласен. Поправка: В данном случае остановятся)

Добавлено (18.06.2014, 12:07:53)
---------------------------------------------
А где можно посмотреть список всех флагов для таймера?

 
Darkeneez Дата: Среда, 18.06.2014, 15:11:10 | Сообщение # 9
Сообщений: 222
Репутация: 18 [ +/- ]
Код
#define TIMER_REPEAT   (1<<0)  /**< Timer will repeat until it returns Plugin_Stop */
#define TIMER_FLAG_NO_MAPCHANGE    (1<<1)  /**< Timer will not carry over mapchanges */
#define TIMER_HNDL_CLOSE  (1<<9)  /**< Deprecated define, replaced by below */
#define TIMER_DATA_HNDL_CLOSE  (1<<9)  /**< Timer will automatically call CloseHandle() on its data when finished */
 
BarD Дата: Среда, 18.06.2014, 17:53:16 | Сообщение # 10
Сообщений: 944
Репутация: 132 [ +/- ]
Спасибо)
 
olegseton Дата: Воскресенье, 30.04.2017, 21:20:17 | Сообщение # 11
Сообщений: 10
Репутация: 0 [ +/- ]
Можете добавить таймер? (то есть что бы оверлей отображался 3 секунды)
Вот плагин

Прикрепления: OverlayRoundEnd.sp(2Kb)
 
_wS_ Дата: Воскресенье, 30.04.2017, 23:35:56 | Сообщение # 12
.

Прикрепления: 1686908.sp(2Kb)
 
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Таймер (Выполнить команду через время)
Страница 1 из 11
Поиск: