Индикатор получения урона

d3m37r4

111111
Сообщения
1,449
Реакции
1,175
Помог
10 раз(а)
Собсно, вопрос: что отвечает за показ данного спрайта и спрайт-ли это вообще?
Покопавшись в клиенте среди ресурсов не нашел подобного.
При скрывании hp/ap/радара посредством флага HIDEHUD_HEALTH, блочатся спрайты показывающие тип урона (в левом нижнем углу), а также и индикатор урона, см. скрин ниже:
20573
Вики на алленях говорит, что евент Damage происходит как раз в момент получения урона для отображения индикации получения урона, т.е. вроде как, нужно мессагу отрисовать этого евента, т.е. по сути воспроизвести код функции UpdateClientData
В cssdk_const.inc как раз есть и флаги для отображения типа урона.
Попытки воспроизвести то, о чем говорил выше в постфункции CBasePlayer_TakeDamage ни к чему не привели.
Код:
    new dmg_take = get_entvar(this, var_dmg_take);
    new dmg_save = get_entvar(this, var_dmg_save);

    new Float:damageOrigin[3];
    get_entvar(this, var_origin, damageOrigin);

    new visibleDamageBits = bitsDamageType & DMG_SHOWNHUD;
    message_begin(MSG_ONE, get_user_msgid("Damage"), _, this);
    write_byte(dmg_save);
    write_byte(dmg_take);
    write_long(visibleDamageBits);
    write_coord_f(damageOrigin[0]);
    write_coord_f(damageOrigin[1]);
    write_coord_f(damageOrigin[2]);
    message_end();
Закрадывается впечатление, что это какая-то моделька которая выводится на экран по каким-то клиентским евентам, которые сервером никак не отлавливаются.
 

Download all Attachments

Последнее редактирование:
Сообщения
141
Реакции
201
Помог
5 раз(а)
123
 
Последнее редактирование:
Сообщения
134
Реакции
463
Помог
2 раз(а)
Это не модель а спрайт. Находится в папке Half-Life\valve\sprites\. 320_pain.spr & 640_pain.spr
Подгружается он на клиенте, cl_dll/Health.cpp

C++:
#define PAIN_NAME "sprites/%d_pain.spr"

m_hSprite = LoadSprite(PAIN_NAME);

int CHudHealth::DrawPain(float flTime)
{
    if (!(m_fAttackFront || m_fAttackRear || m_fAttackLeft || m_fAttackRight))
        return 1;

    int r, g, b;
    int x, y, a, shade;

    // TODO:  get the shift value of the health
    a = 255;    // max brightness until then

    float fFade = gHUD.m_flTimeDelta * 2;
    
    // SPR_Draw top
    if (m_fAttackFront > 0.4)
    {
        GetPainColor(r,g,b);
        shade = a * max( m_fAttackFront, 0.5 );
        ScaleColors(r, g, b, shade);
        SPR_Set(m_hSprite, r, g, b );

        x = ScreenWidth/2 - SPR_Width(m_hSprite, 0)/2;
        y = ScreenHeight/2 - SPR_Height(m_hSprite,0) * 3;
        SPR_DrawAdditive(0, x, y, NULL);
        m_fAttackFront = max( 0, m_fAttackFront - fFade );
    } else
        m_fAttackFront = 0;

    if (m_fAttackRight > 0.4)
    {
        GetPainColor(r,g,b);
        shade = a * max( m_fAttackRight, 0.5 );
        ScaleColors(r, g, b, shade);
        SPR_Set(m_hSprite, r, g, b );

        x = ScreenWidth/2 + SPR_Width(m_hSprite, 1) * 2;
        y = ScreenHeight/2 - SPR_Height(m_hSprite,1)/2;
        SPR_DrawAdditive(1, x, y, NULL);
        m_fAttackRight = max( 0, m_fAttackRight - fFade );
    } else
        m_fAttackRight = 0;

    if (m_fAttackRear > 0.4)
    {
        GetPainColor(r,g,b);
        shade = a * max( m_fAttackRear, 0.5 );
        ScaleColors(r, g, b, shade);
        SPR_Set(m_hSprite, r, g, b );

        x = ScreenWidth/2 - SPR_Width(m_hSprite, 2)/2;
        y = ScreenHeight/2 + SPR_Height(m_hSprite,2) * 2;
        SPR_DrawAdditive(2, x, y, NULL);
        m_fAttackRear = max( 0, m_fAttackRear - fFade );
    } else
        m_fAttackRear = 0;

    if (m_fAttackLeft > 0.4)
    {
        GetPainColor(r,g,b);
        shade = a * max( m_fAttackLeft, 0.5 );
        ScaleColors(r, g, b, shade);
        SPR_Set(m_hSprite, r, g, b );

        x = ScreenWidth/2 - SPR_Width(m_hSprite, 3) * 3;
        y = ScreenHeight/2 - SPR_Height(m_hSprite,3)/2;
        SPR_DrawAdditive(3, x, y, NULL);

        m_fAttackLeft = max( 0, m_fAttackLeft - fFade );
    } else
        m_fAttackLeft = 0;

    return 1;
}
 
Сообщения
210
Реакции
334
Помог
3 раз(а)
Отвечают за это координаты, которые отправились в DeathMsg. А координаты отправляются pevInflictor либо свои на момент смерти. Исходя из личного опыта их можно заблокировать, указав pevInflictor = 0, т.е как worldspawn (тогда в мессаге отправится нулевой вектор).
 

d3m37r4

111111
Сообщения
1,449
Реакции
1,175
Помог
10 раз(а)
Xelson, а заслать мессагу для отображения спрайта нельзя? Ибо, когда блочим радар с хп и ап, блочится еще и этот спрайт.
 
Сообщения
1,697
Реакции
1,510
Помог
25 раз(а)

d3m37r4

111111
Сообщения
1,449
Реакции
1,175
Помог
10 раз(а)
Сообщения
289
Реакции
251
Помог
7 раз(а)
d3m37r4, это называется лень разработчиков, пихнем всё в одно, лишь бы работало и никто тогда не думал, что когда-то в будущем, кто-то полезет копать эти руины.
 
Сообщения
1,277
Реакции
2,262
Помог
57 раз(а)
Jumper, это не лень. Тогда это всё делалось под конкретные нужды, и никто не думал про будущее появление AMX(X). Валву под свой мод достаточно выпустить свой клиент и свой сервер со своим набором мессаг.
 

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

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