|
|
|
| Мониторинг сервов
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
| Связь с Гл.Админом
|
|
|
|
|
|
Выдыхай
Имя: дмитрий
скайп: awp-servers
|
|
|
|
|
|
|
|
|
|
| HookEvent - Отлавливаем события - Форум - unicalsoft-css | сервер - Описание сайта |
|
|
|
| |
|
HookEvent - Отлавливаем события
| |
| выдыхай | Offline Дата: Суббота, 03.08.2013, 10:21 | Сообщение # 1 |
![выдыхай]()
Постов: 64 |
 |
| С помощью функции HookEvent вы можете ловить любые нужные вам события, например player_death (смерть игрока), round_start (начало раунда) и др. Список всех событий и другую информацию можете найти здесь. Без событий сделать какой-то скрипт просто не получится, так как команды могут быть выполнены только внутри функций, которые вызываются этими событиями.
Существуют и встроенные в SourceMod события, такие как OnMapStart, OnPluginStart и др (смотрите в 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.
Прикрепления:
Сообщение отредактировал |
 |
|
|
| выдыхай | Offline Дата: Суббота, 03.08.2013, 10:24 | Сообщение # 2 |
![выдыхай]()
Постов: 64 |
 |
| Некоторые встроенные события (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; }
Прикрепления:
Сообщение отредактировал |
 |
|
|
|
|  |  |
|  |  |
|
|
|
|
| В команде:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Наш сервер:
|
|
|
|
|
|
 |
|
|
|
|
|
|