HookEvent, HookEventEx, UnhookEvent - отлавливаем события
_wS_
Дата: Воскресенье, 28.08.2011, 20:03:23 | Сообщение # 1
Полезные ссылки: список событий , другое . С помощью HookEvent можно перехватить нужные вам события, например, round_start (начало раунда). Без событий сделать какой-то скрипт не получится, т.к. команды выполняются внутри функций, а они вызываются какими-то событиями. Есть и встроенные в SourceMod события, например, OnMapStart , OnPluginStart (смотрите в API , обычно они с префиксом On ). Обычно события перехватывают внутри OnPluginStart . Чтобы отменить перехват, используйте UnhookEvent , но часто это не нужно, т.к. после отключения плагина, SM сам всё отменит. Если не уверены, что событие существует, то, чтобы избежать ошибки, можно использовать HookEventEx , который вернёт true, если перехват удался.Код
native void HookEvent(const char[] name, EventHook callback, EventHookMode mode = EventHookMode_Post) // @param name - имя события, например, round_start. // @param callback - функция, которая будет вызвана, когда событие произойдёт: void (Event event, const char[] name, bool dontBroadcast) // EventHookMode_Post/EventHookMode_PostNoCopy Action (Event event, const char[] name, bool dontBroadcast) // EventHookMode_Pre // @param mode - способ перехвата события: // EventHookMode_Pre - до отправки игрокам уведомления о произошедшем событии. // EventHookMode_Post - после отправки игрокам уведомления о произошедшем событии. // EventHookMode_PostNoCopy - как и EventHookMode_Post, но Event event будет null (никакие переменные не передаются).
Пример 1. В начале раунда в чат пишет время раунда в секундах:Код
public void OnPluginStart()
{
HookEvent("round_start", Event_round_start);
}
// В событии round_start доступны три переменные: timelimit, fraglimit, objective.
//
https://wiki.alliedmods.net/Generic_Source_Events#round_start public void Event_round_start(Event event, const char[] name, bool dontBroadcast)
{
PrintToChatAll("timelimit = %d", event.GetInt("timelimit"));
}
Пример 2. Блокирует уведомление в чате о том, что игрок выбрал/сменил команду:Код
public void OnPluginStart() { HookEvent("player_team", Event_player_team, EventHookMode_Pre); } public Action Event_player_team(Event event, const char[] name, bool dontBroadcast) { // Plugin_Continue = продолжить нормальное выполнение. return Plugin_Handled; }
Получить значения переменных внутри HookEvent-события:Код
native bool GetBool(const char[] key, bool defValue = false); // bool b = event.GetBool("headshot"); native float GetFloat(const char[] key, float defValue = 0.000000); native int GetInt(const char[] key, int defValue = 0); native void GetName(char[] name, int maxlength); // Получить имя события, например, "round_start". native void GetString(const char[] key, char[] value, int maxlength, const char[] defvalue = "");
Если тип перехвата события EventHookMode_Pre или оно было создано (CreateEvent ), то изменять значения переменных можно так:Код
native void SetBool(const char[] key, bool value); // event.SetBool("headshot", true); native void SetFloat(const char[] key, float value) native void SetInt(const char[] key, int value) native void SetString(const char[] key, const char[] value) event.BroadcastDisabled = true или false; // Уведомление о событии для игроков.
Сообщение отредактировал _wS_ - Среда, 21.02.2024, 13:20:39
_wS_
Дата: Понедельник, 09.01.2012, 02:18:58 | Сообщение # 2
Некоторые встроенные события (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 (ссылка есть выше).
Scarface6748
Дата: Четверг, 12.01.2012, 09:50:16 | Сообщение # 3
Сообщений: 737
Репутация: 61 [ +/- ]
если: sv_cheats 1 то: банед игрок читак иначе: игрок без читов Можно ли осуществить такую проверку когда игрок заходит на сервак? только без eventa Смог сделать проверку только через HookEvent("player_spawn", Event_player_spawn); А через что еще такое возможно?только не c помошью отлова события=) просто если ловишь с помошью HookEvent("player_spawn", Event_player_spawn); то если sv_cheats 1 то банед игрок читак иначе игрок без читов вообщем так если проверку делать то "игрок без читов" пишет постоянно когда заново появляешься или в начале раунда)
Сообщение отредактировал Scarface6748 - Четверг, 12.01.2012, 09:59:51
_wS_
Дата: Четверг, 12.01.2012, 20:26:47 | Сообщение # 4
Цитата Scarface6748 ( )
Можно ли осуществить такую проверку когда игрок заходит на сервак? только без eventa
Что значит 'только без eventa'? Команды могут выполняться только при каких-то событиях (event'ах).Код
public OnClientPutInServer(i) { QueryClientConVar(i, "sv_cheats", ConVarQueryFinished:QueryFunc); } public QueryFunc(c:cookie, i, r:result, const String:cName[], const String:cValue[]) { if (StrEqual(cValue, "1")) PrintToChatAll("%N читер", i); }
Вообще, сомневаюсь что все это поможет. Главное, это что в server.cfg у тебя. Если sv_cheats 0, то игроку писать в консоле sv_cheats 1 бесполезно:Код
sv_cheats 1 Can't change replicated ConVar sv_cheats from console of client, only server operator can change its value sv_cheats "sv_cheats" = "0"
И если игрок с читом, это не значит, что его sv_cheats равно 1.
Scarface6748
Дата: Четверг, 12.01.2012, 23:20:40 | Сообщение # 5
Сообщений: 737
Репутация: 61 [ +/- ]
Блин, спасибо тебе большое=)
daniil
Дата: Суббота, 13.04.2013, 13:47:43 | Сообщение # 6
Сообщений: 100
Репутация: 0 [ +/- ]
Как отловить нанос спрея. Хочу звук спрея поменять.
TEIN
Дата: Суббота, 13.04.2013, 14:09:33 | Сообщение # 7
Сообщений: 563
Репутация: 78 [ +/- ]
player_decal ?
Scarface_slv
Дата: Суббота, 13.04.2013, 14:23:55 | Сообщение # 8
Сообщений: 737
Репутация: 61 [ +/- ]
Код
#include <sdktools> public OnPluginStart() AddTempEntHook("Player Decal", Spray); public Action:Spray(const String:TempEntName[], const Clients[], ClientCount, Float:Delay) { new client = TE_ReadNum("m_nPlayer"); if(client > 0 && client <= MaxClients && IsClientInGame(client)) PrintToChat(client, "%N вы нарисовали спрей", client); }
Сообщение отредактировал Scarface_slv - Суббота, 13.04.2013, 14:24:24
daniil
Дата: Суббота, 13.04.2013, 14:27:11 | Сообщение # 9
Сообщений: 100
Репутация: 0 [ +/- ]
Scarface_slv, тут нет замены звука
Scarface_slv
Дата: Суббота, 13.04.2013, 14:28:49 | Сообщение # 10
Сообщений: 737
Репутация: 61 [ +/- ]
Цитата (daniil )
Как отловить нанос спрея
Я ответил на это Цитата (daniil )
Хочу звук спрея поменять.
Если хочешь меняй кто мешает попробовать поменять?
daniil
Дата: Суббота, 13.04.2013, 14:40:03 | Сообщение # 11
Сообщений: 100
Репутация: 0 [ +/- ]
А консольная клиентская команда нанесения спрея какая ?
TEIN
Дата: Суббота, 13.04.2013, 14:46:52 | Сообщение # 12
Сообщений: 563
Репутация: 78 [ +/- ]
impulse 201 наверное
daniil
Дата: Суббота, 13.04.2013, 14:47:48 | Сообщение # 13
Сообщений: 100
Репутация: 0 [ +/- ]
DoK_1997, как одновременно. Только что нашел открыв config.cfg :D
Vitaminoz
Дата: Суббота, 21.12.2013, 20:24:04 | Сообщение # 14
Сообщений: 141
Репутация: 1 [ +/- ]
Написал код: Код
#include <sourcemod> public OnPluginStart() { HookEvent("item_pickup",Event_ItemPickUp,EventHookMode_Pre); } public Action:Event_ItemPickUp(Handle:event,const String:name[],bool:dontBroadcast) { return Plugin_Handled; }
Вопрос : Почему не блокируется Событие "Поднял оружие" ?
MongoL666
Дата: Суббота, 21.12.2013, 22:12:00 | Сообщение # 15
Сообщений: 92
Репутация: -9 [ +/- ]
Vitaminoz, Может потому что ты не подцепил библиотеки??? #include <cstrike> #include <sdktools>