root | Дата: Четверг, 31.01.2013, 01:24 | Сообщение # 1 |
Генералиссимус
Группа: Администраторы
Сообщений: 561
Статус: Offline
| http://wiki.alliedmods.net/Game_Events_(Source С помощью функции 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.
|
|
| |
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
|
|
| |
ĈỢŇŠỞŁỂ | Дата: Суббота, 31.08.2013, 14:43 | Сообщение # 4 |
Полковник
Группа: Друзья
Сообщений: 168
Статус: Offline
| Цитата (Reespawn) что то я не понял для чего это? может мне кто нибудь подробно объяснит а то я как то новичок по созданию сервера CS Source Это для плагинов серверо строитель блеать
|
|
| |