Заказать Сервер Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

Страница 1 из 3123»
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » HookEvent - Отлавливаем события
HookEvent - Отлавливаем события
_wS_ Дата: Воскресенье, 28.08.2011, 20:03:23 | Сообщение # 1
С помощью функции HookEvent вы можете ловить любые нужные вам события, например player_death (смерть игрока), round_start (начало раунда) и др. Список всех событий и другую информацию можете найти здесь. Без событий сделать какой-то скрипт просто не получится, так как команды могут быть выполнены только внутри функций, которые вызываются этими событиями.

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

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

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

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

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

Code
#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 ].
Список событий и переменных можете найти здесь.

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

Code
#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:

Code
#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 (заблокировать). На сколько я знаю, сами события заблокировать нельзя, хотя, если вы это сделаете, то не будет никаких уведомлений о том, что оно произошло, например иконка смерти, сообщение о заходе игрока и тд.

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

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

Когда плагин отключается, SM сам делает все UnhookEvent и CloseHandle.
 
_wS_ Дата: Понедельник, 09.01.2012, 02:18:58 | Сообщение # 2
Некоторые встроенные события (public):

Code
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 запускает голосование


Например:

Code
#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
Сообщений: 749
Репутация: 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
Quote (Scarface6748)
Можно ли осуществить такую проверку когда игрок заходит на сервак?
только без eventa

Что значит 'только без eventa'? Команды могут выполняться только при каких-то событиях (event'ах).

Code
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 бесполезно:

Code
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
Сообщений: 749
Репутация: 61 [ +/- ]
Блин, спасибо тебе большое=)
 
daniil Дата: Суббота, 13.04.2013, 13:47:43 | Сообщение # 6
Сообщений: 100
Репутация: 0 [ +/- ]
Как отловить нанос спрея. Хочу звук спрея поменять.
 
TEIN Дата: Суббота, 13.04.2013, 14:09:33 | Сообщение # 7
Сообщений: 551
Репутация: 73 [ +/- ]
player_decal ?
 
Scarface_slv Дата: Суббота, 13.04.2013, 14:23:55 | Сообщение # 8
Сообщений: 749
Репутация: 61 [ +/- ]


Сообщение отредактировал 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
Сообщений: 749
Репутация: 61 [ +/- ]
Цитата (daniil)
Как отловить нанос спрея
Я ответил на это
Цитата (daniil)
Хочу звук спрея поменять.
Если хочешь меняй кто мешает попробовать поменять?
 
daniil Дата: Суббота, 13.04.2013, 14:40:03 | Сообщение # 11
Сообщений: 100
Репутация: 0 [ +/- ]
А консольная клиентская команда нанесения спрея какая ?
 
TEIN Дата: Суббота, 13.04.2013, 14:46:52 | Сообщение # 12
Сообщений: 551
Репутация: 73 [ +/- ]
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
Сообщений: 135
Репутация: 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
Репутация: -7 [ +/- ]
Vitaminoz, Может потому что ты не подцепил библиотеки???
#include <cstrike>
#include <sdktools>
 
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » HookEvent - Отлавливаем события
Страница 1 из 3123»
Поиск: