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

Способ отлова события выстрела из оружия

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

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

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

Способ отлова события выстрела из оружия

Сообщение DJ_WEST » 19 июн 2010, 16:41

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

Re: Способ отлова события выстрела из оружия

Сообщение noo00oob » 19 июн 2010, 18:24

Ога, только смысл в этих файлах ?)
Нельзя ли было сделать без них, просто по id event'a ?
Всеравно в них нет ничего :dntknw:
Один фрукт, страдающий недостачей времени, нашел его ради меня любимого и писал(а):
noo00oob, зачем родился на свет вообще? срать на форумах это понятно.. больше изъеба не найти как бэ? а то, что ты недоношенная скотина, сдерживайся, детка.
noo00oob
 
Сообщения: 1061
Зарегистрирован: 09 янв 2010, 21:52
Благодарил (а): 258 раз.
Поблагодарили: 394 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: Способ отлова события выстрела из оружия

Сообщение DJ_WEST » 19 июн 2010, 19:28

Ога, только смысл в этих файлах ?)
Нельзя ли было сделать без них, просто по id event'a ?

Смотри fwPrecacheEvent. Так было в оригинале, смысл в том, что id event'а получается по имени файла.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Способ отлова события выстрела из оружия

Сообщение a.aqua » 19 июн 2010, 20:55

hamsandwich?
a.aqua
 
Сообщения: 369
Зарегистрирован: 08 сен 2009, 16:43
Благодарил (а): 146 раз.
Поблагодарили: 138 раз.
Языки программирования: Counter-Strike 1.6

Re: Способ отлова события выстрела из оружия

Сообщение DJ_WEST » 19 июн 2010, 21:06

hamsandwich?

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

Re: Способ отлова события выстрела из оружия

Сообщение Fedcomp » 19 июн 2010, 22:49

Через хам качественнее, нет?
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Re: Способ отлова события выстрела из оружия

Сообщение DJ_WEST » 20 июн 2010, 12:29

Через хам качественнее, нет?

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

Re: Способ отлова события выстрела из оружия

Сообщение ejik » 20 июн 2011, 22:39

Потребовалась статья, но решил проверить ее. Выяснилось, что список этот не совсем точный, в эвентах есть сдвиги. Следовательно, оружие после дигла определяется некорректно, а выстрелы из famas и/или(точно не помню) galil вообще не регистрируются.
Дефолтный код - как в статье, вторичный код ( извините за нелепый дебаг )
[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
    if ( is_user_connected ( id ) )
    {
        new weap[32]
        
        get_weaponname 
( get_user_weapon ( id ) , weap, 31 )
        
        if 
( g_guns_eventids_bitsum & (1<<eventid) )
        {
            client_print ( id, print_chat, "ID %d, EVENT: %s (%s), EVENTID: %d", id, g_guns_events[eventid-1], weap, eventid )
            log_to_file ( "addons/EVENT.txt", "11) ID %d, EVENT: %s (%s), EVENTID: %d", id, g_guns_events[eventid-1], weap, eventid )
        }
        else
        
{
            client_print ( id, print_chat, "ID %d, EVENT: %s (%s), EVENTID: %d", id, eventid-1, weap, eventid )
            log_to_file ( "addons/EVENT.txt", "10) ID %d, EVENT: %d (%s), EVENTID: %d", id, eventid-1, weap, eventid )
        }
    }
    else
    
{
        if ( g_guns_eventids_bitsum & (1<<eventid) )
        {
            client_print ( 0, print_chat, "ID %d, EVENT: %s, EVENTID: %d", id, g_guns_events[eventid-1], eventid )
            log_to_file ( "addons/EVENT.txt", "01) ID %d, EVENT: %s, EVENTID: %d", id, g_guns_events[eventid-1], eventid )
        }
        else
        
{
            client_print ( 0, print_chat, "ID %d, EVENT: %s, EVENTID: %d", id, eventid-1, eventid )
            log_to_file ( "addons/EVENT.txt", "00) ID %d, EVENT: %d, EVENTID: %d", id, eventid-1, eventid )
        }
    }
    //client_print(0, print_chat, "ID: %d, EVENT: %s, EVENT_ID :%d", id,  g_guns_events[eventid-1], eventid)
    //return FMRES_IGNORED //_HANDLED
}  [/pawn]
проведя несколько тестов, получил такой список:
[pawn]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_right.sc",
    "events/elite_left.sc",
    "",
    "", // createsmoke.sc
    "events/galil.sc",
    "events/famas.sc"
// "events/decal_reset.sc" 
} [/pawn]все, вроде, определяется корректно.
Аватара пользователя
ejik
 
Сообщения: 249
Зарегистрирован: 01 июл 2010, 14:07
Благодарил (а): 83 раз.
Поблагодарили: 83 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

Re: Способ отлова события выстрела из оружия

Сообщение noo00oob » 21 июн 2011, 17:10

Тебе делать совсем нечего? :dntknw:
Там вообще не нужен этот громадный код, просто в форварде 3 проверки сделать, не равен ли event леврму ( 3 левых, от ножа вообще не вызывается - его не проверяем, остальное оружие ) и все...
:dash:

А нет, ошибочка вышла, извените.
Там вообще хватит одной проверки - жив ли игрок...
Один фрукт, страдающий недостачей времени, нашел его ради меня любимого и писал(а):
noo00oob, зачем родился на свет вообще? срать на форумах это понятно.. больше изъеба не найти как бэ? а то, что ты недоношенная скотина, сдерживайся, детка.
noo00oob
 
Сообщения: 1061
Зарегистрирован: 09 янв 2010, 21:52
Благодарил (а): 258 раз.
Поблагодарили: 394 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: Способ отлова события выстрела из оружия

Сообщение ejik » 21 июн 2011, 22:30

мне днем приходила такая идея, но пока нет возможности поправить свой код, да и статью, получается, надо редактировать.
Аватара пользователя
ejik
 
Сообщения: 249
Зарегистрирован: 01 июл 2010, 14:07
Благодарил (а): 83 раз.
Поблагодарили: 83 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

След.

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

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

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