Русское сообщество по скриптингу

Отлов событий в игре (events)

Статьи или фрагменты кода для новичков и уже опытных скриптеров по SourceMod.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по SourceMod.

Отлов событий в игре (events)

Сообщение DJ_WEST » 10 сен 2009, 08:17

События - это то, что уже произошло, то есть имело место в прошедшем времени. Другими словами, к примеру, если мы хотим заблокировать стрельбу по своим путем хука события стрельбы по своим, а затем использовании в нем return Plugin_Handled, то у нас ничего не выйдет. Мы не можем остановить действие события, потому что оно уже произошло. Все, что мы можем это отловить событие после его запуска и получить какие-то данные, которые у него есть.

Для примера, воспользуемся событием 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) - для получения данных строкового типа
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3649
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2173 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Отлов событий в игре (events)

Сообщение LLInH9rA » 30 май 2013, 20:52

HookEvent("weapon_fre", Event_Weapon_Fire)

weapon_fire
Аватара пользователя
LLInH9rA
 
Сообщения: 395
Зарегистрирован: 19 фев 2011, 16:57
Откуда: Ступино
Благодарил (а): 13 раз.
Поблагодарили: 66 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life
Sven Co-Op 4.8
C#
PHP5

Re: Отлов событий в игре (events)

Сообщение Ser_UFL » 14 июл 2013, 01:05

edited
Запомните, всегда по жизни вас будут красить вежливость и спокойствие, а не наезды и дешевые понты ;)
Аватара пользователя
Ser_UFL
 
Сообщения: 977
Зарегистрирован: 22 авг 2009, 19:30
Откуда: Hell
Благодарил (а): 276 раз.
Поблагодарили: 379 раз.
Языки программирования: Counter-Strike 1.6:
WebMod-scripts, little Pawn.


Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1