Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Поиск

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

  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Форум » SourceMod >> CS:Source >> CSGO » Уроки SourceMod (SourcePawn) Скриптинга » HookEvent, HookEventEx, UnhookEvent - отлавливаем события (Хук/перехват событий)
HookEvent, HookEventEx, UnhookEvent - отлавливаем события
_wS_ Дата: Воскресенье, 28.08.2011, 20:03:23 | Сообщение # 1
Thanks
Полезные ссылки: список событий, другое.

С помощью 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
Thanks
Некоторые встроенные события (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
Thanks
Цитата 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 [ +/- ]


Сообщение отредактировал 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
Сообщений: 142
Репутация: 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>
 
Форум » SourceMod >> CS:Source >> CSGO » Уроки SourceMod (SourcePawn) Скриптинга » HookEvent, HookEventEx, UnhookEvent - отлавливаем события (Хук/перехват событий)
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Поиск: