//----------------------------------------------------------------------------- // Purpose: // Input : // Output : //----------------------------------------------------------------------------- void CWeaponPistol::Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator ) { switch( pEvent->event ) { case EVENT_WEAPON_PISTOL_FIRE: { Vector vecShootOrigin, vecShootDir; vecShootOrigin = pOperator->Weapon_ShootPosition(); CAI_BaseNPC *npc = pOperator->MyNPCPointer(); ASSERT( npc != NULL ); vecShootDir = npc->GetActualShootTrajectory( vecShootOrigin ); CSoundEnt::InsertSound( SOUND_COMBAT|SOUND_CONTEXT_GUNFIRE, pOperator->GetAbsOrigin(), static_cast<int>(SOUNDENT_VOLUME_PISTOL), 0.2, pOperator, SOUNDENT_CHANNEL_WEAPON, pOperator->GetEnemy() ); WeaponSound( SINGLE_NPC ); pOperator->FireBullets( 1, vecShootOrigin, vecShootDir, VECTOR_CONE_PRECALCULATED, MAX_TRACE_LENGTH, m_iPrimaryAmmoType, 2 ); pOperator->DoMuzzleFlash(); m_iClip1 = m_iClip1 - 1; } break; default: BaseClass::Operator_HandleAnimEvent( pEvent, pOperator ); break; } }
//----------------------------------------------------------------------------- // Purpose: Override so only reload one shell at a time // Input : // Output : //----------------------------------------------------------------------------- bool CWeaponShotgun::Reload( void ) { // Check that StartReload was called first if (!m_bInReload) { Warning("ERROR: Shotgun Reload called incorrectly!\n"); } CBaseCombatCharacter *pOwner = GetOwner(); if ( pOwner == NULL ) return false; if (pOwner->GetAmmoCount(m_iPrimaryAmmoType) <= 0) return false; if (m_iClip1 >= GetMaxClip1()) return false; int j = MIN(1, pOwner->GetAmmoCount(m_iPrimaryAmmoType)); if (j <= 0) return false; FillClip(); // Play reload on different channel as otherwise steals channel away from fire sound WeaponSound(RELOAD); SendWeaponAnim( ACT_VM_RELOAD ); pOwner->m_flNextAttack = gpGlobals->curtime; m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration(); return true; }
//----------------------------------------------------------------------------- // Purpose: // Input : *pPlayer - //----------------------------------------------------------------------------- void CWeaponFrag::LobGrenade( CBasePlayer *pPlayer ) { #ifndef CLIENT_DLL Vector vecEye = pPlayer->EyePosition(); Vector vForward, vRight; pPlayer->EyeVectors( &vForward, &vRight, NULL ); Vector vecSrc = vecEye + vForward * 18.0f + vRight * 8.0f + Vector( 0, 0, -8 ); CheckThrowPosition( pPlayer, vecEye, vecSrc ); Vector vecThrow; pPlayer->GetVelocity( &vecThrow, NULL ); vecThrow += vForward * 350 + Vector( 0, 0, 50 ); CBaseGrenade *pGrenade = Fraggrenade_Create( vecSrc, vec3_angle, vecThrow, AngularImpulse(200,random->RandomInt(-600,600),0), pPlayer, GRENADE_TIMER, false ); if ( pGrenade ) { pGrenade->SetDamage( GetHL2MPWpnData().m_iPlayerDamage ); pGrenade->SetDamageRadius( GRENADE_DAMAGE_RADIUS ); } #endif WeaponSound( WPN_DOUBLE ); // player "shoot" animation pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_bRedraw = true; }
//----------------------------------------------------------------------------- // Purpose: // // //----------------------------------------------------------------------------- void CWeaponAnnabelle::DryFire( void ) { WeaponSound(EMPTY); SendWeaponAnim( ACT_VM_DRYFIRE ); m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration(); }
bool CWeaponSAA::Reload( void ) { bool fRet = DefaultReload( GetMaxClip1(), GetMaxClip2(), ACT_VM_RELOAD ); if ( fRet ) WeaponSound( RELOAD ); return fRet; }
//========================================================= // Disparo primario desde un NPC. //========================================================= void CWeaponAlyxGun::FireNPCPrimaryAttack( CBaseCombatCharacter *pOperator, bool bUseWeaponAngles ) { Vector vecShootOrigin, vecShootDir; CAI_BaseNPC *pNPC = pOperator->MyNPCPointer(); ASSERT( pNPC != NULL ); if ( bUseWeaponAngles ) { QAngle angShootDir; GetAttachment(LookupAttachment("muzzle"), vecShootOrigin, angShootDir); AngleVectors(angShootDir, &vecShootDir); } else { vecShootOrigin = pOperator->Weapon_ShootPosition(); vecShootDir = pNPC->GetActualShootTrajectory(vecShootOrigin); } WeaponSound(SINGLE_NPC); if ( hl2_episodic.GetBool() ) pOperator->FireBullets( 1, vecShootOrigin, vecShootDir, VECTOR_CONE_PRECALCULATED, MAX_TRACE_LENGTH, m_iPrimaryAmmoType, 1 ); else pOperator->FireBullets( 1, vecShootOrigin, vecShootDir, VECTOR_CONE_PRECALCULATED, MAX_TRACE_LENGTH, m_iPrimaryAmmoType, 2 ); pOperator->DoMuzzleFlash(); // Never fire Alyx's last bullet just in case there's an emergency // and she needs to be able to shoot without reloading. if( m_iClip1 > 1 ) m_iClip1 = m_iClip1 - 1; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponGauss::IncreaseCharge( void ) { if ( m_flNextChargeTime > gpGlobals->curtime ) return; CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); if ( pOwner == NULL ) return; //Check our charge time if ( ( gpGlobals->curtime - m_flChargeStartTime ) > MAX_GAUSS_CHARGE_TIME ) { //Notify the player they're at maximum charge if ( m_bChargeIndicated == false ) { WeaponSound( SPECIAL2 ); m_bChargeIndicated = true; } if ( ( gpGlobals->curtime - m_flChargeStartTime ) > DANGER_GAUSS_CHARGE_TIME ) { //Damage the player WeaponSound( SPECIAL2 ); // Add DMG_CRUSH because we don't want any physics force #ifndef CLIENT_DLL pOwner->TakeDamage( CTakeDamageInfo( this, this, 5, DMG_SHOCK | DMG_BULLET ) ); color32 gaussDamage = {255,128,0,128}; UTIL_ScreenFade( pOwner, gaussDamage, 0.2f, 0.2f, FFADE_IN ); #endif m_flNextChargeTime = gpGlobals->curtime + random->RandomFloat( 0.5f, 2.5f ); } return; } //Decrement power pOwner->RemoveAmmo( 1, m_iPrimaryAmmoType ); //Make sure we can draw power if ( pOwner->GetAmmoCount( m_iPrimaryAmmoType ) <= 0 ) { ChargedFire(); ChargedFireFirstBeam(); return; } m_flNextChargeTime = gpGlobals->curtime + GAUSS_CHARGE_TIME; return; }
//----------------------------------------------------------------------------- // Purpose: // // //----------------------------------------------------------------------------- void CWeaponDoubleShotgun::PrimaryAttack( void ) { // Only the player fires this way so we can cast CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if (!pPlayer) { return; } if (m_iClip1 >= 2) { // MUST call sound before removing a round from the clip of a CMachineGun WeaponSound(WPN_DOUBLE); pPlayer->DoMuzzleFlash(); SendWeaponAnim( ACT_VM_SECONDARYATTACK ); // Don't fire again until fire animation has completed m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration(); m_iClip1 -= 2; // player "shoot" animation pPlayer->SetAnimation( PLAYER_ATTACK1 ); Vector vecSrc = pPlayer->Weapon_ShootPosition( ); Vector vecAiming = pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); FireBulletsInfo_t info( 40, vecSrc, vecAiming, GetBulletSpread(), MAX_TRACE_LENGTH, m_iPrimaryAmmoType ); info.m_pAttacker = pPlayer; // Fire the bullets, and force the first shot to be perfectly accuracy pPlayer->FireBullets( info ); QAngle punch; punch.Init( SharedRandomFloat( "shotgunpax", -2, -1 ), SharedRandomFloat( "shotgunpay", -2, 2 ), 0 ); pPlayer->ViewPunch( punch ); if (!m_iClip1 && pPlayer->GetAmmoCount(m_iPrimaryAmmoType) <= 0) { // HEV suit - indicate out of ammo condition pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0); } //m_bNeedPump = true; } else { if (m_bInReload) { Reload(); } else { StartReload(); } } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponPistol::DryFire( void ) { WeaponSound( EMPTY ); SendWeaponAnim( ACT_VM_DRYFIRE ); m_flSoonestPrimaryAttack = gpGlobals->curtime + PISTOL_FASTEST_DRY_REFIRE_TIME; m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration(); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponGrapple::FireHook(void) { if (m_bMustReload) return; CBasePlayer *pOwner = ToBasePlayer(GetOwner()); if (pOwner == NULL) return; #ifndef CLIENT_DLL Vector vecAiming = pOwner->GetAutoaimVector(0); Vector vecSrc = pOwner->Weapon_ShootPosition(); QAngle angAiming; VectorAngles(vecAiming, angAiming); CGrappleHook *pHook = CGrappleHook::HookCreate(vecSrc, angAiming, this); if (pOwner->GetWaterLevel() == 3) { pHook->SetAbsVelocity(vecAiming * BOLT_WATER_VELOCITY); } else { pHook->SetAbsVelocity(vecAiming * BOLT_AIR_VELOCITY); } m_hHook = pHook; CreateRope(); #endif pOwner->ViewPunch(QAngle(-2, 0, 0)); WeaponSound(SINGLE); WeaponSound(SPECIAL2); SendWeaponAnim(ACT_VM_PRIMARYATTACK); m_flNextPrimaryAttack = m_flNextSecondaryAttack = gpGlobals->curtime + 0.75; DoLoadEffect(); SetChargerState(CHARGER_STATE_DISCHARGE); }
void CWeaponPortalgun::FirePortalDirection2( inputdata_t &inputdata ) { Vector vDirection; inputdata.value.Vector3D( vDirection ); FirePortal( true, &vDirection ); m_iLastFiredPortal = 2; CBaseCombatCharacter *pOwner = GetOwner(); if( pOwner && pOwner->IsPlayer() ) { WeaponSound( WPN_DOUBLE ); } else { WeaponSound( DOUBLE_NPC ); } }
void CWeaponSAA::C**k( void ) //DHL { if ( m_bCocked ) return; WeaponSound( SPECIAL1 ); //Cocking sound. //SendWeaponAnim( ACT_SAA_COCK ); //DHL m_flNextPrimaryAttack = gpGlobals->curtime + 0.25f; //Hack, should eventually be SequenceDuration() m_bCocked = true; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponImmolator::PrimaryAttack( void ) { WeaponSound( SINGLE ); if( !IsImmolating() ) { StartImmolating(); } }
//------------------------------------------------------------------------------ // Purpose : Starts the swing of the weapon and determines the animation //------------------------------------------------------------------------------ void CWeaponCrowbar::Swing( void ) { // Try a ray CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); if ( !pOwner ) return; Vector swingStart = pOwner->Weapon_ShootPosition( ); Vector forward; pOwner->EyeVectors( &forward, NULL, NULL ); Vector swingEnd = swingStart + forward * CROWBAR_RANGE; UTIL_TraceLine( swingStart, swingEnd, MASK_SHOT_HULL, pOwner, COLLISION_GROUP_NONE, &m_traceHit ); m_nHitActivity = ACT_VM_HITCENTER; if ( m_traceHit.fraction == 1.0 ) { float bludgeonHullRadius = 1.732f * BLUDGEON_HULL_DIM; // hull is +/- 16, so use cuberoot of 2 to determine how big the hull is from center to the corner point // Back off by hull "radius" swingEnd -= forward * bludgeonHullRadius; UTIL_TraceHull( swingStart, swingEnd, g_bludgeonMins, g_bludgeonMaxs, MASK_SHOT_HULL, pOwner, COLLISION_GROUP_NONE, &m_traceHit ); if ( m_traceHit.fraction < 1.0 ) { m_nHitActivity = ChooseIntersectionPointAndActivity( m_traceHit, g_bludgeonMins, g_bludgeonMaxs, pOwner ); } } // ------------------------- // Miss // ------------------------- if ( m_traceHit.fraction == 1.0f ) { m_nHitActivity = ACT_VM_MISSCENTER; //Play swing sound WeaponSound( SINGLE ); //Setup our next attack times m_flNextPrimaryAttack = gpGlobals->curtime + CROWBAR_REFIRE_MISS; } else { Hit(); //Setup our next attack times m_flNextPrimaryAttack = gpGlobals->curtime + CROWBAR_REFIRE_HIT; } //Send the anim SendWeaponAnim( m_nHitActivity ); pOwner->SetAnimation( PLAYER_ATTACK1 ); }
void CWeaponMP5::SecondaryAttack( void ) { // Only the player fires this way so we can cast CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if (!pPlayer) { return; } if ( pPlayer->GetAmmoCount( m_iSecondaryAmmoType ) <= 0 ) { DryFire( ); return; } WeaponSound(DOUBLE); pPlayer->m_fEffects |= EF_MUZZLEFLASH; Vector vecSrc = pPlayer->Weapon_ShootPosition(); Vector vecThrow = pPlayer->GetAutoaimVector( 0 ) * 800; QAngle angGrenAngle; VectorAngles( vecThrow, angGrenAngle ); CGrenadeMP5 * m_pMyGrenade = (CGrenadeMP5*)Create( "grenade_mp5", vecSrc, angGrenAngle, GetOwner() ); m_pMyGrenade->SetAbsVelocity( vecThrow ); m_pMyGrenade->SetLocalAngularVelocity( QAngle( random->RandomFloat( -100, -500 ), 0, 0 ) ); m_pMyGrenade->SetMoveType( MOVETYPE_FLYGRAVITY ); m_pMyGrenade->SetOwner( GetOwner() ); m_pMyGrenade->SetDamage( sk_plr_dmg_mp5_grenade.GetFloat() ); SendWeaponAnim( ACT_VM_SECONDARYATTACK ); pPlayer->SetAnimation( PLAYER_ATTACK1 ); pPlayer->ViewPunch( QAngle( -10, 0, 0 ) ); // Register a muzzleflash for the AI. pPlayer->SetMuzzleFlashTime( gpGlobals->curtime + 0.5 ); CSoundEnt::InsertSound( SOUND_COMBAT, GetAbsOrigin(), 400, 0.2 ); // Decrease ammo pPlayer->RemoveAmmo( 1, m_iSecondaryAmmoType ); if ( pPlayer->GetAmmoCount( m_iSecondaryAmmoType ) <= 0 ) { // HEV suit - indicate out of ammo condition pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0); } m_flNextPrimaryAttack = gpGlobals->curtime + 1.0; m_flNextSecondaryAttack = gpGlobals->curtime + 1.0; SetWeaponIdleTime( gpGlobals->curtime + 5.0 ); }
//----------------------------------------------------------------------------- // Purpose: Various DHL Modifications //----------------------------------------------------------------------------- void CWeaponRemington::PrimaryAttack( void ) { // Only the player fires this way so we can cast CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if (!pPlayer) { return; } if ( m_bNeedPump == 1 ) { WeaponSound( SPECIAL1 ); SendWeaponAnim( ACT_SHOTGUN_PUMP ); m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration(); //DHL, add a delay the length of the pump animation m_bNeedPump = false; return; } // MUST call sound before removing a round from the clip of a CMachineGun WeaponSound(SINGLE); pPlayer->DoMuzzleFlash(); SendWeaponAnim( ACT_VM_PRIMARYATTACK ); // Don't fire again until fire animation has completed m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration(); m_iClip1 -= 1; // player "shoot" animation pPlayer->SetAnimation( PLAYER_ATTACK1 ); Vector vecSrc = pPlayer->Weapon_ShootPosition( ); Vector vecAiming = pPlayer->GetAutoaimVector( AUTOAIM_SCALE_DEFAULT ); FireBulletsInfo_t info( 7, vecSrc, vecAiming, CDHLBaseWeapon::GetBulletSpread(), MAX_TRACE_LENGTH, m_iPrimaryAmmoType ); info.m_pAttacker = pPlayer; // Fire the bullets, and force the first shot to be perfectly accuracy pPlayer->FireBullets( info ); AddDHLViewKick( BaseClass::GetRecoilX(), BaseClass::GetRecoilY() ); m_bNeedPump = true; }
void CWeaponM4A1::SecondaryAttack() { if ( m_bSilencerOn ) { m_bSilencerOn = false; SendWeaponAnim( ACT_VM_DETACH_SILENCER ); WeaponSound( SPECIAL2 ); } else { m_bSilencerOn = true; SendWeaponAnim( ACT_VM_ATTACH_SILENCER ); WeaponSound( SPECIAL3 ); } m_flNextSecondaryAttack = gpGlobals->curtime + 2; m_flNextPrimaryAttack = gpGlobals->curtime + 2; m_flTimeWeaponIdle = gpGlobals->curtime + 2.0; }
//------------------------------------------------------------------------------ // Purpose: Implement impact function //------------------------------------------------------------------------------ void CBaseHL2MPBludgeonWeapon::Hit( trace_t &traceHit, Activity nHitActivity ) { CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); //Do view kick // AddViewKick(); CBaseEntity *pHitEntity = traceHit.m_pEnt; //Apply damage to a hit target if ( pHitEntity != NULL ) { Vector hitDirection; pPlayer->EyeVectors( &hitDirection, NULL, NULL ); VectorNormalize( hitDirection ); #ifndef CLIENT_DLL CTakeDamageInfo info( GetOwner(), GetOwner(), GetDamageForActivity( nHitActivity ), DMG_CLUB ); if( pPlayer && pHitEntity->IsNPC() ) { // If bonking an NPC, adjust damage. info.AdjustPlayerDamageInflictedForSkillLevel(); } CalculateMeleeDamageForce( &info, hitDirection, traceHit.endpos ); pHitEntity->DispatchTraceAttack( info, hitDirection, &traceHit ); ApplyMultiDamage(); // Now hit all triggers along the ray that... TraceAttackToTriggers( info, traceHit.startpos, traceHit.endpos, hitDirection ); #endif //DHL - Skillet if ( pHitEntity->entindex() == 0 ) WeaponSound( MELEE_HIT_WORLD ); else WeaponSound( MELEE_HIT ); } // Apply an impact effect ImpactEffect( traceHit ); }
//----------------------------------------------------------------------------- //----------------------------------------------------------------------------- bool CWeaponPistol::Reload( void ) { bool fRet = DefaultReload( GetMaxClip1(), GetMaxClip2(), ACT_VM_RELOAD ); if ( fRet ) { WeaponSound( RELOAD ); m_flAccuracyPenalty = 0.0f; } return fRet; }
//----------------------------------------------------------------------------- // Animation event handlers //----------------------------------------------------------------------------- void CWeaponCrowbar::HandleAnimEventMeleeHit( animevent_t *pEvent, CBaseCombatCharacter *pOperator ) { // Trace up or down based on where the enemy is... // But only if we're basically facing that direction Vector vecDirection; AngleVectors( GetAbsAngles(), &vecDirection ); CBaseEntity *pEnemy = pOperator->MyNPCPointer() ? pOperator->MyNPCPointer()->GetEnemy() : NULL; if ( pEnemy ) { Vector vecDelta; VectorSubtract( pEnemy->WorldSpaceCenter(), pOperator->Weapon_ShootPosition(), vecDelta ); VectorNormalize( vecDelta ); Vector2D vecDelta2D = vecDelta.AsVector2D(); Vector2DNormalize( vecDelta2D ); if ( DotProduct2D( vecDelta2D, vecDirection.AsVector2D() ) > 0.8f ) { vecDirection = vecDelta; } } Vector vecEnd; VectorMA( pOperator->Weapon_ShootPosition(), 50, vecDirection, vecEnd ); CBaseEntity *pHurt = pOperator->CheckTraceHullAttack( pOperator->Weapon_ShootPosition(), vecEnd, Vector(-16,-16,-16), Vector(36,36,36), sk_npc_dmg_crowbar.GetInt(), DMG_CLUB, 0.75 ); // did I hit someone? if ( pHurt ) { // play sound WeaponSound( MELEE_HIT ); // Fake a trace impact, so the effects work out like a player's crowbaw trace_t traceHit; UTIL_TraceLine( pOperator->Weapon_ShootPosition(), pHurt->GetAbsOrigin(), MASK_SHOT_HULL, pOperator, COLLISION_GROUP_NONE, &traceHit ); ImpactEffect( traceHit ); } else { WeaponSound( MELEE_MISS ); } }
void CWeaponMosinNagant::C**k( void ) { WeaponSound( SPECIAL1 ); SendWeaponAnim( ACT_SHOTGUN_PUMP ); m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration(); m_bCocked = true; #ifndef CLIENT_DLL SignalShellEject(); #endif }
void CWeaponFlowerLauncher::FireBolt( void ) { if ( m_iClip1 <= 0 ) { if ( !m_bFireOnEmpty ) Reload(); else { WeaponSound( EMPTY ); m_flNextPrimaryAttack = gpGlobals->curtime + 0.15f; } return; } CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); if ( pOwner == NULL ) return; #ifndef CLIENT_DLL Vector vecSrc = pOwner->Weapon_ShootPosition(); Vector vecAiming = pOwner->GetAutoaimVector( 0 ); QAngle angAiming; VectorAngles(vecAiming, angAiming); angAiming.x += ((rand() % 100) / 100.0) * (rand() % 2 == 1 ? -1 : 1); angAiming.y += ((rand() % 100) / 100.0) * (rand() % 2 == 1 ? -1 : 1); AngleVectors(angAiming, &vecAiming); CFlowerBolt *pBolt = CFlowerBolt::BoltCreate( vecSrc, angAiming, GetHL2MPWpnData().m_iPlayerDamage, pOwner ); pBolt->SetAbsVelocity( vecAiming * BOLT_VELOCITY ); #endif m_iClip1--; WeaponSound( SINGLE ); WeaponSound( SPECIAL2 ); SendWeaponAnim( ACT_VM_PRIMARYATTACK ); m_flNextPrimaryAttack = m_flNextSecondaryAttack = gpGlobals->curtime + 0.75f; }
void CWeaponMP5::PrimaryAttack( void ) { // Only the player fires this way so we can cast CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if ( !pPlayer ) { return; } if ( m_iClip1 <= 0 ) { DryFire(); return; } WeaponSound( SINGLE ); pPlayer->m_fEffects |= EF_MUZZLEFLASH; m_iClip1--; SendWeaponAnim( ACT_VM_PRIMARYATTACK ); pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_flNextPrimaryAttack = gpGlobals->curtime + 0.1; Vector vecSrc = pPlayer->Weapon_ShootPosition(); Vector vecAiming = pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); if ( !g_pGameRules->IsMultiplayer() ) { // optimized multiplayer. Widened to make it easier to hit a moving player pPlayer->FireBullets( 1, vecSrc, vecAiming, VECTOR_CONE_6DEGREES, MAX_TRACE_LENGTH, m_iPrimaryAmmoType, 2 ); } else { // single player spread pPlayer->FireBullets( 1, vecSrc, vecAiming, VECTOR_CONE_3DEGREES, MAX_TRACE_LENGTH, m_iPrimaryAmmoType, 2 ); } pPlayer->ViewPunch( QAngle( random->RandomFloat( -2, 2 ), 0, 0 ) ); pPlayer->SetMuzzleFlashTime( gpGlobals->curtime + 0.5 ); CSoundEnt::InsertSound( SOUND_COMBAT, GetAbsOrigin(), 400, 0.2 ); if ( !m_iClip1 && pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0 ) { // HEV suit - indicate out of ammo condition pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0); } SetWeaponIdleTime( gpGlobals->curtime + random->RandomFloat( 10, 15 ) ); }
//----------------------------------------------------------------------------- //----------------------------------------------------------------------------- bool CWeaponGlock18::Reload( void ) { bool fRet = DefaultReload( GetMaxClip1(), GetMaxClip2(), ACT_VM_RELOAD ); if ( fRet ) { WeaponSound( RELOAD ); ToHL2MPPlayer(GetOwner())->DoAnimationEvent( PLAYERANIMEVENT_RELOAD ); m_flAccuracyPenalty = 0.0f; } return fRet; }
//----------------------------------------------------------------------------- // Purpose: The gun is being reloaded //----------------------------------------------------------------------------- bool CWeaponMomentumGun::Reload(void) { bool fRet = DefaultReload(GetMaxClip1(), GetMaxClip2(), ACT_VM_RELOAD); if (fRet) { WeaponSound(RELOAD); //ToBaseCombatCharacter(GetOwner())->DoAnimationEvent(PLAYERANIMEVENT_RELOAD); //reset the burst counter to the default m_iBurst = BURST; } return fRet; }
//----------------------------------------------------------------------------- // Purpose: The gun is being reloaded //----------------------------------------------------------------------------- bool CWeaponAK47::Reload( void ) { bool fRet = DefaultReload( GetMaxClip1(), GetMaxClip2(), ACT_VM_RELOAD ); if ( fRet ) { WeaponSound( RELOAD ); ToHL2MPPlayer(GetOwner())->DoAnimationEvent( PLAYERANIMEVENT_RELOAD ); //reset the burst counter to the default m_iBurst=BURST; } return fRet; }
//----------------------------------------------------------------------------- // Purpose: Player holding this weapon has aborted the build of an object //----------------------------------------------------------------------------- void CWeaponBuilder::StoppedBuilding( int iObjectType ) { CBaseTFPlayer *pPlayer = ToBaseTFPlayer( GetOwner() ); if ( pPlayer ) { // Force a recalculation of the state for this object SetCurrentObject( m_iCurrentObject ); SetCurrentState( BS_IDLE ); WeaponSound( SPECIAL2 ); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponSniperRifle::PrimaryAttack( void ) { // Only the player fires this way so we can cast safely. CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if (!pPlayer) { return; } if ( gpGlobals->curtime >= m_flNextPrimaryAttack ) { // If my clip is empty (and I use clips) start reload if ( !m_iClip1 ) { Reload(); return; } // MUST call sound before removing a round from the clip of a CMachineGun dvs: does this apply to the sniper rifle? I don't know. WeaponSound(SINGLE); pPlayer->DoMuzzleFlash(); SendWeaponAnim( ACT_VM_PRIMARYATTACK ); // player "shoot" animation pPlayer->SetAnimation( PLAYER_ATTACK1 ); // Don't fire again until fire animation has completed m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration(); m_iClip1 = m_iClip1 - 1; Vector vecSrc = pPlayer->Weapon_ShootPosition(); Vector vecAiming = pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); // Fire the bullets pPlayer->FireBullets( SNIPER_BULLET_COUNT_PLAYER, vecSrc, vecAiming, GetBulletSpread(), MAX_TRACE_LENGTH, m_iPrimaryAmmoType, SNIPER_TRACER_FREQUENCY_PLAYER ); CSoundEnt::InsertSound( SOUND_COMBAT, GetAbsOrigin(), 600, 0.2 ); QAngle vecPunch(random->RandomFloat( -SNIPER_KICKBACK, SNIPER_KICKBACK ), 0, 0); pPlayer->ViewPunch(vecPunch); // Indicate out of ammo condition if we run out of ammo. if (!m_iClip1 && pPlayer->GetAmmoCount(m_iPrimaryAmmoType) <= 0) { pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0); } } // Register a muzzleflash for the AI. pPlayer->SetMuzzleFlashTime( gpGlobals->curtime + 0.5 ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponGauss::PrimaryAttack( void ) { CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); if ( pOwner == NULL ) return; WeaponSound( SINGLE ); WeaponSound( SPECIAL2 ); SendWeaponAnim( ACT_VM_PRIMARYATTACK ); m_flNextPrimaryAttack = gpGlobals->curtime + GetFireRate(); pOwner->RemoveAmmo( 1, m_iPrimaryAmmoType ); Fire(); m_flCoilMaxVelocity = 0.0f; m_flCoilVelocity = 1000.0f; return; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponCGuard::DelayedFire( void ) { if ( m_flChargeTime >= gpGlobals->curtime ) return; if ( m_bFired ) return; m_bFired = true; // Only the player fires this way so we can cast CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if ( pPlayer == NULL ) return; // Abort here to handle burst and auto fire modes if ( (GetMaxClip1() != -1 && m_iClip1 == 0) || (GetMaxClip1() == -1 && !pPlayer->GetAmmoCount(m_iPrimaryAmmoType) ) ) return; // MUST call sound before removing a round from the clip of a CMachineGun WeaponSound(SINGLE); pPlayer->DoMuzzleFlash(); // To make the firing framerate independent, we may have to fire more than one bullet here on low-framerate systems, // especially if the weapon we're firing has a really fast rate of fire. if ( GetSequence() != SelectWeightedSequence( ACT_VM_PRIMARYATTACK ) ) { m_flNextPrimaryAttack = gpGlobals->curtime; } // Make sure we don't fire more than the amount in the clip, if this weapon uses clips if ( UsesClipsForAmmo1() ) { m_iClip1 = m_iClip1 - 1; } // Fire the bullets Vector vecSrc = pPlayer->Weapon_ShootPosition( ); Vector vecAiming = pPlayer->GetRadialAutoVector( NEW_AUTOAIM_RADIUS, NEW_AUTOAIM_DIST ); //Factor in the view kick AddViewKick(); Vector impactPoint = vecSrc + ( vecAiming * MAX_TRACE_LENGTH ); trace_t tr; UTIL_TraceHull( vecSrc, impactPoint, Vector( -2, -2, -2 ), Vector( 2, 2, 2 ), MASK_SHOT, pPlayer, COLLISION_GROUP_NONE, &tr ); CreateConcussiveBlast( tr.endpos, tr.plane.normal, this, 1.0 ); }