Редактирование и дополнение: DJ_WEST
В Counter-Strike имеются различные события, которые, наверное, каждый видел в директории events. При попытке открыть .sc файл в любом текстовом редакторе, мы находим забавное содержимое:
// Hi :+)
Если внимательно посмотреть на данные события, то в их названиях можно увидеть все виды оружия в Counter-Strike. В данной статье будет рассматриваться пример отлова события выстрела игроком из любого доступного оружия.
[pawn]/* AMX Mod X
* gun_fire_playback_event_way.sma
*
* (c) Copyright 2007 by VEN
*
* This file is provided as is (no warranties)
*/
#define PLUGIN_NAME "gun_fire_playback_event_way"
#define PLUGIN_VERSION "0.1"
#define PLUGIN_AUTHOR "VEN"
#include <amxmodx>
#include <fakemeta>
// Максимальное количество игроков
#define MAX_CLIENTS 32
// Глобальная переменная для хранения id функции FM_PrecacheEvent
new g_fwid
// Глобальная переменная для хранения максимального кол-ва игроков сервера
new g_max_clients
// Глобальная переменная для хранения id событий
new g_guns_eventids_bitsum
// Список событий
new const g_guns_events[][] =
{
"events/awp.sc",
"events/g3sg1.sc",
"events/ak47.sc",
"events/scout.sc",
"events/m249.sc",
"events/m4a1.sc",
"events/sg552.sc",
"events/aug.sc",
"events/sg550.sc",
"events/m3.sc",
"events/xm1014.sc",
"events/usp.sc",
"events/mac10.sc",
"events/ump45.sc",
"events/fiveseven.sc",
"events/p90.sc",
"events/deagle.sc",
"events/p228.sc",
"events/glock18.sc",
"events/mp5n.sc",
"events/tmp.sc",
"events/elite_left.sc",
"events/elite_right.sc",
"events/galil.sc",
"events/famas.sc"
}
public plugin_precache()
{
// Регистрируем forward функцию для FM_PrecacheEvent, id сохраняем в g_fwid
g_fwid = register_forward(FM_PrecacheEvent, "fwPrecacheEvent", 1)
}
public fwPrecacheEvent(type, const name[])
{
// Цикл по всему списку событий (g_guns_events)
for (new i = 0; i < sizeof g_guns_events; ++i)
{
// Если имя события из g_guns_events совпадает с именем события из precache,
// то сохраняем id события в g_guns_eventids_bitsum
if (equal(g_guns_events[i], name))
{
g_guns_eventids_bitsum |= (1<<get_orig_retval())
return FMRES_HANDLED
}
}
return FMRES_IGNORED
}
public plugin_init()
{
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)
// Удаляем наш зарегистрированный forward для FM_PrecacheEvent
unregister_forward(FM_PrecacheEvent, g_fwid, 1)
// Регистрируем новый forward для FM_PlaybackEvent
register_forward(FM_PlaybackEvent, "fwPlaybackEvent")
// Получаем максимальное кол-во игроков на сервере и сохраняем в g_max_clients
g_max_clients = global_get(glb_maxClients)
}
public fwPlaybackEvent(flags, id, eventid)
{
// Проверяем, если id события (eventid) не входит в g_guns_eventids_bitsum
// или id игрока выходит за допустимые пределы, то выходим из функции
if (!(g_guns_eventids_bitsum & (1<<eventid)) || !(1 <= id <= g_max_clients))
return FMRES_IGNORED
// Выводим id игрока, название события и id события в чат (для debug'а)
client_print(0, print_chat, "ID: %d, EVENT: %s, EVENT_ID :%d", id, g_guns_events[eventid-1], eventid)
return FMRES_HANDLED
} [/pawn]