Урон по своей команде

Сообщения
25
Реакции
10
Всем привет, с уроном работал мало, поэтому не имею большого представления как все же он меняется. Мне необходимо менять урон в соответствии от того, куда именно игрок ударил (голова, руки и тд). Отловить это нормально у меня получилось, а вот чтобы уже изменять урон на конкретный - нет.

Код:
public refwd_PlayerTraceAttack_Pre(iVictim, iAttacker, float:flDamage, Float:vecDir[3], iTraceHandle, bitsDamageType)
{
    //В зависимости от того куда попали меняем урон
    switch(get_tr2(iTraceHandle, TR_iHitgroup))
    {
        case HIT_HEAD: g_iBodyPart[iAttacker] = DAMAGE_HEAD;
        case HIT_CHEST: g_iBodyPart[iAttacker] = DAMAGE_CHEST;
        case HIT_STOMACH: g_iBodyPart[iAttacker] = DAMAGE_STOMACH;
        case HIT_LEFTARM: g_iBodyPart[iAttacker] = DAMAGE_LEFTARM;
        case HIT_RIGHTARM: g_iBodyPart[iAttacker] = DAMAGE_RIGHTARM;
        case HIT_LEFTLEG: g_iBodyPart[iAttacker] = DAMAGE_LEFTLEG;
        case HIT_RIGHTLEG: g_iBodyPart[iAttacker] = DAMAGE_RIGHTLEG;
    }
}

public refwd_PlayerTakeDamage_Pre(iVictim, iInflictor, iAttacker, Float:flDamage, bitsDamageType)
{
    if(!is_user_valid(iAttacker))
        return HC_CONTINUE

    new iWeapon = get_user_weapon(iAttacker);

    if(g_iCvarBoxEnabled && get_member(iVictim, m_iTeam) == TEAM_TERRORIST && get_member(iAttacker, m_iTeam) == TEAM_TERRORIST)
    { 
        if(iWeapon == CSW_KNIFE)
        {
            switch(g_iBodyPart[iAttacker])
            {
                case DAMAGE_HEAD:
                {
                    if(get_entvar(iAttacker, var_button) & IN_ATTACK2)
                        SetHookChainArg(4, ATYPE_FLOAT, flDamage / 260.0 * float(g_iDamage[g_iBodyPart[iAttacker]]))
                    else if(get_entvar(iAttacker, var_button) & IN_ATTACK)
                        SetHookChainArg(4, ATYPE_FLOAT, flDamage / 60.0 * float(g_iDamage[g_iBodyPart[iAttacker]]) / 3.5)
                }
                case DAMAGE_CHEST, DAMAGE_STOMACH:
                {
                    if(get_entvar(iAttacker, var_button) & IN_ATTACK2)
                        SetHookChainArg(4, ATYPE_FLOAT, flDamage / 195.0 * float(g_iDamage[g_iBodyPart[iAttacker]]))
                    else if(get_entvar(iAttacker, var_button) & IN_ATTACK)
                        SetHookChainArg(4, ATYPE_FLOAT, flDamage / 18.75 * float(g_iDamage[g_iBodyPart[iAttacker]]) / 3.5)
                }
                case DAMAGE_LEFTARM, DAMAGE_RIGHTARM:
                {
                    if(get_entvar(iAttacker, var_button) & IN_ATTACK2)
                        SetHookChainArg(4, ATYPE_FLOAT, flDamage / 65.0 * float(g_iDamage[g_iBodyPart[iAttacker]]))
                    else if(get_entvar(iAttacker, var_button) & IN_ATTACK)
                        SetHookChainArg(4, ATYPE_FLOAT, flDamage / 15.0 * float(g_iDamage[g_iBodyPart[iAttacker]]) / 3.5)
                }
                case DAMAGE_LEFTLEG, DAMAGE_RIGHTLEG:
                {
                    if(get_entvar(iAttacker, var_button) & IN_ATTACK2)
                        SetHookChainArg(4, ATYPE_FLOAT, flDamage / 48.75 * float(g_iDamage[g_iBodyPart[iAttacker]]))
                    else if(get_entvar(iAttacker, var_button) & IN_ATTACK)
                        SetHookChainArg(4, ATYPE_FLOAT, flDamage / 11.25 * float(g_iDamage[g_iBodyPart[iAttacker]]) / 3.5)
                }
            }
        }
        else
            SetHookChainArg(4, ATYPE_FLOAT, flDamage/* * 0.35*/)

        return HC_SUPERCEDE
    }

    return HC_CONTINUE
}
Пробовал как-то подобрать урон умножениями/делениями всякими, но не сошлось, по факту, мне надо такой сет, но это все может редактироваться в режиме реального времени. Урон только от ножа, от остального как по обычному:
1646709429730.png
 
Сообщения
3,593
Реакции
1,576
Помог
141 раз(а)
Не понятна конечная цель кода. Если нужен урон как на скрине, просто подставляй его, не?
 
Сообщения
1,304
Реакции
2,303
Помог
57 раз(а)
Делая суперцид нужно установить значение возврата. Смотри как в регейме работает CBasePlayer TakeDamage
 
Сообщения
25
Реакции
10
Я пробовал так делать, у меня по итогу устанавливался совсем иной урон. Иных плагинов, работающих с уроном нет.

При таких настройках на скринах:
ПКМ не в голову - 7 хп
ПКМ в голову - 28
Про лкм пока что молчу

По дебагу урон нормально пишет в refwd_PlayerTakeDamage_Pre, там как и должно быть, а вот наносится совсем иной урон

Код:
public refwd_PlayerTakeDamage_Pre(iVictim, iInflictor, iAttacker, Float:flDamage, bitsDamageType)
{
    if(!is_user_valid(iAttacker))
        return HC_CONTINUE

    new iWeapon = get_user_weapon(iAttacker)

    client_print_color(0, print_team_default, "%f", flDamage)

    if(g_iCvarBoxEnabled && get_member(iVictim, m_iTeam) == TEAM_TERRORIST && get_member(iAttacker, m_iTeam) == TEAM_TERRORIST)
    {   
        if(iWeapon == CSW_KNIFE)
        {
            switch(g_iBodyPart[iAttacker])
            {
                case DAMAGE_HEAD:
                {
                    if(get_entvar(iAttacker, var_button) & IN_ATTACK2)
                        SetHookChainArg(4, ATYPE_FLOAT, float(g_iDamage[g_iBodyPart[iAttacker]]))
                    else if(get_entvar(iAttacker, var_button) & IN_ATTACK)
                        SetHookChainArg(4, ATYPE_FLOAT, float(g_iDamage[g_iBodyPart[iAttacker]]) / 3.5)
                }
                case DAMAGE_CHEST, DAMAGE_STOMACH:
                {
                    if(get_entvar(iAttacker, var_button) & IN_ATTACK2)
                        SetHookChainArg(4, ATYPE_FLOAT, float(g_iDamage[g_iBodyPart[iAttacker]]))
                    else if(get_entvar(iAttacker, var_button) & IN_ATTACK)
                        SetHookChainArg(4, ATYPE_FLOAT, float(g_iDamage[g_iBodyPart[iAttacker]]) / 3.5)
                }
                case DAMAGE_LEFTARM, DAMAGE_RIGHTARM:
                {
                    if(get_entvar(iAttacker, var_button) & IN_ATTACK2)
                        SetHookChainArg(4, ATYPE_FLOAT, float(g_iDamage[g_iBodyPart[iAttacker]]))
                    else if(get_entvar(iAttacker, var_button) & IN_ATTACK)
                        SetHookChainArg(4, ATYPE_FLOAT, float(g_iDamage[g_iBodyPart[iAttacker]]) / 3.5)
                }
                case DAMAGE_LEFTLEG, DAMAGE_RIGHTLEG:
                {
                    if(get_entvar(iAttacker, var_button) & IN_ATTACK2)
                    {
                        SetHookChainArg(4, ATYPE_FLOAT, float(g_iDamage[g_iBodyPart[iAttacker]]))
                        client_print_color(0, print_team_default, "%d %f", g_iDamage[g_iBodyPart[iAttacker]], float(g_iDamage[g_iBodyPart[iAttacker]]))
                    }
                    else if(get_entvar(iAttacker, var_button) & IN_ATTACK)
                        SetHookChainArg(4, ATYPE_FLOAT, float(g_iDamage[g_iBodyPart[iAttacker]]) / 3.5)
                }
            }

            return HC_SUPERCEDE
        }
    }

    return HC_CONTINUE
}
 
Последнее редактирование:
Сообщения
1,304
Реакции
2,303
Помог
57 раз(а)
Brody, ещё раз говорю. Чтобы понимать что ты делаешь и как оно работает, изучи как работает TakeDamage в регейме

1) Ты делая SetHookChainArg() + HC_SUPERCEDE делаешь свой код неработоспособным потому что ты не установил возврат. В итоге в amxx-лог идёт ошибка и твой код тупо не работает.

2) Суперцид в TakeDamage может делаться в двух случаях. Когда тебе надо полностью заблокировать урон (работу функции в регейме) или когда тебе надо переопределить урон по своим правилам подразумевая полное замещение функции в регейме собственной логикой. В любом случае обязательно должен быть установлен возврат через SetHookChainReturn(), внимательно изучи функцию в регейме и обрати внимание что у функции есть возврат (1 или 0).

3) Опять же если ты нормально изучишь TakeDamage в регейме то увидишь что урон там может быть изменён. Есть квары reduction ff-урона, есть влияние брони. Тебе нужно в твоём коде обхитрить эти условия. К примеру нужно чтобы пуля не затрагивала броню. Как это сделать? В Pre хуке записываем броню жертвы и зануляем её. В Пост хуке если жертва осталась жива возвращаем броню обратно. Т.е. регейм гонит урон и не видя брони урон не изменяет. А затем мы броню возвращаем на место.
 

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

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