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

Ham_TakeDamage, урон ножом и DMG_SLASH  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

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

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

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Ham_TakeDamage, урон ножом и DMG_SLASH

Сообщение NEoMASTERR » 03 май 2017, 22:59

Здравствуйте. Почему то при атаке ножом 5ый параметр не содержит DMG_SLASH, только DMG_BULLET и неизвестный (1<<11). Как определить атаку именно ножом и что это за (1<<11)? (без get_user_weapon и подобных разумеется)

Код: Выделить всё
public ham_takedamage(id, ent, pid, Float:damage, damagebits)
{
    if (!is_user_connected(id) || !is_user_alive(pid))
        return HAM_IGNORED
    
    static x
, y;
    if (get_user_weapon(pid, x, y) == CSW_KNIFE && !(damagebits & DMG_SLASH))    // так работает, но это такое себе
    {
        ExecuteHamB(Ham_TakeDamage, id, pid, pid, damage, DMG_SLASH)
        return HAM_SUPERCEDE
    
}
    
    client_print
(ALL_PLAYERS, print_chat, "DMG_BITS %d DMG_SLASH = %d", damagebits, damagebits & DMG_SLASH)

    log_amx("Damagebits %d DMG_SLASH %d", damagebits, DMG_SLASH)
    if (damagebits & DMG_SLASH) 
    
{
        log_amx("Slash confirmed")
    }

    return HAM_IGNORED
}


Добавлено спустя 4 минуты 26 секунд:
Вы должны зарегистрироваться, чтобы видеть ссылки. по форуму выдал больше чем поиск по гуглу, но тут тоже мало понятного
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Ham_TakeDamage, урон ножом и DMG_SLASH  [Решено]

Сообщение EvilCoder » 03 май 2017, 23:54

Сразу вспомнился код:
Код: Выделить всё
#include <amxmodx>
    #include <fakemeta>
    #include <hamsandwich>
    
    
new gMaxClients;
    
    
#define IsPlayer(%1)  ( 1 <= %1 <= gMaxClients )
    #define HasKnife(%1)  ( IsPlayer( %1 ) && get_user_weapon( %1 ) == CSW_KNIFE )
    
    #define DMG_KNIFE     ( DMG_NEVERGIB | DMG_BULLET )
    
    
public plugin_init()
    {
        
register_plugin"No Knife Damage""1.0.0""Arkshine" );
        
        
RegisterHamHam_TakeDamage"player""Event_PlayerTakeDamage" );
        
gMaxClients get_maxplayers();
    }
    
    public 
Event_PlayerTakeDamage VictimInflictorAttackerFloat:DamageDamagebits )
    {
        return 
HasKnifeAttacker ) && ( Damagebits DMG_KNIFE ) ? HAM_SUPERCEDE HAM_IGNORED;
    } 

Это код на отсутствие урона ножом. Перепиши как нужно.
Не забывайте, что у вас есть возможность отправлять жалобы на сообщения, присланные вам от других пользователей в ЛС.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Принимаются заявки на вступление в группу Скриптеры
Аватара пользователя
EvilCoder
Администратор
 
Сообщения: 1960
Зарегистрирован: 20 апр 2010, 12:11
Благодарил (а): 44 раз.
Поблагодарили: 663 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

Re: Ham_TakeDamage, урон ножом и DMG_SLASH

Сообщение D34by » 03 май 2017, 23:55

dmg_byte для ножа DMG_NEVERGIB | DMG_BULLET
Код: Выделить всё
pEntity->TraceAttack(m_pPlayer->pev, 15, gpGlobals->v_forward, &tr, (DMG_NEVERGIB | DMG_BULLET)
Work with Zombie Plague ver. 4|5, Biohazard, Zombie Engine, Public, Weapon System
Аватара пользователя
D34by
 
Сообщения: 537
Зарегистрирован: 13 фев 2014, 12:45
Благодарил (а): 15 раз.
Поблагодарили: 192 раз.
Опыт программирования: Больше трех лет
Языки программирования: пешка
сишка

Re: Ham_TakeDamage, урон ножом и DMG_SLASH

Сообщение NEoMASTERR » 04 май 2017, 10:31

Почему то решил что приходит (1<<11) а это был DMG_NEVERGIB (1<<12). Надо больше спать.
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Ham_TakeDamage, урон ножом и DMG_SLASH

Сообщение Dart_Begep » 04 май 2017, 11:04

Вообще странно, что в КС урон ножом использует те же биты, что и атака стрелковым оружием...
И кстати...
Код: Выделить всё
    public Event_PlayerTakeDamage ( Victim, Inflictor, Attacker, Float:Damage, Damagebits )
    {
        return HasKnife( Attacker ) && ( Damagebits & DMG_KNIFE ) ? HAM_SUPERCEDE : HAM_IGNORED;
    

Это не самый лучший вариант проверки. Я бы сделал вот так:
Код: Выделить всё

    public Event_PlayerTakeDamage 
( Victim, Inflictor, Attacker, Float:Damage, Damagebits )
    {
        return HasKnife( Attacker ) && (Attacker == Inflictor) && ( Damagebits & DMG_KNIFE ) ? HAM_SUPERCEDE : HAM_IGNORED;
    

Это бы исключило ошибки в случае использования какого-нибудь кастомного оружия. Например я сейчас завершаю новый вариант пушек для КС. В нем юзаю атаку пушками через Ham с использованием естествено тех же битов. И тогда легко может возникнуть ошибка, когда игрок взял нож, а в это время пушка кого-то грохнула. А получится, будто игрок ножом атаковал ;)
Аватара пользователя
Dart_Begep
 
Сообщения: 131
Зарегистрирован: 19 апр 2017, 22:29
Благодарил (а): 11 раз.
Поблагодарили: 27 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn
Php
JavaScript

Re: Ham_TakeDamage, урон ножом и DMG_SLASH

Сообщение Garey » 04 май 2017, 17:24

Dart_Begep писал(а):Вообще странно, что в КС урон ножом использует те же биты, что и атака стрелковым оружием...
И кстати...
Код: Выделить всё
    public Event_PlayerTakeDamage ( Victim, Inflictor, Attacker, Float:Damage, Damagebits )
    {
        return HasKnife( Attacker ) && ( Damagebits & DMG_KNIFE ) ? HAM_SUPERCEDE : HAM_IGNORED;
    

Это не самый лучший вариант проверки. Я бы сделал вот так:
Код: Выделить всё

    public Event_PlayerTakeDamage 
( Victim, Inflictor, Attacker, Float:Damage, Damagebits )
    {
        return HasKnife( Attacker ) && (Attacker == Inflictor) && ( Damagebits & DMG_KNIFE ) ? HAM_SUPERCEDE : HAM_IGNORED;
    

Это бы исключило ошибки в случае использования какого-нибудь кастомного оружия. Например я сейчас завершаю новый вариант пушек для КС. В нем юзаю атаку пушками через Ham с использованием естествено тех же битов. И тогда легко может возникнуть ошибка, когда игрок взял нож, а в это время пушка кого-то грохнула. А получится, будто игрок ножом атаковал ;)

разве ваша кастомка не отсечется при проверке HasKnife ?
Аватара пользователя
Garey
 
Сообщения: 85
Зарегистрирован: 24 дек 2010, 03:12
Благодарил (а): 4 раз.
Поблагодарили: 37 раз.

Re: Ham_TakeDamage, урон ножом и DMG_SLASH

Сообщение Dart_Begep » 04 май 2017, 18:07

разве ваша кастомка не отсечется при проверке HasKnife ?

Ну по вот этому коду отсечется.
Код: Выделить всё

    public Event_PlayerTakeDamage 
( Victim, Inflictor, Attacker, Float:Damage, Damagebits )
    {
        return HasKnife( Attacker ) && (Attacker == Inflictor) && ( Damagebits & DMG_KNIFE ) ? HAM_SUPERCEDE : HAM_IGNORED;
    

А по предыдущему нет. По предыдущему отсечется любой "стрелковый" урон, когда у атакующего в руке нож.
1) HasKnife( Attacker ) - это игрок, и у него в руках нож;
2) ( Damagebits & DMG_KNIFE ) - урон от ножа и любого стрелкового оружия.
В коде же, который я дополнил, проверяется инфликтор (ентитя, непосредственно наносящая урон). Но в самом КС инфликтором является атакующий, кроме случая нанесения урона гранатой. У меня же инфликтором, чтобы правильно выполнялся детект урона, является непосредственно пушка. А пушка естественно логично использует те же биты урона. Соответственно, если не проверять (Attacker == Inflictor), то будет косяк. Бежит атакующий с ножом, а тем временем его пушка кого-то атакует. И срабатывает тогда, будто он кого-то ножичком... ;)

Добавлено спустя 24 минуты 56 секунд:
Ах да, я имею ввиду здесь под пушкой не ручное оружие, а стационарно устанавливаемую пушку - sentry ;) Для ясности.
Аватара пользователя
Dart_Begep
 
Сообщения: 131
Зарегистрирован: 19 апр 2017, 22:29
Благодарил (а): 11 раз.
Поблагодарили: 27 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn
Php
JavaScript


Вернуться в Скриптинг

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

Сейчас этот форум просматривают: Bing [Bot] и гости: 18