Для примера, воспользуемся событием weapon_fire из Left 4 Dead, которое говорит нам о том, что игрок выстрелил из оружия.
Его структура:
userid short User ID игрока, который стрелял weapon string Название использованного оружия weaponid short ID использованного оружия count short Количество пуль
В первом столбике у нас название параметра, во втором его тип, в третьем - пояснение. Итак, данное событие позволяет нам узнать user id игрока, который стрелял, название оружия, ID оружия и количество пуль. Для отлова события в SourceMod существует функция:
- Код: Выделить всё
native HookEvent(const String:name[], EventHook:callback, EventHookMode:mode=EventHookMode_Post);
Первый аргумент name - это название события, второй callback - вызываемая функция, третий mode - тип хука.
Типы бывают:
- EventHookMode_Pre - хукать событие перед
- EventHookMode_Post - хукать событие после
- Код: Выделить всё
native bool:HookEventEx(const String:name[], EventHook:callback, EventHookMode:mode=EventHookMode_Post);
Отличие первой и второй функции состоит только в том, что вторая проверяет, а есть ли данное событие в игре и если его нету, то возвращает false (ложь).
Существует также обратная по действию функция:
- Код: Выделить всё
native UnhookEvent(const String:name[], EventHook:callback, EventHookMode:mode=EventHookMode_Post);
С помощью которой мы можем прекратить отлов какого-либо события.
Примерный плагин, который будет отлавливать событие weapon_fire и сообщать в чат: кто стрелял и из какого оружия.
- Код: Выделить всё
#include <sourcemod> // включаем файл sourcemod.inc
public Plugin:myinfo = // регистрация плагина
{
name = "Weapon Fire", // название плагина
author = "DJ_WEST", // автор плагина
description = "Hook weapon_fire event", // описание плагина
version = 1.0, // версия плагина
url = "http://amx-x.ru" // сайт плагина
}
public OnPluginStart() // когда плагин загрузился
{
// после запуска события weapon_fire запускаем нашу функцию Event_Weapon_Fire
HookEvent("weapon_fire", Event_Weapon_Fire)
}
public Event_Weapon_Fire(Handle:event, const String:name[], bool:dontBroadcast)
{
// объявляем необходимые переменные
new i_UserID, String: s_Name[32], String: s_Weapon[32], i_Client
// получаем из нашего события userid игрока и сохраняем его в i_UserID
i_UserID = GetEventInt(event, "userid")
// получаем id игрока по его userid и сохраняем его в i_Client
i_Client = GetClientOfUserId(i_UserID)
// получаем ник игрока по его id и сохраняем в s_Name
GetClientName(i_Client, s_Name, sizeof(s_Name))
// получаем из нашего события weapon и сохраняем его в s_Weapon
GetEventString(event, "weapon", s_Weapon, sizeof(s_Weapon))
// выводим сообщение в чат всем игрокам на сервере
PrintToChatAll("Player %s fire with %s", s_Name, s_Weapon)
}
Как видно из нашего примера после того, как будет запущено событие weapon_fire в игре, запустится наша функция Event_Weapon_Fire. Для получения данных из события существуют следующие функции:
- GetEventBool(Handle:event, const String:key[]) - для получения данных булевого типа
- GetEventInt(Handle:event, const String:key[]) - для получения данных числового типа
- GetEventFloat(Handle:event, const String:key[]) - для получения данных числового типа с плавающей точкой
- GetEventString(Handle:event, const String:key[], String:value[], maxlength) - для получения данных строкового типа