Наше комьюнити:   OpenGL Shader Lab  •  Half-Life FX  •  Форум  
HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Пара вопросов по оружию
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 13

Рейтинг



Half-Life Пара вопросов по оружию

Первое, сделал монтировку с замахом на манер ключа из опфора, т.е. зажимаешь лкм, затем отпускаешь, и фомка дает люлей.
Прикол в том, что при промахе игрок продолжает замахиваться, пока кого-нибудь(или что-нибудь) не стукнет. При попадании все вроде нормально, как задумано.
Код:

C++ Source Code:
void CCrowbar::PrimaryAttack()
{
    if ( SwingStart == 0 )
    {
        SwingStart = 1;
        SendWeaponAnim( CROWBAR_ATTACK1 );
        m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5;
    }
}


Айдл-функция, когда лкм отпускаешь:
C++ Source Code:
void CCrowbar::WeaponIdle( void )
{
    if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
        return;
    
    if ( (SwingStart != 0) )
    {
        //SetThink( &CCrowbar::SwingAgain );
        //pev->nextthink = gpGlobals->time + 1.0;
        Swing( 0 );
        SwingStart = 0;
        m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0;
    }
    else
    {
        m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
        SendWeaponAnim( CROWBAR_IDLE );
    }
}

Функция Swing() валвовская, там я ничего, кроме таймингов не менял.
И объясните, пожалуйста, что делает SetThink. Что с ним, что без него разницы никакой(на первый взгляд).

Сообщить модератору | | IP: Записан
Сообщение: 168882

Старое сообщение 15-11-2017 17:18
- За что?
Ku2zoff
Юзер (типа моддер)

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 4375
Возраст: 26

Рейтинг



sas проверь клиентский эвент монитровки. Вполне возможно, что это из-за него. Анимации в модели не лупленные? Тоже вариант проблемы. А вообще бы хорошо весь код в студию, т.к. эти два отрывка ни о чём не говорят. m_flNextAttack чему равно? Ни в одной, ни в другой функции нет ограничения по времени перед новой атакой.

__________________
Вы всё ещё не пьёте? Тогда мы идём к вам!

Сообщить модератору | | IP: Записан
Сообщение: 168886

Старое сообщение 15-11-2017 18:33
- За что?
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 13

Рейтинг



Ku2zoff, окей, задержка между атаками внизу

C++ Source Code:
int CCrowbar::Swing( int fFirst )
{
    int fDidHit = FALSE;
    
    TraceResult tr;
    
    UTIL_MakeVectors (m_pPlayer->pev->v_angle);
    Vector vecSrc    = m_pPlayer->GetGunPosition( );
    Vector vecEnd    = vecSrc + gpGlobals->v_forward * 32 * 2;// TL: crowbar hit distance
    
    UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr );
    
#ifndef CLIENT_DLL
    if ( tr.flFraction >= 1.0 )
    {
        UTIL_TraceHull( vecSrc, vecEnd, dont_ignore_monsters, head_hull, ENT( m_pPlayer->pev ), &tr );
        if ( tr.flFraction < 1.0 )
        {
            // Calculate the point of intersection of the line (or hull) and the object we hit
            // This is and approximation of the "best" intersection
            CBaseEntity *pHit = CBaseEntity::Instance( tr.pHit );
            if ( !pHit || pHit->IsBSPModel() )
                FindHullIntersection( vecSrc, tr, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX, m_pPlayer->edict() );
            vecEnd = tr.vecEndPos;// This is the point on the actual surface (the hull could have hit space)
        }
    }
#endif
    
    PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usCrowbar,
    0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0,
    0.0, 0, 0.0 );
    
    
    if ( tr.flFraction >= 1.0 )
    {
        if (fFirst)
        {
            // miss
            m_flNextPrimaryAttack = GetNextAttackDelay(1.0);
            //m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.2;
            
            // player "shoot" animation
            m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
        }
    }
    else
    {
        switch( ((m_iSwing++) % 2) + 1 )
        {
            case 0:
                SendWeaponAnim( CROWBAR_ATTACK1HIT ); break;
            case 1:
                SendWeaponAnim( CROWBAR_ATTACK2HIT ); break;
            case 2:
                SendWeaponAnim( CROWBAR_ATTACK3HIT ); break;
        }
        
        // player "shoot" animation
        m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
        
#ifndef CLIENT_DLL
        
        // hit
        fDidHit = TRUE;
        CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit);
        
        ClearMultiDamage( );
        
        if ( (m_flNextPrimaryAttack + 1 < UTIL_WeaponTimeBase() ) || g_pGameRules->IsMultiplayer() )
        {
            // first swing does full damage
            pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgCrowbar, gpGlobals->v_forward, &tr, DMG_CLUB );
        }
        else
        {
            // subsequent swings do half
            pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgCrowbar / 2, gpGlobals->v_forward, &tr, DMG_CLUB );
        }
        ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev );
        
        // play thwack, smack, or dong sound
        float flVol = 1.0;
        int fHitWorld = TRUE;
        
        if (pEntity)
        {
            if ( pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE )
            {
                // play thwack or smack sound
                switch( RANDOM_LONG(0,2) )
                {
                    case 0:
                        EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod1.wav", 1, ATTN_NORM); break;
                    case 1:
                        EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod2.wav", 1, ATTN_NORM); break;
                    case 2:
                        EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod3.wav", 1, ATTN_NORM); break;
                }
                m_pPlayer->m_iWeaponVolume = CROWBAR_BODYHIT_VOLUME;
                if ( !pEntity->IsAlive() )
                    return TRUE;
                else
                    flVol = 0.1;
                
                fHitWorld = FALSE;
            }
        }
        
        // play texture hit sound
        // UNDONE: Calculate the correct point of intersection when we hit with the hull instead of the line
        
        if (fHitWorld)
        {
            float fvolbar = TEXTURETYPE_PlaySound(&tr, vecSrc, vecSrc + (vecEnd-vecSrc)*2, BULLET_PLAYER_CROWBAR);
            
            if ( g_pGameRules->IsMultiplayer() )
            {
                // override the volume here, cause we don't play texture sounds in multiplayer,
                // and fvolbar is going to be 0 from the above call.
                
                fvolbar = 1;
            }
            
            // also play crowbar strike
            switch( RANDOM_LONG(0,1) )
            {
                case 0:
                    EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit1.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3));
                break;
                case 1:
                    EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit2.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3));
                break;
            }
            
            // delay the decal a bit
            m_trHit = tr;
        }
        
        m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME;
#endif
        m_flNextPrimaryAttack = GetNextAttackDelay(1.0);
        m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0;
        
        SetThink( &CCrowbar::Smack );
        pev->nextthink = UTIL_WeaponTimeBase() + 1.0;
    }
    return fDidHit;
}


С анимациями все в поряде, проблема в коде, где-то в айдле(а может и нет, черт знает), но я не догоняю.
Видос с этим
Нажимаю лкм в самом начале и самом конце, а дальше оно само.

Сообщить модератору | | IP: Записан
Сообщение: 168889

Старое сообщение 15-11-2017 20:08
- За что?
Chyvachok
Житель форума

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 1341

Рейтинг



sas лучше не куски кода, а как сказал Ku2zoff тупо весь код лома выложи, и судя по видео возможно дело таки в модели, у тебя анимация замахивания повторяется опять и опять, возможно у этой анимации стоит параметр loop, который зацикливает анимацию, (он нужен для анимаций вроде idle или зарядки гаусс пушки где анимация отыгрываться зациклено должна, а анимации вроде удара или перезарядки будут повторяться где не надо). Чтобы исправить это тебе надо декомпилировать модель, если у этой анимации есть loop то убрать его и заново скомпилировать.

Ну и код лома с ev_hldm.cpp на клиенте тоже надо проверить.

Сообщить модератору | | IP: Записан
Сообщение: 168890

Старое сообщение 15-11-2017 21:20
- За что?
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 13

Рейтинг



Chyvachok, crowbar.cpp

C++ Source Code:
void FindHullIntersection( const Vector &vecSrc, TraceResult &tr, float *mins, float *maxs, edict_t *pEntity )
{
    int    i, j, k;
    float    distance;
    float    *minmaxs[2] = {mins, maxs};
    TraceResult tmpTrace;
    Vector    vecHullEnd = tr.vecEndPos;
    Vector    vecEnd;
    
    distance = 1e6f;
    
    vecHullEnd = vecSrc + ((vecHullEnd - vecSrc)*2);
    UTIL_TraceLine( vecSrc, vecHullEnd, dont_ignore_monsters, pEntity, &tmpTrace );
    if ( tmpTrace.flFraction < 1.0 )
    {
        tr = tmpTrace;
        return;
    }
    
    for ( i = 0; i < 2; i++ )
    {
        for ( j = 0; j < 2; j++ )
        {
            for ( k = 0; k < 2; k++ )
            {
                vecEnd.x = vecHullEnd.x + minmaxs[i][0];
                vecEnd.y = vecHullEnd.y + minmaxs[j][1];
                vecEnd.z = vecHullEnd.z + minmaxs[k][2];
                
                UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, pEntity, &tmpTrace );
                if ( tmpTrace.flFraction < 1.0 )
                {
                    float thisDistance = (tmpTrace.vecEndPos - vecSrc).Length();
                    if ( thisDistance < distance )
                    {
                        tr = tmpTrace;
                        distance = thisDistance;
                    }
                }
            }
        }
    }
}


void CCrowbar::PrimaryAttack()
{
    if ( SwingStart == 0 )
    {
        SwingStart = 1;
        ALERT(at_console, "swing! \n");
        SendWeaponAnim( CROWBAR_ATTACK1 );
        
        m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.7;
/*SetThink( &CCrowbar::SwingAgain );
        pev->nextthink = gpGlobals->time + 0.1;*/

    }
}


void CCrowbar::Smack( )
{
    DecalGunshot( &m_trHit, BULLET_PLAYER_CROWBAR );
}


void CCrowbar::SwingAgain( void )
{
    Swing( 0 );
}

void CCrowbar::WeaponIdle( void )
{
    if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
        return;
    
    if ( (SwingStart != 0) )
    {
        //SetThink( &CCrowbar::SwingAgain );
        //pev->nextthink = gpGlobals->time + 1.0;
        Swing( 0 );
        SwingStart = 0;
        m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.7;
    }
    else
    {
        m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
        SendWeaponAnim( CROWBAR_IDLE );
    }
}

int CCrowbar::Swing( int fFirst )
{
    int fDidHit = FALSE;
    
    TraceResult tr;
    
    UTIL_MakeVectors (m_pPlayer->pev->v_angle);
    Vector vecSrc    = m_pPlayer->GetGunPosition( );
    Vector vecEnd    = vecSrc + gpGlobals->v_forward * 32 * 2;// TL: crowbar hit distance
    
    UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr );
    
#ifndef CLIENT_DLL
    if ( tr.flFraction >= 1.0 )
    {
        UTIL_TraceHull( vecSrc, vecEnd, dont_ignore_monsters, head_hull, ENT( m_pPlayer->pev ), &tr );
        if ( tr.flFraction < 1.0 )
        {
            // Calculate the point of intersection of the line (or hull) and the object we hit
            // This is and approximation of the "best" intersection
            CBaseEntity *pHit = CBaseEntity::Instance( tr.pHit );
            if ( !pHit || pHit->IsBSPModel() )
                FindHullIntersection( vecSrc, tr, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX, m_pPlayer->edict() );
            vecEnd = tr.vecEndPos;// This is the point on the actual surface (the hull could have hit space)
        }
    }
#endif
    
    PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usCrowbar,
    0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0,
    0.0, 0, 0.0 );
    
    
    if ( tr.flFraction >= 1.0 )
    {
        if (fFirst)
        {
            // miss
            m_flNextPrimaryAttack = GetNextAttackDelay(0.5);
            //m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0;
            
            // player "shoot" animation
            m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
        }
    }
    else
    {
        switch( ((m_iSwing++) % 2) + 1 )
        {
            case 0:
                SendWeaponAnim( CROWBAR_ATTACK1HIT ); break;
            case 1:
                SendWeaponAnim( CROWBAR_ATTACK2HIT ); break;
            case 2:
                SendWeaponAnim( CROWBAR_ATTACK3HIT ); break;
        }
        
        // player "shoot" animation
        m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
        
#ifndef CLIENT_DLL
        
        // hit
        fDidHit = TRUE;
        CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit);
        
        ClearMultiDamage( );
        
        if ( (m_flNextPrimaryAttack + 1 < UTIL_WeaponTimeBase() ) || g_pGameRules->IsMultiplayer() )
        {
            // first swing does full damage
            pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgCrowbar, gpGlobals->v_forward, &tr, DMG_CLUB );
        }
        else
        {
            // subsequent swings do half
            pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgCrowbar / 2, gpGlobals->v_forward, &tr, DMG_CLUB );
        }
        ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev );
        
        // play thwack, smack, or dong sound
        float flVol = 1.0;
        int fHitWorld = TRUE;
        
        if (pEntity)
        {
            if ( pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE )
            {
                // play thwack or smack sound
                switch( RANDOM_LONG(0,2) )
                {
                    case 0:
                        EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod1.wav", 1, ATTN_NORM); break;
                    case 1:
                        EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod2.wav", 1, ATTN_NORM); break;
                    case 2:
                        EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hitbod3.wav", 1, ATTN_NORM); break;
                }
                m_pPlayer->m_iWeaponVolume = CROWBAR_BODYHIT_VOLUME;
                if ( !pEntity->IsAlive() )
                    return TRUE;
                else
                    flVol = 0.1;
                
                fHitWorld = FALSE;
            }
        }
        
        // play texture hit sound
        // UNDONE: Calculate the correct point of intersection when we hit with the hull instead of the line
        
        if (fHitWorld)
        {
            float fvolbar = TEXTURETYPE_PlaySound(&tr, vecSrc, vecSrc + (vecEnd-vecSrc)*2, BULLET_PLAYER_CROWBAR);
            
            if ( g_pGameRules->IsMultiplayer() )
            {
                // override the volume here, cause we don't play texture sounds in multiplayer,
                // and fvolbar is going to be 0 from the above call.
                
                fvolbar = 1;
            }
            
            // also play crowbar strike
            switch( RANDOM_LONG(0,1) )
            {
                case 0:
                    EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit1.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3));
                break;
                case 1:
                    EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/cbar_hit2.wav", fvolbar, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3));
                break;
            }
            
            // delay the decal a bit
            m_trHit = tr;
        }
        
        m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME;
#endif
        m_flNextPrimaryAttack = GetNextAttackDelay(0.5);
        m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5;
        
        SetThink( &CCrowbar::Smack );
        pev->nextthink = UTIL_WeaponTimeBase() + 0.5;
    }
    return fDidHit;
}


Вот эвент в хлдм.цпп, его я не трогал, только список анимаций обновил
C++ Source Code:
enum crowbar_e {
    CROWBAR_IDLE = 0,
    CROWBAR_DRAW,
    //CROWBAR_HOLSTER,
    CROWBAR_ATTACK1,
    CROWBAR_ATTACK1MISS,
    CROWBAR_ATTACK1HIT,
    CROWBAR_ATTACK2,
    CROWBAR_ATTACK2MISS,
    CROWBAR_ATTACK2HIT,
    CROWBAR_ATTACK3,
    CROWBAR_ATTACK3MISS,
    CROWBAR_ATTACK3HIT
};

int g_iSwing;

//Only predict the miss sounds, hit sounds are still played
//server side, so players don't get the wrong idea.
void EV_Crowbar( event_args_t *args )
{
    int idx;
    vec3_t origin;
    vec3_t angles;
    vec3_t velocity;
    
    idx = args->entindex;
    VectorCopy( args->origin, origin );
    
    //Play Swing sound
    gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/cbar_miss1.wav", 1, ATTN_NORM, 0, PITCH_NORM);
    
    if ( EV_IsLocal( idx ) )
    {
        gEngfuncs.pEventAPI->EV_WeaponAnimation( CROWBAR_ATTACK1MISS, 1 );
        
        switch( (g_iSwing++) % 3 )
        {
            case 0:
                gEngfuncs.pEventAPI->EV_WeaponAnimation ( CROWBAR_ATTACK1MISS, 1 ); break;
            case 1:
                gEngfuncs.pEventAPI->EV_WeaponAnimation ( CROWBAR_ATTACK2MISS, 1 ); break;
            case 2:
                gEngfuncs.pEventAPI->EV_WeaponAnimation ( CROWBAR_ATTACK3MISS, 1 ); break;
        }
    }
}


А насчет анимаций я уверен, модель моя, в qc никаких лупов не добавлял.

Сообщить модератору | | IP: Записан
Сообщение: 168891

Старое сообщение 15-11-2017 22:11
- За что?
Ku2zoff
Юзер (типа моддер)

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 4375
Возраст: 26

Рейтинг



Хм. А в коде гранаты две переменных: одна для стадии броска (выдёргивание чеки и замах, а потом бросок), и одна для времени, потраченного на это. А у тебя только одна SwingStart. Я не помню, как там у меня сделано в разводном ключе, если сорцы сейчас с собой на флешке, я гляну.

__________________
Вы всё ещё не пьёте? Тогда мы идём к вам!

Сообщить модератору | | IP: Записан
Сообщение: 168893

Старое сообщение 16-11-2017 02:40
- За что?
Chyvachok
Житель форума

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 1341

Рейтинг



Цитата:
Ku2zoff писал:
Я не помню, как там у меня сделано в разводном ключе, если сорцы сейчас с собой на флешке, я гляну.


Если нету я могу скинуть код опфоровского ключа из кода Raven City ну или HL Enhanced: https://github.com/SamVanheer/HLEnh...ntities/weapons

Сообщить модератору | | IP: Записан
Сообщение: 168895

Старое сообщение 16-11-2017 09:16
- За что?
Ku2zoff
Юзер (типа моддер)

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 4375
Возраст: 26

Рейтинг



Chyvachok этот код может помочь топикстартеру. Скорее всего он что-то упустил у себя.

Добавлено 16-11-2017 в 17:32:

И да, очень громоздко. У меня намного меньше строк. Если интересно, могу поделиться.

__________________
Вы всё ещё не пьёте? Тогда мы идём к вам!

Сообщить модератору | | IP: Записан
Сообщение: 168897

Старое сообщение 16-11-2017 10:32
- За что?
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 13

Рейтинг



Chyvachok, добавил условие в айдле, как у тебя, и все исправилось.

C++ Source Code:
if ( (SwingStart != 0) )
{
    if ( SwingStart == 1 )
    {
        //SetThink( &CCrowbar::SwingAgain );
        //pev->nextthink = gpGlobals->time + 1.0;
        ALERT(at_console, "swinging! \n");
        Swing( 0 );
        SwingStart = 2;
    }
    else
    {
        m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
        SwingStart = 0;
        ALERT(at_console, "end swinging! \n");
    }
}


Спасибо, пацаны.
Ku2zoff, конечно интересно.

Сообщить модератору | | IP: Записан
Сообщение: 168899

Старое сообщение 16-11-2017 13:51
- За что?
Chyvachok
Житель форума

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 1341

Рейтинг



sas интересно анимации твои? Неплохо выглядят, кстати если все работает как надо ALERT-ы можешь закомментировать, если что оно только текст пишет в консоли, правда оно и не мешает особо тоже.

Ну и в плане кода оружия в общем если что-то не ясно очень полезны исходники ХЛВЕ, там есть чего подсмотреть.

Сообщить модератору | | IP: Записан
Сообщение: 168900

Старое сообщение 16-11-2017 14:57
- За что?
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 13

Рейтинг



Chyvachok, да анимашки мои.
Что за хлве, а то я не в теме. Это то, что ты выше кинул?

Сообщить модератору | | IP: Записан
Сообщение: 168901

Старое сообщение 16-11-2017 15:06
- За что?
Chyvachok
Житель форума

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 1341

Рейтинг



sas ХЛВЕ это мод авторства Ghoul [BB], он тоже кстати тут зарегистрирован, то я с другого совсем мода код скинул, ссылку на ХЛВЕ и код можно тут найти, только увы последняя версия глючная увы, вылетает: http://www.moddb.com/mods/half-life-weapon-edition

Сообщить модератору | | IP: Записан
Сообщение: 168903

Старое сообщение 16-11-2017 15:51
- За что?
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 13

Рейтинг



Chyvachok, а все понял, благодарю

Сообщить модератору | | IP: Записан
Сообщение: 168905

Старое сообщение 16-11-2017 19:27
- За что?
Ku2zoff
Юзер (типа моддер)

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 4375
Возраст: 26

Рейтинг



Цитата:
sas писал:
Ku2zoff, конечно интересно.

В аттаче код самого оружия, а в посте кусок из ev_hldm.cpp. Правда, нужно ещё кое-что переписать для красоты, но код вполне читаемый и понятный.
C++ Source Code:
void EV_WrenchAttack(event_args_t *args)
{
    int idx;
    vec3_t origin;
    
    idx = args->entindex;
    VectorCopy(args->origin, origin);
    
    int m_iHit = args->bparam1;
    int m_iHitWorld = args->bparam2;
    int m_iSecAttack = args->iparam2;
    
    if (!m_iSecAttack)
    {
        switch (gEngfuncs.pfnRandomLong(0, 1))
        {
            case 0:gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_WEAPON,
                "weapons/wrench_miss1.wav", 1, ATTN_NORM, 0, PITCH_NORM);
            break;
            case 1:gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_WEAPON,
                "weapons/wrench_miss2.wav", 1, ATTN_NORM, 0, PITCH_NORM);
            break;
        }
    }
    else if (m_iSecAttack != 2)
    {
        gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_WEAPON,
        "weapons/wrench_miss_big.wav", 1, ATTN_NORM, 0, PITCH_NORM);
    }
    
    if (EV_IsLocal(idx))
    {
        if (m_iSecAttack == 1)
            gEngfuncs.pEventAPI->EV_WeaponAnimation(m_iHit ? WRENCH_HIT : WRENCH_MISS, 0);
        else if (m_iSecAttack == 2)
            gEngfuncs.pEventAPI->EV_WeaponAnimation(WRENCH_CHARGE, 0);
        else
        {
            switch (gEngfuncs.pfnRandomLong(0, 2))
            {
                case 0:
                    gEngfuncs.pEventAPI->EV_WeaponAnimation(m_iHit ? WRENCH_ATTACK1HIT : WRENCH_ATTACK1MISS, 0); break;
                case 1:
                    gEngfuncs.pEventAPI->EV_WeaponAnimation(m_iHit ? WRENCH_ATTACK2HIT : WRENCH_ATTACK2MISS, 0); break;
                case 2:
                    gEngfuncs.pEventAPI->EV_WeaponAnimation(m_iHit ? WRENCH_ATTACK3HIT : WRENCH_ATTACK3MISS, 0); break;
            }
        }
    }
    
    if (m_iHit) // удар
    {
        if (m_iHitWorld) // по брашу
        {
            if (m_iSecAttack)
            {
                switch (gEngfuncs.pfnRandomLong(0, 1))
                {
                    case 0:gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
                        "weapons/wrench_hitwall_big1.wav", 1, ATTN_NORM, 0, PITCH_NORM);
                    break;
                    case 1:gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
                        "weapons/wrench_hitwall_big2.wav", 1, ATTN_NORM, 0, PITCH_NORM);
                    break;
                }
            }
            else
            {
                switch (gEngfuncs.pfnRandomLong(0, 1))
                {
                    case 0:gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
                        "weapons/wrench_hitwall1.wav", 1, ATTN_NORM, 0, PITCH_NORM);
                    break;
                    case 1:gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
                        "weapons/wrench_hitwall2.wav", 1, ATTN_NORM, 0, PITCH_NORM);
                    break;
                }
            }
        }
        else // по мясу
        {
            if (m_iSecAttack)
            {
                switch (gEngfuncs.pfnRandomLong(0, 1))
                {
                    case 0:gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
                        "weapons/wrench_hitbod_big1.wav", 1, ATTN_NORM, 0, PITCH_NORM);
                    break;
                    case 1:gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
                        "weapons/wrench_hitbod_big2.wav", 1, ATTN_NORM, 0, PITCH_NORM);
                    break;
                }
            }
            else
            {
                switch (gEngfuncs.pfnRandomLong(0, 2))
                {
                    case 0:gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
                        "weapons/wrench_hitbod1.wav", 1, ATTN_NORM, 0, PITCH_NORM);
                    break;
                    case 1:gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
                        "weapons/wrench_hitbod2.wav", 1, ATTN_NORM, 0, PITCH_NORM);
                    break;
                    case 2:gEngfuncs.pEventAPI->EV_PlaySound(idx, origin, CHAN_ITEM,
                        "weapons/wrench_hitbod3.wav", 1, ATTN_NORM, 0, PITCH_NORM);
                    break;
                }
            }
        }
    }
}


Добавлено 17-11-2017 в 18:36:

А, блин, хеадер забыл
C++ Source Code:
class CWPNWrench : public CBasePlayerWeapon
{
public:
    void Spawn(void);
    void Precache(void);
    
    int GetItemInfo(ItemInfo *p);
    int AddToPlayer(CBasePlayer *pPlayer);
    
    BOOL Deploy(void);
    void Holster(int skiplocal = 0);
    
    void PrimaryAttack(void);
    void SecondaryAttack(void);
    void Attack(bool fSecAttack);
    
    void WeaponIdle(void);
    
    virtual BOOL UseDecrement(void)
    {
#if defined( CLIENT_WEAPONS )
        return TRUE;
#else
        return FALSE;
#endif
    }
    
    virtual float GetSpread(void) { return 0.05; };
private:
    float m_flSwingTime;
    float m_flSwingRelease;
    
    unsigned short m_usWrenchAttack;
};


Добавлено 17-11-2017 в 18:38:

GetSpread - функция разброса пуль, в халфе её нет. В нестреляющих оружиях я использую затычки, чтобы был фиксированный размер прицела.

Вложение: wpn_wrench.zip (2.3 кб)
Этот файл был скачан 9 раз.

__________________
Вы всё ещё не пьёте? Тогда мы идём к вам!

Сообщить модератору | | IP: Записан
Сообщение: 168908

Старое сообщение 17-11-2017 11:38
- За что?
sas
Новичок

Дата регистрации: Mar 2017
Проживает: Xen
Сообщений: 13

Рейтинг



Ku2zoff, о спасибо, полезная вещь!
Вот еще вопрос вдогонку: допустим, я хочу сделать на фомке допатаку - удар кулаком. Как мне сделать задержку между нажатием на пкм и самим ударом, т.е. я нажимаю атаку, затем проигрывается анимация и только потом в ее конце происходит удар.

Сообщить модератору | | IP: Записан
Сообщение: 168909

Старое сообщение 17-11-2017 12:31
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 12:03. Новая тема    Ответить
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Пара вопросов по оружию
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Chain Studios © 2005-2017

Рейтинг@Mail.ru