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

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

Статьи или фрагменты кода для новичков и уже опытных скриптеров по 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: Способ отлова события выстрела из оружия

Сообщение qpAHToMAS » 15 фев 2012, 21:17

Спасибо за статью. Мне понадобилось поймать координаты попадания пули в стену карты, я решил использовать:
[pawn]
  1. get_user_origin(id, origin, 4)
[/pawn]

В итоге после client_print'а в статье я добавил:
[pawn]
  1. new origin[3]

  2. get_user_origin(id, origin, 4)

  3. client_print(0, print_chat, "%i / %i / %i", origin[0], origin[1], origin[2])
[/pawn]
Но есть два вопроса:
  • При стрельбе в идеально ровную стену координаты одной из осей (вдоль которой идет стена) должны быть одинаковыми, но это происходит не со всеми оружиями, в чем дело? Прострел или что (координаты от оружий которые не простреливают стены учитывают ровную ось)? Как тогда поймать точку именно где появляется декаль?
  • Вывод координат в чат идет "перед одним", т.е. показываются координаты предыдущего выстрела, а не последнего, опять же не могу понять из-за чего.
Аватара пользователя
qpAHToMAS
 
Сообщения: 707
Зарегистрирован: 02 ноя 2009, 18:45
Благодарил (а): 79 раз.
Поблагодарили: 204 раз.
Языки программирования: CStrike

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

Сообщение DJ_WEST » 16 фев 2012, 11:28

Вывод координат в чат идет "перед одним", т.е. показываются координаты предыдущего выстрела, а не последнего, опять же не могу понять из-за чего.

Потому что:
4 - Position from last bullet hit (only CS)

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

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

Сообщение qpAHToMAS » 16 фев 2012, 12:09

DJ_WEST, ок, пробую так:
[pawn]
  1. #include <amxmodx>

  2. #include <fakemeta>

  3. #include <hamsandwich>

  4.  

  5. public plugin_init()

  6. {

  7.         register_plugin("Shot", "1.0", "")

  8.         RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack")

  9. }

  10.  

  11. public fw_TraceAttack(victim, attacker, Float:damage, Float:direction[3], tr, damage_type)

  12. {

  13.         client_print(0, print_chat, "%f / %f / %f", direction[0], direction[1], direction[2])

  14. }
[/pawn]
Но direction ведь судя по всему направление выстрела, а не координаты куда попадает пуля?
Аватара пользователя
qpAHToMAS
 
Сообщения: 707
Зарегистрирован: 02 ноя 2009, 18:45
Благодарил (а): 79 раз.
Поблагодарили: 204 раз.
Языки программирования: CStrike

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

Сообщение DJ_WEST » 16 фев 2012, 13:06

Но direction ведь судя по всему направление выстрела, а не координаты куда попадает пуля?

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

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

Сообщение qpAHToMAS » 16 фев 2012, 15:25

Помогли на оф. форуме, в итоге:
[pawn]
  1. #include <amxmodx>

  2. #include <fakemeta>

  3. #include <hamsandwich>

  4.  

  5. public plugin_init()

  6. {

  7.         register_plugin("Shot", "1.0", "")

  8.         RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack")

  9. }

  10.  

  11. public fw_TraceAttack(victim, attacker, Float:damage, Float:direction[3], tr, damage_type)

  12. {

  13.         new Float:endPos[3];

  14.         get_tr2(tr, TR_vecEndPos, endPos);

  15.         client_print(0, print_chat, "%f / %f / %f", endPos[0], endPos[1], endPos[2])

  16. }
[/pawn]
Выводит координаты попадания пули. Мало того, если есть прострел, то будет выведен и он (вторым сообщением), если подпилить и добавить например луч от игрока до точки, то получится очень полезный инструмент для игроков, что бы прострелы тренировать.
Аватара пользователя
qpAHToMAS
 
Сообщения: 707
Зарегистрирован: 02 ноя 2009, 18:45
Благодарил (а): 79 раз.
Поблагодарили: 204 раз.
Языки программирования: CStrike

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

Сообщение extazy » 10 мар 2012, 18:41

А подскажите тогда такую мысль, как через Ham сделать очередь в deathrun_duel v2.5 by shoter буду признателен за помощь!
Аватара пользователя
extazy
 
Сообщения: 270
Зарегистрирован: 25 окт 2011, 18:39
Забанен
Благодарил (а): 14 раз.
Поблагодарили: 16 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

Пред.

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

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

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