[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Таймеры в SourcePawn
Таймеры в SourcePawn
rootДата: Воскресенье, 03.02.2013, 11:03 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 561
Статус: Offline
Таймеры в SourcePawn

Введение
Таймер позволяет задать интервал, после окончания которого можно будет выполнить определенную функцию.
Все функции таймера можно посмотреть в файле timers.inc (scripting/include)

Основы использования

Одноразовые таймеры
Данный таймер будет выполняться 1 раз
PHP код:
public OnPluginStart() 
{ 
   
CreateTimer(5.0, LoadStuff); 
} 
  
public 
Action:LoadStuff(Handle:timer) 
{ 
   
PrintToServer("Loading stuff!"); 
}
Данный код будет писать в консоль сервера Loading stuff!, по прошествии 5 секунд

Повторяющиеся таймеры
Повторяющиеся таймеры могут выполняться бесконечное число раз через определенный промежуток времени
Например, отобразим сообщение пять раз через интервал равный трем секундам
PHP код:
DoMessage() 
{ 
   
CreateTimer(3.0, PrintMsg, _, TIMER_REPEAT); 
} 
  
public 
Action:PrintMsg(Handle:timer) 
{ 
   static 
NumPrinted = 0 
   
if (NumPrinted++ >= 5) 
   { 
      
PrintToServer("Warning! This is a message."); 
      
NumPrinted = 0 
  
      
return Plugin_Stop 
   
} 
  
   return 
Plugin_Continue 
}
Plugin_Stop останавливает таймер, а PLUGIN_CONTINUE позволяет ему продолжать работать


Передача данных

Простые значения
Таймеры способны передавать значения в функцию обратного вызова. Это значение может быть любого типа.
Например, покажем сообщение игроку через 15 секунд после подключения на сервер
PHP код:
#define MAX_PLAYERS 256 
  
new Handle:WelcomeTimers[MAX_PLAYERS+1] 
  
public 
OnClientPutInServer(client) 
{ 
   
WelcomeTimers[client] = CreateTimer(15.0, WelcomePlayer, client); 
} 
  
public 
OnClientDisconnect(client) 
{ 
   if (
WelcomeTimers[client] != INVALID_HANDLE) 
   { 
      
KillTimer(WelcomeTimers[client]); 
      
WelcomeTimers[client] = INVALID_HANDLE 
   
} 
} 
  
public 
Action:WelcomePlayer(Handle:timer, any:client) 
{ 
   
PrintToConsole(client, "Welcome to the server!");
Пакеты данных

Пакеты данных Packable структур, которые могут быть использованы для проведения асинхронных данных (данные, которые должны быть сохранены и без упаковки позже). Они особенно полезны для таймеров. Следовательно, существует вспомогательная функция, называемая CreateDataTimer (), которая создает таймер с помощью дескриптора данных пакета. Handle создается и закрывается автоматически.

Приведенный выше пример был переписан так:
PHP код:
#define MAX_PLAYERS 256 
  
new Handle:WelcomeTimers[MAX_PLAYERS+1] 
  
public 
OnClientPutInServer(client) 
{ 
   new 
Handle:pack 
   WelcomeTimers
[client] = CreateDataTimer(15.0, WelcomePlayer, pack); 
   
WritePackCell(pack, client); 
   
WritePackString(pack, "Welcome to the server!"); 
} 
  
public 
OnClientDisconnect(client) 
{ 
   if (
WelcomeTimers[client] != INVALID_HANDLE) 
   { 
      
KillTimer(WelcomeTimers[client]); 
      
WelcomeTimers[client] = INVALID_HANDLE 
   
} 
} 
  
public 
Action:WelcomePlayer(Handle:timer, Handle:pack) 
{ 
   
decl String:str[128] 
   new 
client 
  
   
/* Set to the beginning and unpack it */ 
   
ResetPack(pack) 
   
client = ReadPackCell(pack) 
   
ReadPackString(pack, str, sizeof(str)); 
  
   
PrintToConsole(client, "%s", str); 
   
WelcomeTimers[client] = INVALID_HANDLE 
}
Примечания

Точность
Наименьший возможный интервал 0,1 секунды. Таймер имеют высокую точность (с плавающей запятой), но низкую точность, как текущее время на сервере. 
Это имеет два последствия:
  • Если сервер стоит на паузе - таймер не будет работать.
  • Сервер не всегда будет повторять все в точном интервале

Смерть таймера
Все таймеры гарантированно будут убиты, когда:
  • Используется CloseHandle ();
  • Используется KillTimer ();
  • Используется Plugin_Stop в повторяющихся таймерах;
  • Используется TriggerTimer () в одноразовых таймерах;
  • Исполняется одноразовый таймер
При смерти таймера, если TIMER_HNDL_CLOSE установлено, то Handle будут закрыты с разрешениями, CloseHandle () используется по умолчанию. Так как таймер не может быть клонирован.

Оригинал
 
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Таймеры в SourcePawn
  • Страница 1 из 1
  • 1
Поиск: