void CSmokeGrenade::WeaponIdle() { if( !m_flReleaseThrow && m_flStartThrow ) { m_flReleaseThrow = gpGlobals->time; } if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) { return; } if( m_flStartThrow ) { m_pPlayer->Radio( "%!MRAD_FIREINHOLE", "#Fire_in_the_hole", PITCH_NORM, TRUE ); Vector angThrow = m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle; if( angThrow.x < 0 ) angThrow.x = -10 + angThrow.x * ( ( 90 - 10 ) / 90.0 ); else angThrow.x = -10 + angThrow.x * ( ( 90 + 10 ) / 90.0 ); float flVel = ( 90 - angThrow.x ) * 6; if( flVel > 750 ) { flVel = 750; } UTIL_MakeVectors( angThrow ); Vector vecSrc = m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16; Vector vecThrow = gpGlobals->v_forward * flVel + m_pPlayer->pev->velocity; CGrenade::ShootSmokeGrenade( m_pPlayer->pev, vecSrc, vecThrow, 1.5, m_usSmoke ); SendWeaponAnim( SMOKEGRENADE_THROW, UseDecrement() ); SetPlayerShieldAnim(); m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_flStartThrow = 0; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.75; m_pPlayer->m_rgAmmo[ m_iPrimaryAmmoType ]--; if( !m_pPlayer->m_rgAmmo[ m_iPrimaryAmmoType ] ) { m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5; m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5; } ResetPlayerShieldAnim(); return; } else if( m_flReleaseThrow ) { m_flStartThrow = 0; if( m_pPlayer->m_rgAmmo[ m_iPrimaryAmmoType ] ) { SendWeaponAnim( SMOKEGRENADE_DEPLOY, UseDecrement() ); m_flReleaseThrow = -1.0; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + RANDOM_FLOAT( 10.0, 15.0 ); } else { RetireWeapon(); } return; } if( m_pPlayer->m_rgAmmo[ m_iPrimaryAmmoType ] ) { if( m_pPlayer->HasShield() ) { m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 20.0; if( !FBitSet( m_fWeaponState, WEAPONSTATE_SHIELD_DRAWN ) ) { SendWeaponAnim( GRENADE_SHIELD_IDLE, UseDecrement() ); } } else { SendWeaponAnim( SMOKEGRENADE_IDLE, UseDecrement() ); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + RANDOM_FLOAT( 10.0, 15.0 ); } } }
void CHEGrenade::__MAKE_VHOOK(WeaponIdle)() { if (m_flReleaseThrow == 0 && m_flStartThrow != 0.0f) m_flReleaseThrow = gpGlobals->time; if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase()) return; if (m_flStartThrow) { m_pPlayer->Radio("%!MRAD_FIREINHOLE", "#Fire_in_the_hole"); Vector angThrow = m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle; if (angThrow.x < 0) angThrow.x = -10 + angThrow.x * ((90 - 10) / 90.0); else angThrow.x = -10 + angThrow.x * ((90 + 10) / 90.0); float flVel = (90.0f - angThrow.x) * 6.0f; if (flVel > 750.0f) flVel = 750.0f; UTIL_MakeVectors(angThrow); Vector vecSrc = m_pPlayer->pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_forward * 16; Vector vecThrow = gpGlobals->v_forward * flVel + m_pPlayer->pev->velocity; CGrenade::ShootTimed2(m_pPlayer->pev, vecSrc, vecThrow, 1.5, m_pPlayer->m_iTeam, m_usCreateExplosion); SendWeaponAnim(HEGRENADE_THROW, UseDecrement() != FALSE); SetPlayerShieldAnim(); // player "shoot" animation m_pPlayer->SetAnimation(PLAYER_ATTACK1); m_flStartThrow = 0; m_flNextPrimaryAttack = GetNextAttackDelay(0.5); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.75f; if (--m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) { // just threw last grenade // set attack times in the future, and weapon idle in the future so we can see the whole throw // animation, weapon idle will automatically retire the weapon for us. // ensure that the animation can finish playing m_flTimeWeaponIdle = m_flNextSecondaryAttack = m_flNextPrimaryAttack = GetNextAttackDelay(0.5); } ResetPlayerShieldAnim(); } else if (m_flReleaseThrow > 0) { // we've finished the throw, restart. m_flStartThrow = 0; if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) { SendWeaponAnim(HEGRENADE_DRAW, UseDecrement() != FALSE); } else { RetireWeapon(); return; } m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + RANDOM_FLOAT(10, 15); m_flReleaseThrow = -1.0f; } else if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) { if (m_pPlayer->HasShield()) { m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 20.0f; if (m_iWeaponState & WPNSTATE_SHIELD_DRAWN) { SendWeaponAnim(SHIELDREN_IDLE, UseDecrement() != FALSE); } } else { SendWeaponAnim(HEGRENADE_IDLE, UseDecrement() != FALSE); // how long till we do this again. m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + RANDOM_FLOAT(10, 15); } } }
void CUSP::USPFire( float flSpread, float flCycleTime, BOOL fFireBurst ) { m_iShotsFired++; flCycleTime -= USP_ADJUSTED_CYCLE_TIME; if( m_iShotsFired > 1 ) { return; } if( !m_flLastFire ) { m_flLastFire = gpGlobals->time; } else { m_flAccuracy -= ( USP_ADJUSTED_CYCLE_TIME - ( gpGlobals->time - m_flLastFire ) ) * USP_ACCURACY_OFFSET; if( m_flAccuracy > 0.92 ) { m_flAccuracy = 0.92; } else if( m_flAccuracy < 0.6 ) { m_flAccuracy = 0.6; } m_flLastFire = gpGlobals->time; } if( m_iClip <= 0 ) { if( m_fFireOnEmpty ) { PlayEmptySound(); m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.2; } /*! @todo Implements me : if( TheBots ) TheBots->OnEvent( EVENT_WEAPON_FIRED_ON_EMPTY, m_pPlayer->pev, NULL );*/ return; } m_iClip--; m_flNextPrimaryAttack = m_flNextSecondaryAttack = gpGlobals->time + flCycleTime; SetPlayerShieldAnim(); m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_pPlayer->m_iWeaponVolume = BIG_EXPLOSION_VOLUME; m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH; UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle ); int damageAmount; if( FBitSet( m_fWeaponState, WEAPONSTATE_USP_SILENCED ) ) { damageAmount = USP_DAMAGE_SILENCED; } else { damageAmount = USP_DAMAGE; m_pPlayer->pev->effects |= EF_MUZZLEFLASH; } Vector vecDir = m_pPlayer->FireBullets3( m_pPlayer->GetGunPosition(), gpGlobals->v_forward, flSpread, 4096.0, USP_PENETRATION, BULLET_PLAYER_45ACP, damageAmount, USP_RANGE_MODIFIER, m_pPlayer->pev, TRUE, m_pPlayer->random_seed ); PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usUSP, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, m_pPlayer->pev->punchangle.x * 100, 0, m_iClip ? FALSE : TRUE, FBitSet( m_fWeaponState, WEAPONSTATE_USP_SILENCED ) ? TRUE : FALSE ); if( !m_iClip && m_pPlayer->m_rgAmmo[ m_iPrimaryAmmoType ] <= 0 ) { m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 ); } m_pPlayer->pev->punchangle.x -= 2.0; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + USP_IDLE_TIME; ResetPlayerShieldAnim(); }
void CP228::P228Fire(float flSpread, float flCycleTime, BOOL fUseAutoAim) { flCycleTime -= 0.05; m_iShotsFired++; if (m_iShotsFired > 1) return; if (m_flLastFire) { m_flAccuracy -= (0.325 - (gpGlobals->time - m_flLastFire)) * 0.3; if (m_flAccuracy > 0.9) m_flAccuracy = 0.9; else if (m_flAccuracy < 0.6) m_flAccuracy = 0.6; } m_flLastFire = gpGlobals->time; if (m_iClip <= 0) { if (m_fFireOnEmpty) { PlayEmptySound(); m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.2; } return; } m_iClip--; m_pPlayer->pev->effects |= EF_MUZZLEFLASH; SetPlayerShieldAnim(); #ifndef CLIENT_DLL m_pPlayer->SetAnimation(PLAYER_ATTACK1); #endif UTIL_MakeVectors(m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle); m_pPlayer->m_iWeaponVolume = BIG_EXPLOSION_VOLUME; m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH; Vector vecSrc = m_pPlayer->GetGunPosition(); Vector vecDir = m_pPlayer->FireBullets3(vecSrc, gpGlobals->v_forward, flSpread, 4096, 1, BULLET_PLAYER_357SIG, 32, 0.8, m_pPlayer->pev, TRUE, m_pPlayer->random_seed); int flags; #ifdef CLIENT_WEAPONS flags = FEV_NOTHOST; #else flags = 0; #endif PLAYBACK_EVENT_FULL(flags, m_pPlayer->edict(), m_usFireP228, 0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, (int)(m_pPlayer->pev->punchangle.x * 100), (int)(m_pPlayer->pev->punchangle.y * 100), m_iClip != 0, FALSE); m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + flCycleTime; #ifndef CLIENT_DLL if (!m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) m_pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0); #endif m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 2; ResetPlayerShieldAnim(); m_pPlayer->pev->punchangle.x -= 2; }
void CDEAGLE::DEAGLEFire( float flSpread, float flCycleTime, BOOL fUseAutoAim ) { m_iShotsFired++; if( m_iShotsFired > 1 ) { return; } if( m_flLastFire ) { m_flAccuracy -= ( 0.4 - ( gpGlobals->time - m_flLastFire ) ) * 0.35; if( m_flAccuracy > 0.9 ) { m_flAccuracy = 0.9; } else if( m_flAccuracy < 0.55 ) { m_flAccuracy = 0.55; } } m_flLastFire = gpGlobals->time; if( m_iClip <= 0 ) { if( m_fFireOnEmpty ) { PlayEmptySound(); m_flNextPrimaryAttack = GetNextAttackDelay( 0.2 ); } // TODO: Implement me. // if( TheBots ) // { // TheBots->OnEvent( EVENT_WEAPON_FIRED_ON_EMPTY, m_pPlayer, NULL ); // } return; } m_iClip--; m_pPlayer->pev->effects |= EF_MUZZLEFLASH; SetPlayerShieldAnim(); m_pPlayer->SetAnimation(PLAYER_ATTACK1); UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle ); m_pPlayer->m_iWeaponVolume = BIG_EXPLOSION_VOLUME; m_pPlayer->m_iWeaponFlash = BRIGHT_GUN_FLASH; Vector vecSrc = m_pPlayer->GetGunPosition(); Vector vecDir = m_pPlayer->FireBullets3(vecSrc, gpGlobals->v_forward, flSpread, DEAGLE_DISTANCE, DEAGLE_PENETRATION, BULLET_PLAYER_50AE, DEAGLE_DAMAGE, DEAGLE_RANGE_MODIFER, m_pPlayer->pev, TRUE, m_pPlayer->random_seed ); int flags; #if defined( CLIENT_WEAPONS ) flags = FEV_NOTHOST; #else flags = 0; #endif PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usFireDeagle, 0, ( float* )&g_vecZero, ( float* )&g_vecZero, vecDir.x, vecDir.y, ( int )(m_pPlayer->pev->punchangle.x * 100 ), ( int )( m_pPlayer->pev->punchangle.y * 100 ), m_iClip != 0, FALSE ); flCycleTime -= 0.075; m_flNextPrimaryAttack = m_flNextSecondaryAttack = GetNextAttackDelay( flCycleTime ); if( !m_iClip && m_pPlayer->m_rgAmmo[ m_iPrimaryAmmoType ] <= 0 ) { m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 ); } m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.8; m_pPlayer->pev->punchangle.x -= 2; ResetPlayerShieldAnim(); }
void CSmokeGrenade::WeaponIdle(void) { if (!m_flReleaseThrow && m_flStartThrow) m_flReleaseThrow = gpGlobals->time; if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase()) return; if (m_flStartThrow) { m_pPlayer->Radio("%!MRAD_FIREINHOLE", "#Fire_in_the_hole"); Vector angThrow = m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle; if (angThrow.x < 0) angThrow.x = -10 + angThrow.x * ((90 - 10) / 90.0); else angThrow.x = -10 + angThrow.x * ((90 + 10) / 90.0); float flVel = (90 - angThrow.x) * 6; if (flVel > 750) flVel = 750; UTIL_MakeVectors(angThrow); Vector vecSrc = m_pPlayer->pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_forward * 16; Vector vecThrow = gpGlobals->v_forward * flVel + m_pPlayer->pev->velocity; float time = 1.5; CGrenade::ShootSmokeGrenade(m_pPlayer->pev, vecSrc, vecThrow, time, m_usCreateSmoke); SendWeaponAnim(SMOKEGRENADE_THROW, UseDecrement() != FALSE); SetPlayerShieldAnim(); m_pPlayer->SetAnimation(PLAYER_ATTACK1); m_flStartThrow = 0; m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.75; m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--; if (!m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) m_flTimeWeaponIdle = m_flNextSecondaryAttack = m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5; ResetPlayerShieldAnim(); return; } else if (m_flReleaseThrow > 0) { m_flStartThrow = 0; if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) { SendWeaponAnim(SMOKEGRENADE_DRAW, UseDecrement() != FALSE); m_flReleaseThrow = -1; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + RANDOM_FLOAT(10, 15); } else RetireWeapon(); return; } if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) { if (m_pPlayer->HasShield() != false) { m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 20.0; if (m_iWeaponState & WPNSTATE_SHIELD_DRAWN) SendWeaponAnim(SHIELDREN_IDLE, UseDecrement() != FALSE); return; } int iAnim; float flRand = RANDOM_FLOAT(0, 1); if (flRand <= 0.75) { iAnim = SMOKEGRENADE_IDLE; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + RANDOM_FLOAT(10, 15); } else { iAnim = SMOKEGRENADE_IDLE; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 75.0 / 30.0; } SendWeaponAnim(iAnim, UseDecrement() != FALSE); } }
/* <291213> ../cstrike/dlls/wpn_shared/wpn_p228.cpp:147 */ void CP228::P228Fire(float flSpread, float flCycleTime, BOOL fUseSemi) { Vector vecAiming, vecSrc, vecDir; int flag; flCycleTime -= 0.05f; if (++m_iShotsFired > 1) { return; } if (m_flLastFire != 0.0f) { m_flAccuracy -= (0.325f - (gpGlobals->time - m_flLastFire)) * 0.3f; if (m_flAccuracy > 0.9f) { m_flAccuracy = 0.9f; } else if (m_flAccuracy < 0.6f) { m_flAccuracy = 0.6f; } } m_flLastFire = gpGlobals->time; if (m_iClip <= 0) { if (m_fFireOnEmpty) { PlayEmptySound(); m_flNextPrimaryAttack = GetNextAttackDelay(0.2); } if (TheBots != NULL) { TheBots->OnEvent(EVENT_WEAPON_FIRED_ON_EMPTY, m_pPlayer); } return; } --m_iClip; m_pPlayer->pev->effects |= EF_MUZZLEFLASH; SetPlayerShieldAnim(); m_pPlayer->SetAnimation(PLAYER_ATTACK1); UTIL_MakeVectors(m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle); m_pPlayer->m_iWeaponVolume = BIG_EXPLOSION_VOLUME; m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH; vecSrc = m_pPlayer->GetGunPosition(); vecAiming = gpGlobals->v_forward; vecDir = m_pPlayer->FireBullets3(vecSrc, vecAiming, flSpread, 4096, 1, BULLET_PLAYER_357SIG, P228_DAMAGE, P228_RANGE_MODIFER, m_pPlayer->pev, true, m_pPlayer->random_seed); #ifdef CLIENT_WEAPONS flag = FEV_NOTHOST; #else flag = 0; #endif // CLIENT_WEAPONS PLAYBACK_EVENT_FULL(flag, m_pPlayer->edict(), m_usFireP228, 0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, (int)(m_pPlayer->pev->punchangle.x * 100), (int)(m_pPlayer->pev->punchangle.y * 100), m_iClip == 0, FALSE); m_flNextPrimaryAttack = m_flNextSecondaryAttack = GetNextAttackDelay(flCycleTime); if (!m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0) { m_pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, FALSE); } m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 2.0f; m_pPlayer->pev->punchangle.x -= 2; ResetPlayerShieldAnim(); }
/* <25a8bd> ../cstrike/dlls/wpn_shared/wpn_flashbang.cpp:198 */ void CFlashbang::__MAKE_VHOOK(WeaponIdle)(void) { if (m_flReleaseThrow == 0 && m_flStartThrow != 0.0f) m_flReleaseThrow = gpGlobals->time; if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase()) return; if (m_flStartThrow) { m_pPlayer->Radio("%!MRAD_FIREINHOLE", "#Fire_in_the_hole"); Vector angThrow = m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle; if (angThrow.x < 0) angThrow.x = -10 + angThrow.x * ((90 - 10) / 90.0); else angThrow.x = -10 + angThrow.x * ((90 + 10) / 90.0); float_precision flVel = (90.0 - angThrow.x) * 6.0; if (flVel > 750.0f) flVel = 750.0f; UTIL_MakeVectors(angThrow); Vector vecSrc = m_pPlayer->pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_forward * 16; Vector vecThrow = gpGlobals->v_forward * flVel + m_pPlayer->pev->velocity; CGrenade::ShootTimed(m_pPlayer->pev, vecSrc, vecThrow, 1.5); SendWeaponAnim(FLASHBANG_THROW, UseDecrement() != FALSE); SetPlayerShieldAnim(); // player "shoot" animation m_pPlayer->SetAnimation(PLAYER_ATTACK1); m_flStartThrow = 0; m_flNextPrimaryAttack = GetNextAttackDelay(0.5); m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.75; m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--; if (!m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) { // just threw last grenade // set attack times in the future, and weapon idle in the future so we can see the whole throw // animation, weapon idle will automatically retire the weapon for us. // ensure that the animation can finish playing m_flTimeWeaponIdle = m_flNextSecondaryAttack = m_flNextPrimaryAttack = GetNextAttackDelay(0.5); } ResetPlayerShieldAnim(); } else if (m_flReleaseThrow > 0) { // we've finished the throw, restart. m_flStartThrow = 0; RetireWeapon(); } else if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) { int iAnim; float flRand = RANDOM_FLOAT(0, 1); if (m_pPlayer->HasShield()) { m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 20.0; if (m_iWeaponState & WPNSTATE_SHIELD_DRAWN) { SendWeaponAnim(SHIELDREN_IDLE, UseDecrement() != FALSE); } } else { if (flRand <= 0.75) { iAnim = FLASHBANG_IDLE; // how long till we do this again. m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + RANDOM_FLOAT(10, 15); } else { #ifdef REGAMEDLL_FIXES iAnim = FLASHBANG_IDLE; #else // TODO: This is a bug? iAnim = *(int *)&flRand; #endif // REGAMEDLL_FIXES m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 75.0 / 30.0; } SendWeaponAnim(iAnim, UseDecrement() != FALSE); } } }
int CKnife::Swing(int fFirst) { BOOL fDidHit = FALSE; UTIL_MakeVectors(m_pPlayer->pev->v_angle); Vector vecSrc = m_pPlayer->GetGunPosition(); Vector vecEnd = vecSrc + gpGlobals->v_forward * 48; TraceResult tr; UTIL_TraceLine(vecSrc, vecEnd, dont_ignore_monsters, ENT(m_pPlayer->pev), &tr); if (tr.flFraction >= 1) { UTIL_TraceHull(vecSrc, vecEnd, dont_ignore_monsters, head_hull, ENT(m_pPlayer->pev), &tr); if (tr.flFraction < 1) { CBaseEntity *pHit = CBaseEntity::Instance(tr.pHit); if (!pHit || pHit->IsBSPModel()) FindHullIntersection(vecSrc, tr, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX, ENT(m_pPlayer->pev)); vecEnd = tr.vecEndPos; } } if (tr.flFraction >= 1) { if (fFirst) { if (m_pPlayer->HasShield() == false) { switch ((m_iSwing++) % 2) { case 0: SendWeaponAnim(KNIFE_MIDATTACK1HIT, UseDecrement() != FALSE); break; case 1: SendWeaponAnim(KNIFE_MIDATTACK2HIT, UseDecrement() != FALSE); break; } m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.35; m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5; } else { SendWeaponAnim(KNIFE_SHIELD_ATTACKHIT, UseDecrement() != FALSE); m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.0; m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.2; } m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 2; 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; if (m_pPlayer->HasShield() == false) { switch ((m_iSwing++) % 2) { case 0: SendWeaponAnim(KNIFE_MIDATTACK1HIT, UseDecrement() != FALSE); break; case 1: SendWeaponAnim(KNIFE_MIDATTACK2HIT, UseDecrement() != FALSE); break; } m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.4; m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5; } else { SendWeaponAnim(KNIFE_SHIELD_ATTACKHIT, UseDecrement() != FALSE); m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.0; m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.2; } m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 2; CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit); SetPlayerShieldAnim(); m_pPlayer->SetAnimation(PLAYER_ATTACK1); ClearMultiDamage(); if (m_flNextPrimaryAttack + 0.4 < UTIL_WeaponTimeBase()) pEntity->TraceAttack(m_pPlayer->pev, 20, gpGlobals->v_forward, &tr, DMG_NEVERGIB | DMG_BULLET); else pEntity->TraceAttack(m_pPlayer->pev, 15, gpGlobals->v_forward, &tr, DMG_NEVERGIB | DMG_BULLET); ApplyMultiDamage(m_pPlayer->pev, m_pPlayer->pev); float flVol = 1; int fHitWorld = TRUE; if (pEntity) { if (pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE) { switch (RANDOM_LONG(0, 3)) { case 0: EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/knife_hit1.wav", VOL_NORM, ATTN_NORM); break; case 1: EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/knife_hit2.wav", VOL_NORM, ATTN_NORM); break; case 2: EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/knife_hit3.wav", VOL_NORM, ATTN_NORM); break; case 3: EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/knife_hit4.wav", VOL_NORM, ATTN_NORM); break; } m_pPlayer->m_iWeaponVolume = KNIFE_BODYHIT_VOLUME; if (!pEntity->IsAlive()) return TRUE; flVol = 0.1; fHitWorld = FALSE; } } if (fHitWorld) { TEXTURETYPE_PlaySound(&tr, vecSrc, vecSrc + (vecEnd - vecSrc) * 2, BULLET_PLAYER_CROWBAR); EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/knife_hitwall1.wav", VOL_NORM, ATTN_NORM, 0, 98 + RANDOM_LONG(0, 3)); } m_trHit = tr; m_pPlayer->m_iWeaponVolume = flVol * KNIFE_WALLHIT_VOLUME; SetThink(&CKnife::Smack); pev->nextthink = UTIL_WeaponTimeBase() + 0.2; SetPlayerShieldAnim(); } return fDidHit; }