Убийство с гранаты

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
219
Реакции
184
Помог
3 раз(а)
d3m37r4, да-да, читал, что ты предложил: не nullent. гениальное решение... жаль, что не катит
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
Javekson, зачем городить всё в CBasePlayerKilled и дополнительные проверки на "не умер ли от бомбы", если можно использовать то, что я скидывал на предыдущей странице в RG_CSGameRules_PlayerKilled, который не вызывается, если игрок умирает от бомбы.
P.S. хукчейн вызывается внутри CBasePlayerKilled, если что.
22 Апр 2020
gyxoBka, пихать бездумно проверочки типа is_user_connected/is_entity и т.д - лучше?
22 Апр 2020
Вы бы сначала краш этот воспроизвели, прежде чем писать, а потом бы уже фиксили.
 
Сообщения
219
Реакции
184
Помог
3 раз(а)
d3m37r4, отрадно читать, что ты, мой друг, никогда не сталкивался со сломанной памятью и как следствие крашами на луну, и не имел головной боли

Но я повторял и буду повторять, что оптимизация - это хорошо, но не когда она приводит к быдлокоду и отсутствию подстраховки от "плохохих" авторов, а потом на форуме плачут что у них серваки падают
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
gyxoBka, не занимаюсь впариванием всякого рода плагинов юзверям, мб поэтому не сталкивался.
 
Сообщения
219
Реакции
184
Помог
3 раз(а)
d3m37r4, это как посмотреть, зайдя во вкладку ресурсы в твоем профиле, можно много чего интересного откопать. Рандомно открытый вармап:
PHP:
            rg_remove_all_items(id);
            rg_give_default_items(id);
О последсвтиях можно только догадываться.
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
gyxoBka, хорошо, что ты всё в приватики зашифровал, а того, что в пабе, лучше не касаться.
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
C++:
register_event("DeathMsg", "EventDeathMsg", "a", "2!0", "4=grenade");
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
d3m37r4, не нервничай, я не смотрел что ты ему писал, по поводу бомбы косяк, согласен, но не вижу серьезных проблем и строгих нарушений в проверки бомбы. Чем тебе is_user_connected не понравился? Если не проверять жертву мне невалидные игроки прилетали

ThePhoenix, с учетом замечания выше, при взрыве бомбы не вызывается хук

C++:
RegisterHookChain( RG_CSGameRules_PlayerKilled, "hook_CSGameRulesPlayerKilled", .post = true );

public hook_CSGameRulesPlayerKilled( const iVictim, const iKiller )
{
    if( !is_user_connected( iKiller ) && iVictim == iKiller )
    {
        return HC_CONTINUE;
    }
    
    #if defined SOUNDS
        if( get_member( iVictim, m_bKilledByGrenade ) )
        {
            rg_send_audio( 0, SOUND_HE );
        }
        else
        {
            new iActiveItem = get_member( iKiller, m_pActiveItem );
            
            if( iActiveItem && WeaponIdType: rg_get_iteminfo( iActiveItem, ItemInfo_iId ) == WEAPON_KNIFE )
            {
                rg_send_audio( 0, SOUND_KNIFE );
            }
        }
    #endif
    
    return HC_CONTINUE;
}
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
Мой предложенный вариант, действительно может привести к крашу в одном случае, но справедливости ради, стоит отметить и вариант Javekson и вариант gyxoBka - приведут к тому же исходу, ибо нужно проверять валидность инфликтора, а не актив айтем.
 
Сообщения
702
Реакции
54
gyxoBka, d3m37r4, Справедливости ради скажу, что сервер то падает, то понять почему, я не могу даже из дебага :D
Не уверен, что из-за этого плагина, скорее грешу на ботов))
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Вы все свернули куда-то не туда.
1. проверяем не равны ли аттакер и виктим. нужно для того, чтобы понять не убил ли игрок себя сам
2. проверяем коннектед ли аттаке. это нужно для того, чтобы понять, что игрока убила не какая то ентити или мир
3. проверяем равны ли инфликтор и аттакер. нужно для того, чтобы понять, что убийство произошло с оружия, а не бомбы, гранаты или любой другой ентити.
4. инфликтор можно получить либо с пев даты var_dmg_inflictor либо аргументом в хуке. Зависит какой хук используете
5. если игрока убила ентити, то легко проверить что убило либо по класснейму инфликтора, либо если нужна только граната, то мембером выше мною описанным
6. если нужно получить оружие, то получаем активайтем (в идеале он всегда будет валидным, но я бы проверил все равно). и у него получить m_iId (не айтеминфо). И только при условии что инфликтор равен аттакеру

И у вас ни у одного не самый верный вариант. Так что спор бессмысленный.
22 Апр 2020
Ах да. у гранаты и у бобы один и тот же класснейм grenade. отличать их можно по мемберу m_bIsC4 (или как то так)
 
Сообщения
219
Реакции
184
Помог
3 раз(а)
fantom теперь ждем идеальную реализую от тебя
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
ThePhoenix, проверь, если работает, тогда духовка должен будет скинуть % от продаж своего регг
Код:
#include <amxmodx>
#include <reapi>

public plugin_init() {
    RegisterHookChain(RG_CSGameRules_PlayerKilled, "CSGameRules_PlayerKilled_Post", true);
}

public CSGameRules_PlayerKilled_Post(const victim, const killer, const inflictor) {
    if(victim == killer) {
        return HC_CONTINUE;
    }

    if(get_member(victim, m_bKilledByGrenade)) {
        log_amx("killed by grenade")
    } else {
        if(!is_nullent(inflictor)) {
            new activeItem = get_member(inflictor, m_pActiveItem);
            if(get_member(activeItem, m_iId) == WEAPON_KNIFE) {
                log_amx("killed by knife")
            }
        }
    }

    return HC_CONTINUE;
}
 
  • Нравится
Реакции: Ayk
Сообщения
219
Реакции
184
Помог
3 раз(а)
d3m37r4, неа.

ThePhoenix
PHP:
enum
{
    WORLD = 0,
    BULLET,
    KNIFE,
    GRENADE
}

#define IsValidPev(%0)             (pev_valid(%0) == 2)

stock get_death_reason(const id, const pevAttacker, &iType)
{
    if(!is_user_connected(id) || !IsValidPev(id)) return PLUGIN_CONTINUE;
       
    if(!is_user_connected(pevAttacker) || !IsValidPev(pevAttacker))
        return PLUGIN_CONTINUE;
   
    new iInflictor = get_entvar(id, var_dmg_inflictor);
   
    if(iInflictor == pevAttacker)
    {
        new iEnt = get_member(pevAttacker, m_pActiveItem);
       
        if(!IsValidPev(iEnt)) return PLUGIN_CONTINUE;
       
        if(get_member(iEnt, m_iId) == CSW_KNIFE) iType = KNIFE;
        else iType = BULLET;
    }
    else
    {
        if(get_member(id, m_bKilledByGrenade)) iType = GRENADE;
        else  iType = WORLD;
    }

    return PLUGIN_HANDLED;
}
fantom конкретно в случае определения стоком викт != атт не нужно, т.к. данная проверка должна быть в хендлере
 
  • Нравится
Реакции: Ayk

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
gyxoBka, IsValidPev сложно
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
gyxoBka, все равно сложно
 
Сообщения
219
Реакции
184
Помог
3 раз(а)
d3m37r4, понимаю... ничего, разберешься, когда сильнее станешь
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу