[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » HookEvent - Отлавливаем события (Взято с world-source.ru)
HookEvent - Отлавливаем события
rootДата: Четверг, 31.01.2013, 01:24 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 561
Статус: Offline
http://wiki.alliedmods.net/Game_Events_(Source
С помощью функции HookEvent вы можете ловить любые нужные вам события, например player_death (смерть игрока), round_start (начало раунда) и др. Список всех событий и другую информацию можете найти здесь. Без событий сделать какой-то скрипт просто не получится, так как команды могут быть выполнены только внутри функций, которые вызываются этими событиями.

Существуют и встроенные в SourceMod события, такие как OnMapStartOnPluginStart и др (смотрите в API). Если событие должно отлавливаться постоянно, то обычноHookEvent используют в OnPluginStart, но это можно делать внутри любой функции. Если вы хотите прекратить отлавливать событие, то используйте функциюUnhookEvent (синтаксис такой же, как и в HookEvent).

Код
HookEvent("имя события", <функция/блок для обработки события>, <метод>);


Есть три метода:

EventHookMode_Pre - вызываем функцию до того, как событие произошло
EventHookMode_Post - после того, как оно произошло (по умолчанию)
EventHookMode_PostNoCopy - после того, но без переменных

Пример скрипта, в начале раунда в чате напишет продолжительность раунда в секундах:

Код
#include <sourcemod>                 

public OnPluginStart()                 
{                 
                     HookEvent("round_start", round_start);                 
}                 

public round_start(Handle:event, const String:name[], bool:dontBroadcast)                 
{                 
                     PrintToChatAll("timelimit = %d", GetEventInt(event, "timelimit"));                 
}


В событии round_start доступны три переменные: [ timelimit, fraglimit, objective ].
Список событий и переменных можете найти здесь.

Теперь посмотрим такой вариант:

Код
#include <sourcemod>                 

public OnPluginStart()                 
{                 
                     HookEvent("round_start", round_start, EventHookMode_PostNoCopy);                 
}                 

public round_start(Handle:event, const String:name[], bool:dontBroadcast)                 
{                 
                     PrintToChatAll("timelimit = %d", GetEventInt(event, "timelimit"));                 
}


В этом случае мы не сможем получать переменные события, так как указан метод EventHookMode_PostNoCopy. Так делать полезно только в тех случаях, когда нам просто нужно знать, что событие произошло и не нужно получать его переменные.

Метод EventHookMode_Pre:

Код
#include <sourcemod>                 

public OnPluginStart()                 
{                 
                     HookEvent("round_start", round_start, EventHookMode_Pre);                 
}                 

public Action:round_start(Handle:event, const String:name[], bool:dontBroadcast)                 
{                 
                     PrintToChatAll("timelimit = %d", GetEventInt(event, "timelimit"));                 
                     return Plugin_Continue;                 
}


Блок 'public Action:round_start' выполнится до того, как начнется раунд, но здесь нужно не забывать добавлять приставку Action: и возвращать return Plugin_Continue(продолжить нормальное выполнение) или return Plugin_Handled (заблокировать). На сколько я знаю, сами события заблокировать нельзя, хотя, если вы это сделаете, то не будет никаких уведомлений о том, что оно произошло, например иконка смерти, сообщение о заходе игрока и тд.

Получать переменные событий можно с помощью данных команд:

Код
GetEventBool - получить значение bool (true или false)                 
GetEventInt - целое число                 
GetEventFloat - с точкой                 
GetEventString - строка


Когда плагин отключается, SM сам делает все UnhookEvent и CloseHandle.
 
rootДата: Четверг, 31.01.2013, 01:24 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 561
Статус: Offline
Некоторые встроенные события (public): 

Код
OnPluginStart - скрипт включился  
OnPluginEnd - отключился  
OnMapStart - карта сменилась  
OnMapEnd - карта завершилась (вызывается перед OnMapStart)  
OnGameFrame - каждый тик выполняем команды (66 раз в сек например)  
OnConfigsExecuted  
OnAutoConfigsBuffered  
OnAllPluginsLoaded  
OnLibraryAdded  
OnLibraryRemoved  
OnClientFloodCheck  
OnClientFloodResult  
OnAdminMenuCreated(Handle:topmenu)  
OnAdminMenuReady(Handle:topmenu)  

Action:OnBanClient(client, time, flags, const String:reason[], const String:kick_msg[], const String:cmd[], any:x)  
Action:OnBanIdentity(const String:identity[], time, flags, const String:reason[], const String:cmd[], any:x)  
Action:OnRemoveBan(const String:identity[], flags, const String:cmd[], any:x)  

OnClientCookiesCached(client)  
bool:OnClientConnect(client, String:rejectmsg[], maxlen)  
OnClientConnected(client)  
OnClientPutInServer(client) - игрок вошел на сервер  
OnClientDisconnect(client) - покинул  
OnClientDisconnect_Post(client)  
Action:OnClientCommand(client, args)  
OnClientSettingsChanged(client)  
OnClientAuthorized(client, const String:auth[])  
Action:OnClientPreAdminCheck(client)  
OnClientPostAdminFilter(client)  
OnClientPostAdminCheck(client)  

Action:CS_OnBuyCommand(client, const String:weapon[]) - покупает оружие  
Action:CS_OnCSWeaponDrop(client, weaponIndex) - выбрасывает  
Action:CS_OnGetWeaponPrice(client, const String:weapon[], &price)  
Action:CS_OnTerminateRound(&Float:delay, &CSRoundEndReason:reason)  

OnNominationRemoved(const String:map[], owner)  
OnMapVoteStarted() - mapchooser запускает голосование


Например: 

Код
#include <sourcemod>  

public OnMapStart  
{  
      LogMessage("Сменилась карта");  
}  

public Action:CS_OnBuyCommand(client, const String:weapon[])  
{  
      PrintToChatAll("%N купил %s", client, weapon);  
      return Plugin_Continue;  
}


Подробнее о таких событиях читайте в API (ссылка есть выше).
 
ReespawnДата: Суббота, 31.08.2013, 02:14 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 2
Статус: Offline
что то я не понял для чего это? может мне кто нибудь подробно объяснит а то я как то новичок по созданию сервера CS Source sh_ok
 
ĈỢŇŠỞŁỂДата: Суббота, 31.08.2013, 14:43 | Сообщение # 4
Полковник
Группа: Друзья
Сообщений: 168
Статус: Offline
Цитата (Reespawn)
что то я не понял для чего это? может мне кто нибудь подробно объяснит а то я как то новичок по созданию сервера CS Source
Это для плагинов серверо строитель блеать


 
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » HookEvent - Отлавливаем события (Взято с world-source.ru)
  • Страница 1 из 1
  • 1
Поиск: