//----------------------------------------------------------------------------- // 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( GetSDKWpnData().m_iDamage ); pGrenade->SetDamageRadius( GRENADE_DAMAGE_RADIUS ); } #endif WeaponSound( WPN_DOUBLE ); // player "shoot" animation pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_bRedraw = true; }
float CWeaponDAMelee::GetMeleeDamage( bool bIsSecondary ) const { CDAPlayer *pPlayer = ToDAPlayer( GetOwner() ); float flDamage = GetSDKWpnData().m_iDamage; if (bIsSecondary) flDamage = GetSDKWpnData().m_iSecondaryDamage; flDamage = pPlayer->m_Shared.ModifySkillValue(flDamage, 0.2f, SKILL_BOUNCER); if (pPlayer->m_Shared.IsDiving()) flDamage *= 1.5f; else if (!pPlayer->GetGroundEntity()) flDamage *= 1.2f; return flDamage; }
void CWeaponMP5::PrimaryAttack( void ) { const CSDKWeaponInfo &pWeaponInfo = GetSDKWpnData(); CSDKPlayer *pPlayer = GetPlayerOwner(); float flCycleTime = pWeaponInfo.m_flCycleTime; bool bPrimaryMode = true; float flSpread = 0.01f; // more spread when jumping if ( !FBitSet( pPlayer->GetFlags(), FL_ONGROUND ) ) flSpread = 0.05f; pPlayer->m_iShotsFired++; // Out of ammo? if ( m_iClip1 <= 0 ) { if (m_bFireOnEmpty) { PlayEmptySound(); m_flNextPrimaryAttack = gpGlobals->curtime + 0.2; } } SendWeaponAnim( ACT_VM_PRIMARYATTACK ); m_iClip1--; // player "shoot" animation pPlayer->SetAnimation( PLAYER_ATTACK1 ); FX_FireBullets( pPlayer->entindex(), pPlayer->Weapon_ShootPosition(), pPlayer->EyeAngles() + pPlayer->GetPunchAngle(), GetWeaponID(), bPrimaryMode?Primary_Mode:Secondary_Mode, CBaseEntity::GetPredictionRandomSeed() & 255, flSpread ); pPlayer->DoMuzzleFlash(); m_flNextPrimaryAttack = m_flNextSecondaryAttack = gpGlobals->curtime + flCycleTime; if (!m_iClip1 && pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0) { // HEV suit - indicate out of ammo condition pPlayer->SetSuitUpdate("!HEV_AMO0", false, 0); } // start idle animation in 5 seconds SetWeaponIdleTime( gpGlobals->curtime + 5.0 ); }
//----------------------------------------------------------------------------- // Purpose: // Input : *pPlayer - //----------------------------------------------------------------------------- void CWeaponFrag::RollGrenade( CBasePlayer *pPlayer ) { #ifndef CLIENT_DLL // BUGBUG: Hardcoded grenade width of 4 - better not change the model :) Vector vecSrc; pPlayer->CollisionProp()->NormalizedToWorldSpace( Vector( 0.5f, 0.5f, 0.0f ), &vecSrc ); vecSrc.z += GRENADE_RADIUS; Vector vecFacing = pPlayer->BodyDirection2D( ); // no up/down direction vecFacing.z = 0; VectorNormalize( vecFacing ); trace_t tr; UTIL_TraceLine( vecSrc, vecSrc - Vector(0,0,16), MASK_PLAYERSOLID, pPlayer, COLLISION_GROUP_NONE, &tr ); if ( tr.fraction != 1.0 ) { // compute forward vec parallel to floor plane and roll grenade along that Vector tangent; CrossProduct( vecFacing, tr.plane.normal, tangent ); CrossProduct( tr.plane.normal, tangent, vecFacing ); } vecSrc += (vecFacing * 18.0); CheckThrowPosition( pPlayer, pPlayer->WorldSpaceCenter(), vecSrc ); Vector vecThrow; pPlayer->GetVelocity( &vecThrow, NULL ); vecThrow += vecFacing * 700; // put it on its side QAngle orientation(0,pPlayer->GetLocalAngles().y,-90); // roll it AngularImpulse rotSpeed(0,0,720); CBaseGrenade *pGrenade = Fraggrenade_Create( vecSrc, orientation, vecThrow, rotSpeed, pPlayer, GRENADE_TIMER, false ); if ( pGrenade ) { pGrenade->SetDamage( GetSDKWpnData().m_iDamage ); pGrenade->SetDamageRadius( GRENADE_DAMAGE_RADIUS ); } #endif WeaponSound( SPECIAL1 ); // player "shoot" animation pPlayer->SetAnimation( PLAYER_ATTACK1 ); m_bRedraw = true; }
//----------------------------------------------------------------------------- // Purpose: // Input : *pPlayer - //----------------------------------------------------------------------------- void CWeaponFrag::ThrowGrenade( 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; CheckThrowPosition( pPlayer, vecEye, vecSrc ); vForward[0] += 0.01f; vForward[2] += 0.1f; Vector vecThrow; pPlayer->GetVelocity( &vecThrow, NULL ); vecThrow += vForward * 600; CBaseGrenade *pGrenade = Fraggrenade_Create( vecSrc, vec3_angle, vecThrow, AngularImpulse(600,random->RandomInt(-1200,1200),0), pPlayer, GRENADE_TIMER, false, GetSDKWpnData().m_flDamageForceScale ); if ( pGrenade ) { if ( pPlayer && pPlayer->m_lifeState != LIFE_ALIVE ) { pPlayer->GetVelocity( &vecThrow, NULL ); IPhysicsObject *pPhysicsObject = pGrenade->VPhysicsGetObject(); if ( pPhysicsObject ) { pPhysicsObject->SetVelocity( &vecThrow, NULL ); } } pGrenade->SetDamage( GetSDKWpnData().m_iDamage ); pGrenade->SetDamageRadius( GRENADE_DAMAGE_RADIUS ); } #endif m_bRedraw = true; WeaponSound( SINGLE ); // player "shoot" animation pPlayer->SetAnimation( PLAYER_ATTACK1 ); }
void CWeaponSMG1::PrimaryAttack( void ) { // Only the player fires this way so we can cast CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if (!pPlayer) return; // Abort here to handle burst and auto fire modes if ( (UsesClipsForAmmo1() && m_iClip1 == 0) || ( !UsesClipsForAmmo1() && !pPlayer->GetAmmoCount(m_iPrimaryAmmoType) ) ) return; m_nShotsFired++; 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. int iBulletsToFire = 0; float fireRate = GetFireRate(); while ( m_flNextPrimaryAttack <= gpGlobals->curtime ) { // MUST call sound before removing a round from the clip of a CHLMachineGun WeaponSound(SINGLE, m_flNextPrimaryAttack); m_flNextPrimaryAttack = gpGlobals->curtime + fireRate; iBulletsToFire++; } // Make sure we don't fire more than the amount in the clip, if this weapon uses clips if ( UsesClipsForAmmo1() ) { if ( iBulletsToFire > m_iClip1 ) iBulletsToFire = m_iClip1; m_iClip1 -= iBulletsToFire; } CSDKPlayer *pSDKPlayer = ToSDKPlayer( pPlayer ); // Fire the bullets FireBulletsInfo_t info; info.m_iShots = iBulletsToFire; info.m_vecSrc = pSDKPlayer->Weapon_ShootPosition( ); info.m_vecDirShooting = pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); info.m_vecSpread = GetBulletSpread(); info.m_flDistance = MAX_TRACE_LENGTH; info.m_iAmmoType = m_iPrimaryAmmoType; info.m_iTracerFreq = 2; info.m_iDamage = GetSDKWpnData().m_iDamage; pPlayer->FireBullets( info ); //Factor in the view kick AddViewKick(); if (!m_iClip1 && pPlayer->GetAmmoCount(m_iPrimaryAmmoType) <= 0) { // HEV suit - indicate out of ammo condition pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0); } SendWeaponAnim( GetPrimaryAttackActivity() ); pPlayer->SetAnimation( PLAYER_ATTACK1 ); pSDKPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeapon357::PrimaryAttack( void ) { // Only the player fires this way so we can cast CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if ( !pPlayer ) { return; } if ( m_iClip1 <= 0 ) { if ( !m_bFireOnEmpty ) { Reload(); } else { WeaponSound( EMPTY ); m_flNextPrimaryAttack = 0.15; } return; } WeaponSound( SINGLE ); pPlayer->DoMuzzleFlash(); SendWeaponAnim( ACT_VM_PRIMARYATTACK ); pPlayer->SetAnimation( PLAYER_ATTACK1 ); ToSDKPlayer(pPlayer)->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); m_flNextPrimaryAttack = gpGlobals->curtime + 0.75; m_flNextSecondaryAttack = gpGlobals->curtime + 0.75; m_iClip1--; Vector vecSrc = pPlayer->Weapon_ShootPosition(); Vector vecAiming = pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); FireBulletsInfo_t info( 1, vecSrc, vecAiming, vec3_origin, MAX_TRACE_LENGTH, m_iPrimaryAmmoType ); info.m_pAttacker = pPlayer; info.m_iDamage = GetSDKWpnData().m_iDamage; // Fire the bullets, and force the first shot to be perfectly accuracy pPlayer->FireBullets( info ); // Disorient the player QAngle angles = pPlayer->GetLocalAngles(); angles.x += random->RandomInt( -1, 1 ); angles.y += random->RandomInt( -1, 1 ); angles.z = 0; #ifndef CLIENT_DLL pPlayer->SnapEyeAngles( angles ); #endif pPlayer->ViewPunch( QAngle( -8, random->RandomFloat( -2, 2 ), 0 ) ); if ( !m_iClip1 && pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0 ) { // HEV suit - indicate out of ammo condition pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 ); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponHL2Pistol::PrimaryAttack( void ) { if ( ( gpGlobals->curtime - m_flLastAttackTime ) > 0.5f ) { m_nNumShotsFired = 0; } else { m_nNumShotsFired++; } m_flLastAttackTime = gpGlobals->curtime; m_flSoonestPrimaryAttack = gpGlobals->curtime + PISTOL_FASTEST_REFIRE_TIME; CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); if( pOwner ) { // Each time the player fires the pistol, reset the view punch. This prevents // the aim from 'drifting off' when the player fires very quickly. This may // not be the ideal way to achieve this, but it's cheap and it works, which is // great for a feature we're evaluating. (sjb) pOwner->ViewPunchReset(); } // Only the player fires this way so we can cast CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if (!pPlayer) return; // Abort here to handle burst and auto fire modes if ( (UsesClipsForAmmo1() && m_iClip1 == 0) || ( !UsesClipsForAmmo1() && !pPlayer->GetAmmoCount(m_iPrimaryAmmoType) ) ) return; m_nShotsFired++; 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. int iBulletsToFire = 0; float fireRate = GetFireRate(); while ( m_flNextPrimaryAttack <= gpGlobals->curtime ) { // MUST call sound before removing a round from the clip of a CHLMachineGun WeaponSound(SINGLE, m_flNextPrimaryAttack); m_flNextPrimaryAttack = m_flNextPrimaryAttack + fireRate; iBulletsToFire++; } // Make sure we don't fire more than the amount in the clip, if this weapon uses clips if ( UsesClipsForAmmo1() ) { if ( iBulletsToFire > m_iClip1 ) iBulletsToFire = m_iClip1; m_iClip1 -= iBulletsToFire; } CSDKPlayer *pSDKPlayer = ToSDKPlayer( pPlayer ); // Fire the bullets FireBulletsInfo_t info; info.m_iShots = iBulletsToFire; info.m_vecSrc = pSDKPlayer->Weapon_ShootPosition( ); info.m_vecDirShooting = pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); info.m_vecSpread = GetBulletSpread(); info.m_flDistance = MAX_TRACE_LENGTH; info.m_iAmmoType = m_iPrimaryAmmoType; info.m_iTracerFreq = 2; info.m_iDamage = GetSDKWpnData().m_iDamage; pPlayer->FireBullets( info ); //Factor in the view kick AddViewKick(); if (!m_iClip1 && pPlayer->GetAmmoCount(m_iPrimaryAmmoType) <= 0) { // HEV suit - indicate out of ammo condition pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0); } SendWeaponAnim( GetPrimaryAttackActivity() ); pPlayer->SetAnimation( PLAYER_ATTACK1 ); pSDKPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); // Abort here to handle burst and auto fire modes if ( (UsesClipsForAmmo1() && m_iClip1 == 0) || ( !UsesClipsForAmmo1() && !pOwner->GetAmmoCount(m_iPrimaryAmmoType) ) ) return; // Add an accuracy penalty which can move past our maximum penalty time if we're really spastic m_flAccuracyPenalty += PISTOL_ACCURACY_SHOT_PENALTY_TIME; }
bool CWeaponShotgun::Reload() { CSDKPlayer *pPlayer = GetPlayerOwner(); if (pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0 || m_iClip1 == GetMaxClip1()) return true; // don't reload until recoil is done if (m_flNextPrimaryAttack > GetCurrentTime()) return true; CBaseViewModel *vm = pPlayer->GetViewModel( m_nViewModelIndex ); float flSpeedMultiplier = GetSDKWpnData().m_flReloadTimeMultiplier; // check to see if we're ready to reload if (m_iInSpecialReload == 0) { pPlayer->SetAnimation( PLAYER_RELOAD ); float flStartTime = 0.5f * flSpeedMultiplier; pPlayer->DoAnimationEvent( PLAYERANIMEVENT_RELOAD ); SendWeaponAnim( ACT_SHOTGUN_RELOAD_START ); m_iInSpecialReload = 1; /* this is the only part of the reload sequence that can't be interrupted, seems unnecessary pPlayer->m_flNextAttack = GetCurrentTime() + flStartTime; m_flNextPrimaryAttack = GetCurrentTime() + flStartTime; m_flNextSecondaryAttack = GetCurrentTime() + flStartTime; */ SetWeaponIdleTime( GetCurrentTime() + flStartTime ); if (vm) vm->SetPlaybackRate( 1/flSpeedMultiplier ); pPlayer->Instructor_LessonLearned("reload"); return true; } else if (m_iInSpecialReload == 1) { if (m_flTimeWeaponIdle > GetCurrentTime()) return true; // was waiting for gun to move to side m_iInSpecialReload = 2; float flReloadTime = 0.45 * flSpeedMultiplier; SendWeaponAnim( ACT_VM_RELOAD ); SetWeaponIdleTime( GetCurrentTime() + flReloadTime ); pPlayer->DoAnimationEvent( PLAYERANIMEVENT_RELOAD_LOOP ); if (vm) vm->SetPlaybackRate( 1/flSpeedMultiplier ); } else if ( m_iInSpecialReload == 2 ) // Sanity, make sure it's actually in the right state. { // Add them to the clip m_iClip1 += 1; #ifdef GAME_DLL // Send a message to any clients that have this entity to play the reload. CPASFilter filter( pPlayer->GetAbsOrigin() ); filter.RemoveRecipient( pPlayer ); UserMessageBegin( filter, "ReloadEffect" ); WRITE_SHORT( pPlayer->entindex() ); MessageEnd(); #endif if ( pPlayer ) { bool bConsume = true; if (pPlayer->IsStyleSkillActive(SKILL_MARKSMAN)) bConsume = false; if (bConsume) pPlayer->RemoveAmmo( 1, m_iPrimaryAmmoType ); } if ( pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0 || m_iClip1 == GetMaxClip1() ) pPlayer->DoAnimationEvent( PLAYERANIMEVENT_RELOAD_END ); m_iInSpecialReload = 1; } return true; }