Главная | Комментарии | О проекте
Чтение RSS
Суперсайт
Главная Контакты Карта сайта Добавить в избранное
  • Кто OnLine

    Всего на сайте: 12
    Гостей: 6
    Пользователи: - отсутствуют
    Роботы: Yandex Bot, Yandex Bot, crawl Bot, Yandex Bot, robot Bot, robot Bot

    Опрос пользователей

    Для какого мода Вы пишите плагины?

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Admin Дата: 17-08-2011, 19:39 Просмотров: 12729

    Ham_TakeDamage Событие получения урона

    Ham_TakeDamage - С помощью этого параметра, мы можем отловить событие получения урона игрока или другого объекта в игровом мире.
    Применение находит во многих плагинах, как и большинство функций данного модуля, например можно показывать наносимый урон за весь раунд.
    Или наказать игрока если он и его жертва из одной команды ( стрельба по своим). ( Плагин АТАС) Ну в обще что вам придет в голову, сделать в вашем плагине.

    Параметры:
    (victim, weapon, attacker, Float:damage, damage_type)
    • victim - Жертва
    • weapon - Объект с помощью которого наносился урон
    • attacker - нападавший
    • Float:damage - урон ( дробное число)
    • damage_type - тип урона.


    Пример:
    /* Plugin generated by AMXX-Studio */

    #include <amxmodx>
    #include <amxmisc>
    #include <hamsandwich>
    #include <colorchat>

    #define PLUGIN "Event Take Damage"
    #define VERSION "1.0"
    #define AUTHOR "Admin"

    //Регистрируем глобальный массив для счетчика урона ( с плавающей точкой - дробное число)
    new Float:user_damage[33]

    public plugin_init ( )
    {
        register_plugin ( PLUGIN, VERSION, AUTHOR )
        
        //регистрируем событие урона и назначаем функцию
        RegisterHam ( Ham_TakeDamage, "player", "UserTakeDamage")
        //Регистрируем наши команды
        register_clcmd("say /damage","get_my_damage",_,"Say /damage to see you damage")
        register_clcmd("say /resetdmg","reset_damege",_,"Say /resetdmg to reset you counter damage")
        
    }
    //наша функция
    public UserTakeDamage ( victim, weapon, attacker, Float:damage, damagebits )
    {
        //Массивы для имен
        new NameVictim[32],NameAttacker[32]
        //Получаем имена
        get_user_name(victim,NameVictim,31)
        get_user_name(attacker,NameAttacker,31)
        //Выводим кто кого и на сколько ранил    
        ColorChat(0,RED,"[Ham Sandwich] ^4%s ^1put damage ^3%.1f ^1to ^4%s",NameAttacker,user_damage[attacker],NameVictim)    

        // Если игроки из разных команд и атакующий не ранил самого себя, плюсуем урон к ранее нанесенному    
        if (get_user_team ( attacker ) != get_user_team ( victim ) && attacker != victim){
            user_damage[attacker] += damage
        }

    }
    // Вывод нанесенного урона
    public get_my_damage(id){
        
        new UserName[32]
        get_user_name(id,UserName,31)
        
        ColorChat(id,RED,"[Ham Sandwich] ^1 %s have put ^4 %.1f ^1damage",UserName,user_damage[id])
    }
    //Обнуление счетчика урона
    public reset_damege(id){
        
        user_damage[id]    = 0.0
        ColorChat(id,RED,"[Ham Sandwich] ^1 Your counter of damages is dropped")
        
    }

    Описание:
    Если вы задавались вопросом как узнать кто нанес урон, или кому и сколько, то вы по адресу.
    В данном уроке мы научимся получать имена жертвы и нападавшего, а так же нанесенный урон, обратите внимание, что это не количество убийств, а нанесенный урон!

    И так, поехали:
    Для начала мы зарегистрировали событие урона:
    RegisterHam ( Ham_TakeDamage, "player", "UserTakeDamage")

    И указали какую функцию выполнять при наступлении этого события.
    Далее не сложно догадаться из описания параметров, кто там кто и чьи имена в какой массив мы записываем, и красочно выводим с помощью Colorchat`a игрокам.

    Для того что бы вы могли не спеша все это тестировать, есть 2 команды:
    1. say /damage - Выводит информацию сколько вы нанесли урона
    2. say /resetdmg - Сбрасывает счетчик урона

    Обращаю ваше внимание, что если вы хотите что бы счетчик работал, то массив нужно регистрировать глобально, а не внутри функции.
    Новость отредактировал Admin - 9-03-2014, 11:11
    Причина: Добавлен список типов урона. Добавление от Felix_Font.
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    Ham_TakeDamage Событие получения урона
    dakarn

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    У меня с этим событием проблемы: оно у меня срабатывает только тогда когда я получаю урон, а когда я наношу урон она не срабатывает. Это так и должно быть?
    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  56  +

    Внимательно читай:Событие получения урона
    а не событие нанесение урона.
    --------------------
    AndrewZ

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    weapon - Объект с помощью которого наносился урон

    Каким образом это считать можно? Допустим, как определить, что урон был нанесен гранатой?

    Сделал через
    if( damagebits % DMG_BLAST )


    :3
    артист

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Да чёт он по разному показывает...
    opa12

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    а можно ли отключить урон от определенного оружия, и если можно подскажите как
    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  56  +

    Определить с какого оружия нанесен урон, сравнить с нужным и если совпало - сделать нужные действия. А вот как это сделать ищи и делай сам.
    --------------------
    BiG_KiD

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Admin,
    а не легче зделать так
    1 через тэйк дамадж узнаем атакуещего,и его оружие.

    2 потом:
    if(get_user_weapon(attacker) == CSW_KNIFE)


    3 считаем урон

    BiG_KiD,
    написал именно так(не обьясняя функций)чтобы ора12 сам смог понять=)
    артист

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    get_pdata_int(ent, 43, 4)
    gavrilyuc

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Цитата: BiG_KiD
    Admin,
    а не легче зделать так
    1 через тэйк дамадж узнаем атакуещего,и его оружие.

    2 потом:
    ?
    1
    if(get_user_weapon(attacker) == CSW_KNIFE)


    3 считаем урон

    BiG_KiD,
    написал именно так(не обьясняя функций)чтобы ора12 сам смог понять=)

    вообщето нужно будет учитывать Инфликтор! потому что вот бросишь гранату, и взял нож(ну когда бывает что у тебя есть граната и нож, то бросаешь гранату и нож автоматом выбирается)
    То тогда эта проверка сработает и твой код будет думать что герой на то время был с ножом.

    RegisterHam ( Ham_TakeDamage, "player",...
    хотел спросить про второй параметер : "player"
    это имя class_name ? то есть если я вместо "player" всуну "arrow" то он будет ловить получение урона для "arrow"
    Safety1st

    5.08.2014
    ICQ: --
    Публикаций: 8
    Комментариев: 42
    Репутация: -  9  +

    Цитата: gavrilyuc
    вообщето нужно будет учитывать Инфликтор

    Истину глаголишь)

    Цитата: gavrilyuc
    это имя class_name ? то есть если я вместо "player" всуну "arrow" то он будет ловить получение урона для "arrow

    Это имя класса, да. Но здесь можно указывать только существующие классы. А arrow - не класс C++, это просто переименованный класснейм какой-либо entity, одно из её многочисленных свойств. Некоторые события кастомных энтитей явно можно ловить с помощью Engine-форвардов.
    --

    В статье, кстати, damage считается 'фейковый', без учёта брони у игрока. Реальный будет меньше. Один из способов его узнать - в Post-форварде проверить оффсет:
    #define m_lastDamageAmount 334    // keep track of amount of damage last sustained
    get_pdata_int( victim, m_lastDamageAmount )
    --------------------

    Информация

    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Наверх

Реклама