[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Таймер (Выполнить команду через время Взято с world-source.ru)
Таймер
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 пака создается и закрывается автоматически  
}
 
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Таймер (Выполнить команду через время Взято с world-source.ru)
  • Страница 1 из 1
  • 1
Поиск: