Не дамажит динамит

Сообщения
702
Реакции
54
Приветствую. Есть плагин динамита, который устанавливается на пол на Е, так же на второе нажатие Е он взрывается, но почему-то не наносит урон..
Код:
public bool:UseAbility(id)
{
    new Float:origin[3];
    get_entvar(id, var_origin, origin);

    new ent = rg_create_entity("info_target");

    set_entvar(ent, var_classname, "dynamite");
    set_entvar(ent, var_owner, id);
    set_entvar(ent, var_origin, origin);

    entity_set_model(ent, MODEL_NAME);
    drop_to_floor(ent);

    dynamite_num[id]++;
    dynamite_ent[id] = ent;
    dynamite_activated[id] = true;

    return true;
}

public bool:Explosion(ent)
{
    new attacker = get_entvar(ent, var_owner);

    if(!is_user_connected(attacker))
    {
        set_entvar(ent, var_flags, get_entvar(ent, var_flags) | FL_KILLME);
        return false;
    }

    new Float:origin[3];
    get_entvar(ent, var_origin, origin);

    message_begin_f(MSG_BROADCAST, SVC_TEMPENTITY, origin);
    write_byte(TE_EXPLOSION);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2]);
    write_short(sprite_id);
    write_byte(32);
    write_byte(20);
    write_byte(0);
    message_end();

    new TeamName:attacker_team = get_member(attacker, m_iTeam);

    new victim = -1;
    while((victim = find_ent_in_sphere(victim, origin, DYNAMITE_RADIUS)))
    {
        if(!is_user_alive(victim))
            continue;

        if(attacker_team == get_member(victim, m_iTeam))
            continue;

        new ret;
        ExecuteForward(forward_id, ret, ent, attacker, victim, DYNAMITE_DAMAGE);

        if(!ret)
        {
            rg_multidmg_clear();
            rg_multidmg_add(ent, victim, DYNAMITE_DAMAGE, DMG_GRENADE);
            rg_multidmg_apply(ent, attacker);
        }
    }

    set_entvar(ent, var_flags, get_entvar(ent, var_flags) | FL_KILLME);

    dynamite_ent[attacker] = -1;
    dynamite_activated[attacker] = false;

    return true;
}
Динамит должен наносить урон только противнику, не цепляя владельца (тот, который поставил динамит) и его тиммейтов. Т.е дамажить должен только врагов! Но он не дамажит никого, просто взрывается.
 
Сообщения
197
Реакции
16
Помог
1 раз(а)
дебажил? попробуй функцию rg_dmg_radius()
 
Сообщения
702
Реакции
54
kucklovod, сам дебаг подключен, ошибок нет, а дебажить в самом плагине не пробовал, не умею просто))
 
Сообщения
580
Реакции
338
Предупреждения
1
Помог
9 раз(а)
Код:
            rg_multidmg_clear();
            rg_multidmg_add(ent, victim, DYNAMITE_DAMAGE, DMG_GRENADE);
            rg_multidmg_apply(ent, attacker);
это замени на ExecuteHamB(Ham_TakeDamage..)
 
Сообщения
702
Реакции
54
steelzzz, сейчас попробую.
19 Мар 2020
steelzzz, не сработало. Плагин мне передал привет:
Код:
L 03/19/2020 - 14:36:06: [HAMSANDWICH] Bad arg count.  Expected 6, got 4.
L 03/19/2020 - 14:36:06: [AMXX] Run time error 10: native error (native "ExecuteHamB")
L 03/19/2020 - 14:36:06: [AMXX]    [0] bm_class_scout.sma::Explosion (line 246))
Код:
if(!ret)
        {
            ExecuteHamB(Ham_TakeDamage, victim, DYNAMITE_DAMAGE, DMG_GRENADE); // 246 line
            /*rg_multidmg_clear();
            rg_multidmg_add(ent, victim, DYNAMITE_DAMAGE, DMG_GRENADE);
            rg_multidmg_apply(ent, attacker);*/
        }
 

Ayk

Сообщения
763
Реакции
476
Помог
19 раз(а)
ThePhoenix, ну и? АМХХ указал тебе ошибку, внятно и ясно: аргументов должно быть 6 а не 4.
 
Сообщения
702
Реакции
54
Ayk,
Код:
if(!ret)
        {
            ExecuteHamB(Ham_TakeDamage, victim, ent, attacker, DYNAMITE_DAMAGE, DMG_GRENADE); // 246 line
            /*rg_multidmg_clear();
            rg_multidmg_add(ent, victim, DYNAMITE_DAMAGE, DMG_GRENADE);
            rg_multidmg_apply(ent, attacker);*/
        }
так должно быть?
 
Сообщения
702
Реакции
54
Окей, с указанием 6 параметров работает, но почему не работает через нативы regamedll?
 
Сообщения
2,491
Реакции
2,791
Помог
61 раз(а)
steelzzz, не стоит так делать. Это правильны вариант как раз если используется реапи
19 Мар 2020
А еще лучше rg_dmg_radius как сказал kucklovod.
 
Сообщения
702
Реакции
54
fantom, честно, не знаю даже какие там параметры мне указать нужно :D

Код:
rg_dmg_radius(Float:vecSrc[3], victim, attacker, DYNAMITE_DAMAGE, DYNAMITE_RADIUS, const iClassIgnore, DMG_GRENADE);
Что за "Float:vecSrc[3]" и "const iClassIgnore"?
 
Сообщения
711
Реакции
476
Помог
10 раз(а)
fantom,
не стоит так делать. Это правильны вариант как раз если используется реапи
почему нет? ну реапи и что?


когда пробовал делать пули объектами (не повторяйте это в домашних условиях)
PHP:
            rg_multidmg_clear();
            ExecuteHamB(Ham_TraceAttack, pHit, iOwner, flDamage, vecVelocity, iTrace, (DMG_BULLET|DMG_NEVERGIB));
            rg_multidmg_apply(pHit, iOwner);
19 Мар 2020
ThePhoenix,
Что за "Float:vecSrc[3]" и "const iClassIgnore"?
1) flOrigin взрыва
2) объект, который будет игнорироваться, например индекс атакующего
 
Сообщения
702
Реакции
54
BalbuR, 1) Я без понятия, где у меня flOrigin взрыва :D Просто указать "origin" ?))
2) в этом случае, да, надо "victim" туда указать :)
 
Сообщения
2,491
Реакции
2,791
Помог
61 раз(а)
почему нет? ну реапи и что?
Потому что когда я делал именно хамом я нарывался на багы (уже точно и не вспомню какие). Так и не понял, и не искал причину потому что было лень искать. А вот когда через multidmg их не было. По сути внутри ultidmg идет вызов все того же TakeDamage.
 
Сообщения
711
Реакции
476
Помог
10 раз(а)
fantom,
но по факту аргументы слабые
баги обычно появляются по причине говнокода на сервере владельца
например, всеми любимые ножи и чек по актив итему ножа во время взрыва гранаты
короче говоря - классика как есть
 
Сообщения
702
Реакции
54
Nordic Warrior, дак, а причём взрыв к тому, что ентити устанавливается на пол?

fantom, попробовал я значит в радиусом, только не понял, как он работает..
Код:
public bool:Explosion(ent)
{
    new attacker = get_entvar(ent, var_owner);

    if(!is_user_connected(attacker))
    {
        set_entvar(ent, var_flags, get_entvar(ent, var_flags) | FL_KILLME);
        return false;
    }

    new Float:origin[3];
    get_entvar(ent, var_origin, origin);

    message_begin_f(MSG_BROADCAST, SVC_TEMPENTITY, origin);
    write_byte(TE_EXPLOSION);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2]);
    write_short(sprite_id);
    write_byte(32);
    write_byte(20);
    write_byte(0);
    message_end();

    new TeamName:attacker_team = get_member(attacker, m_iTeam);

    new victim = -1;
    while((victim = find_ent_in_sphere(victim, origin, DYNAMITE_RADIUS)))
    {
        if(!is_user_alive(victim))
            continue;

        if(attacker_team == get_member(victim, m_iTeam))
            continue;

        new ret;
        ExecuteForward(forward_id, ret, ent, attacker, victim, DYNAMITE_DAMAGE);

        if(!ret)
        {
            rg_dmg_radius(origin, victim, attacker, DYNAMITE_DAMAGE, DYNAMITE_RADIUS, victim, DMG_GRENADE);
            /*rg_multidmg_clear();
            rg_multidmg_add(ent, victim, DYNAMITE_DAMAGE, DMG_GRENADE);
            rg_multidmg_apply(ent, attacker);*/
        }
    }

    set_entvar(ent, var_flags, get_entvar(ent, var_flags) | FL_KILLME);

    dynamite_ent[attacker] = -1;
    dynamite_activated[attacker] = false;

    return true;
}
Он взрывается, дамажит противника. Есть одно маленькое но, он ударил нас обоих, при том, что у меня было 90 хп, осталось 40, а урон должен быть гораздо больше!
Код:
#define DYNAMITE_RADIUS        300.0 // Радиус поражения от взрыва динамита
#define DYNAMITE_DAMAGE        100.0 // Урон от динамита
А главное, потом я зашёл, поставил себе под ноги, подорвал и урона не нанесло :D А когда рядом противник был, нанесло и ему и мне хД
 
Сообщения
702
Реакции
54
Nordic Warrior, взрывается там же, но я же указал, что у неё радиус взрыва 300, т.е хватит на нескольких игроков
 
Сообщения
2,491
Реакции
2,791
Помог
61 раз(а)
ThePhoenix,
Код:
public bool:Explosion(ent)
{
    new attacker = get_entvar(ent, var_owner);
    if(!is_user_connected(attacker))
    {
        set_entvar(ent, var_flags, get_entvar(ent, var_flags) | FL_KILLME);
        return false;
    }

    new Float:origin[3];
    get_entvar(ent, var_origin, origin);

    rg_dmg_radius(origin, ent, attacker, 100.0, 300.0, 0, DMG_GRENADE);

    message_begin_f(MSG_BROADCAST, SVC_TEMPENTITY, origin);
    write_byte(TE_EXPLOSION);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2]);
    write_short(sprite_id);
    write_byte(32);
    write_byte(20);
    write_byte(0);
    message_end();

    set_entvar(ent, var_flags, FL_KILLME);
    dynamite_ent[attacker] = -1;
    dynamite_activated[attacker] = false;

    return true;
}
20 Мар 2020
Он взрывается, дамажит противника. Есть одно маленькое но, он ударил нас обоих, при том, что у меня было 90 хп, осталось 40, а урон должен быть гораздо больше!
учитывается броня, которая поглощает урон. Также в примере више нет проверки кому идет урон. Можно хукнуть TakeDamage и проверять инфликтор, и блокировать если это нужно (например в форвард вернули заблокировать)
 
Сообщения
580
Реакции
338
Предупреждения
1
Помог
9 раз(а)
fantom, тут придется по-любому через цикл, ибо челу надо чтобы тиммейтов не задевало взрывом.
 

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

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