FireGrenade | Огненная граната

Сообщения
60
Реакции
6
Привет эксперты, помогите пожалуйста. Есть стандартное горение от гранаты FIRE в зомби моде и получается так что там в момент горение хп отнимаются путем fm_set_user_health, что как по мне не правильно, то есть по факту это не на носимый урон, а просто хп отнимается.

Код:
// Burning Flames
public burning_flame(taskid)
{
    // Get player origin and flags
    static origin[3], flags
    get_user_origin(ID_BURN, origin)
    flags = pev(ID_BURN, pev_flags)
    
    // Madness mode - in water - burning stopped
    if (g_nodamage[ID_BURN] || (flags & FL_INWATER) || g_burning_duration[ID_BURN] < 1)
    {
        // Smoke sprite
        message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
        write_byte(TE_SMOKE) // TE id
        write_coord(origin[0]) // x
        write_coord(origin[1]) // y
        write_coord(origin[2]-50) // z
        write_short(sz_SmokeSprite) // sprite
        write_byte(random_num(10, 20)) // scale
        write_byte(random_num(10, 20)) // framerate
        message_end()
        
        // Task not needed anymore
        remove_task(taskid);
        return;
    }
    
    // Randomly play burning zombie scream sounds
    if (!random_num(0, 20))
    {
        static sound[64]
        ArrayGetString(grenade_fire_player, random_num(0, ArraySize(grenade_fire_player) - 1), sound, charsmax(sound))
        emit_sound(ID_BURN, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
    }
    
    // Fire slow down
    if (flags & FL_ONGROUND && get_pcvar_float(cvar_fireslowdown) > 0.0)
    {
        static Float:velocity[3]
        pev(ID_BURN, pev_velocity, velocity)
        xs_vec_mul_scalar(velocity, get_pcvar_float(cvar_fireslowdown), velocity)
        set_pev(ID_BURN, pev_velocity, velocity)
    }
    
    // Get player's health
    static health
    health = pev(ID_BURN, pev_health)
    
    // Take damage from the fire
    if (health - floatround(get_pcvar_float(cvar_firedamage), floatround_ceil) > 0)
    fm_set_user_health(ID_BURN, health - floatround(get_pcvar_float(cvar_firedamage), floatround_ceil))
    
    // Flame sprite
    message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
    write_byte(TE_SPRITE) // TE id
    write_coord(origin[0]+random_num(-5, 5)) // x
    write_coord(origin[1]+random_num(-5, 5)) // y
    write_coord(origin[2]+random_num(-10, 10)) // z
    write_short(sz_FlameSprite) // sprite
    write_byte(random_num(3, 7)) // scale
    write_byte(200) // brightness
    message_end()
    
    // Decrease burning duration counter
    g_burning_duration[ID_BURN]--
}

Если я отключу проверку if (health - floatround(get_pcvar_float(cvar_firedamage), floatround_ceil) > 0) которая проверяет что у игрока достаточно хп, что бы отнимать дальше хп, то они по окончанию жизней умирают, но сами от себя. Следовательно и аммопаки не идут на баланс и киллы в таблицу к игроку (Attaker), подскажите как можно это исправить ? возможно тут что-то сделать или нужно делать в TakeDamage ?

Хотелось бы от горения зомби могли тоже умирать и это был фактический урон, а не обманка.
 
Сообщения
977
Реакции
52
Помог
10 раз(а)
Kulogram, что бы дать флаг атакуещему, надо передать ид его в эту функцию
 
Сообщения
60
Реакции
6
Code_0xABC, Тебе не кажется странным что burning происходит просто путём fm_set_user_health(ID_BURN, health - floatround(get_pcvar_float(cvar_firedamage), floatround_ceil)) , а не как по идеи должен ExecuteHamB(Ham_TakeDamage, victim, ent, iOwner, get_pcvar_float(cvar_firedamage) * 5, DMG_BURN | DMG_NEVERGIB); +/- как-то так!

Если мы горим, значит просто отнимаем себе здоровье, а не на носим урон :rofl:
 
Сообщения
977
Реакции
52
Помог
10 раз(а)
Code_0xABC, Тебе не кажется странным что burning происходит просто путём fm_set_user_health(ID_BURN, health - floatround(get_pcvar_float(cvar_firedamage), floatround_ceil)) , а не как по идеи должен ExecuteHamB(Ham_TakeDamage, victim, ent, iOwner, get_pcvar_float(cvar_firedamage) * 5, DMG_BURN | DMG_NEVERGIB); +/- как-то так!

Если мы горим, значит просто отнимаем себе здоровье, а не на носим урон
:rofl:
Следовательно и аммопаки не идут на баланс и киллы в таблицу к игроку (Attaker), :rofl:, когда кинул эту гранату, это и есть атакующий
 
Последнее редактирование:
Сообщения
60
Реакции
6
когда кинул гранату, это и есть атакующий
Это естественно, но там сделали не так, ты не можешь умереть за зомби от горения из-за проверки, проверку убираешь и зомби умирают только от самого себя и счет идет в минус
 
Сообщения
977
Реакции
52
Помог
10 раз(а)
Kulogram, ту проверку что ты писал, это идет проверка количества хп у игока и если меньше нуля то не сработает снятие хп
 
Сообщения
3,389
Реакции
1,487
Помог
125 раз(а)
Kulogram, недавно на заказ исправлял как раз этот момент. Как писали выше, нужно пробросить id атакующего и вызывать TakeDamage через хам, проверку на хп оставить, и опять же через хам убивать игрока, указав индекс убийцы
 
Сообщения
713
Реакции
479
Помог
10 раз(а)
TakeDamage может вызывать не нужные функции
например при горении будет анимация получения урона
или будет подтормаживать игрока

можно в самом моде сделать натив функцию, которая будет наносить фейковый урон (как в примере горения), а так же подсчитывать урон за горение

так же при Health >= Damage можно сделать такое, чтобы эмитировать убийство с фейк урона:
PHP:
new iFlameEnt = rg_create_entity("info_target");

if (iFlameEnt > 0) {
    set_entvar(iFlameEnt, var_classname, "flame");
    set_entvar(iFlameEnt, var_owner, iAttacker);
    
    set_entvar(iVictim, var_dmg_inflictor, iFlameEnt);
    set_member(iVictim, m_LastHitGroup, HITGROUP_GENERIC);
    set_member(iVictim, m_bitsDamageType, DMG_GENERIC);
    ExecuteHam(Ham_Killed, iVictim, iAttacker, 0);

    set_entvar(iFlameEnt, var_flags, FL_KILLME);
}
 
Сообщения
60
Реакции
6
BalbuR, Очень интересно, но это как и с баррикадами, будет долго и сложно =)

Еще по идеи можно будет добавить EngFunc_FindEntityInSphere и если зомби приближается к горящему зомби, то он тоже начинает гореть)
1 Май 2024
А если делать так?
Код:
if (health - g_damage > 0)
        set_pev(ID_BURN, pev_health, float(health - g_damage))
else if (g_cankill)
        ExecuteHamB(Ham_Killed, ID_BURN, BURN_ATTACKER, 0)
 
Сообщения
60
Реакции
6
Хотя это конечно решит вопрос убийства по окончанию здоровья , но не как не будет регистрировать, что это урон переменный и в баланс паков не пойдет
 

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

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