int CKnife::Stab( 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 * 48; UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr ); if ( tr.flFraction >= 1.0 ) { UTIL_TraceHull( vecSrc, vecEnd, dont_ignore_monsters, head_hull, ENT( m_pPlayer->pev ), &tr ); if ( tr.flFraction < 1.0 ) { 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; } } if ( tr.flFraction >= 1.0 ) { if ( fFirst ) { SendWeaponAnim( KNIFE_STAB_MISS, UseDecrement() ); m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.0; if ( RANDOM_LONG( 0, 1 ) ) EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/knife_slash1.wav", VOL_NORM, ATTN_NORM, 0, 94 ); else EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/knife_slash2.wav", VOL_NORM, ATTN_NORM, 0, 94 ); m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); } } else { fDidHit = TRUE; SendWeaponAnim( KNIFE_STAB, UseDecrement() ); m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.1; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.1; float fVol = 1.0; BOOL bHitWorld = TRUE; CBaseEntity *pEntity = CBaseEntity::Instance( tr.pHit ); m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); float damage = 65.0; if ( pEntity && pEntity->IsPlayer() ) { Vector2D vec2LOS; Vector vecForward = gpGlobals->v_forward; UTIL_MakeVectors( m_pPlayer->pev->angles ); vec2LOS = vecForward.Make2D(); vec2LOS = vec2LOS.Normalize(); if ( DotProduct( vec2LOS, gpGlobals->v_forward.Make2D() > 0.8 ) { damage *= 3.0; } } UTIL_MakeVectors( m_pPlayer->EyePosition() ); ClearMultiDamage(); pEntity->TraceAttack( m_pPlayer->pev, damage, gpGlobals->v_forward, &tr, DMG_BULLET | DMG_NEVERGIB ); ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev ); if ( pEntity ) { if ( pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE ) { EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/knife_stab.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM ); pPlayer->m_iWeaponVolume = KNIFE_BODYHIT_VOLUME; if ( !pEntity->IsAlive() ) { return TRUE; } flVol = 0.1; bHitWorld = FALSE; } } if ( bHitWorld ) { TEXTURETYPE_PlaySound( &tr, vecSrc, vecSrc + ( vecEnd - vecSrc ) * 2, BULLET_PLAYER_KNIFE ); switch( RANDOM_LONG( 0, 1 ) ) { case 0: EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/knife_hitwall1.wav", VOL_NORM, ATTN_NORM, 0, 98 + RANDOM_LONG( 0, 3 ) ); break; case 1: EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/knife_hitwall2.wav", VOL_NORM, ATTN_NORM, 0, 98 + RANDOM_LONG( 0, 3 ) ); break; } } m_trHit = tr; SetThink( &Smack ); pev->nextthink = UTIL_WeaponTimeBase() + 0.2; m_pPlayer->m_iWeaponVolume = flVol * KNIFE_WALLHIT_VOLUME; } }