//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseSDKGrenade::ItemPostFrame() { CSDKPlayer *pPlayer = GetPlayerOwner(); if ( !pPlayer ) return; CBaseViewModel *vm = pPlayer->GetViewModel( m_nViewModelIndex ); if ( !vm ) return; // If they let go of the fire button, they want to throw the grenade. if ( m_bPinPulled && !(pPlayer->m_nButtons & IN_ATTACK) ) { pPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); // if (m_bSecondary) // DropGrenade(); // else ThrowGrenade(); DecrementAmmo( pPlayer ); m_bPinPulled = false; SendWeaponAnim( ACT_VM_THROW ); SetWeaponIdleTime( gpGlobals->curtime + SequenceDuration() ); m_bPinPulled = false; // m_bSecondary = false; } else if( m_bRedraw ) { // Has the throw animation finished playing if( m_flTimeWeaponIdle < gpGlobals->curtime ) { // if we're officially out of grenades, ditch this weapon if( pPlayer->GetAmmoCount(m_iPrimaryAmmoType) <= 0 ) { #ifdef GAME_DLL pPlayer->Weapon_Drop( this, NULL, NULL ); UTIL_Remove(this); #endif pPlayer->SwitchToNextBestWeapon( NULL ); //Tony; now switch! cuz we rans outs! } else { m_bRedraw = false; m_flNextPrimaryAttack = gpGlobals->curtime + 1.2; m_flNextSecondaryAttack = gpGlobals->curtime + 1.2; SendWeaponAnim( GetDeployActivity() ); } return; //don't animate this grenade any more! } } else if( !m_bRedraw ) { BaseClass::ItemPostFrame(); } }
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 ); }
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 > gpGlobals->curtime) return true; // check to see if we're ready to reload if (m_fInSpecialReload == 0) { pPlayer->SetAnimation( PLAYER_RELOAD ); SendWeaponAnim( ACT_SHOTGUN_RELOAD_START ); m_fInSpecialReload = 1; pPlayer->m_flNextAttack = gpGlobals->curtime + 0.5; m_flNextPrimaryAttack = gpGlobals->curtime + 0.5; m_flNextSecondaryAttack = gpGlobals->curtime + 0.5; SetWeaponIdleTime( gpGlobals->curtime + 0.5 ); return true; } else if (m_fInSpecialReload == 1) { if (m_flTimeWeaponIdle > gpGlobals->curtime) return true; // was waiting for gun to move to side m_fInSpecialReload = 2; SendWeaponAnim( ACT_VM_RELOAD ); SetWeaponIdleTime( gpGlobals->curtime + 0.45 ); } else { // Add them to the clip m_iClip1 += 1; #ifdef GAME_DLL SendReloadEvents(); #endif CSDKPlayer *pPlayer = GetPlayerOwner(); if ( pPlayer ) pPlayer->RemoveAmmo( 1, m_iPrimaryAmmoType ); m_fInSpecialReload = 1; } return true; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseSDKGrenade::ItemPostFrame() { CSDKPlayer *pPlayer = GetPlayerOwner(); if ( !pPlayer ) return; CBaseViewModel *vm = pPlayer->GetViewModel( m_nViewModelIndex ); if ( !vm ) return; // If they let go of the fire button, they want to throw the grenade. if ( m_bPinPulled && !(pPlayer->m_nButtons & IN_ATTACK) ) { pPlayer->DoAnimationEvent( PLAYERANIMEVENT_THROW_GRENADE ); StartGrenadeThrow(); DecrementAmmo( pPlayer ); m_bPinPulled = false; SendWeaponAnim( ACT_VM_THROW ); SetWeaponIdleTime( gpGlobals->curtime + SequenceDuration() ); } else if ((m_fThrowTime > 0) && (m_fThrowTime < gpGlobals->curtime)) { ThrowGrenade(); } else if( m_bRedraw ) { // Has the throw animation finished playing if( m_flTimeWeaponIdle < gpGlobals->curtime ) { #ifdef GAME_DLL // if we're officially out of grenades, ditch this weapon if( pPlayer->GetAmmoCount(m_iPrimaryAmmoType) <= 0 ) { pPlayer->Weapon_Drop( this, NULL, NULL ); UTIL_Remove(this); } else { pPlayer->SwitchToNextBestWeapon( this ); } #endif return; //don't animate this grenade any more! } } else if( !m_bRedraw ) { BaseClass::ItemPostFrame(); } }
void CWeaponShotgun::WeaponIdle() { CSDKPlayer *pPlayer = GetPlayerOwner(); if (m_flPumpTime && m_flPumpTime < gpGlobals->curtime) { // play pumping sound m_flPumpTime = 0; } if (m_flTimeWeaponIdle < gpGlobals->curtime) { if (m_iClip1 == 0 && m_fInSpecialReload == 0 && pPlayer->GetAmmoCount( m_iPrimaryAmmoType )) { Reload( ); } else if (m_fInSpecialReload != 0) { if (m_iClip1 != 8 && pPlayer->GetAmmoCount( m_iPrimaryAmmoType )) { Reload( ); } else { // reload debounce has timed out //MIKETODO: shotgun anims SendWeaponAnim( ACT_SHOTGUN_RELOAD_FINISH ); // play cocking sound m_fInSpecialReload = 0; SetWeaponIdleTime( gpGlobals->curtime + 1.5 ); } } else { SendWeaponAnim( ACT_VM_IDLE ); } } }
void CWeaponShotgun::WeaponIdle() { CSDKPlayer *pPlayer = GetPlayerOwner(); if (m_flPumpTime && m_flPumpTime < GetCurrentTime()) { // play pumping sound m_flPumpTime = 0; } if (m_flTimeWeaponIdle < GetCurrentTime()) { if (m_iClip1 == 0 && m_iInSpecialReload == 0 && pPlayer->GetAmmoCount( m_iPrimaryAmmoType )) { Reload( ); } else if (m_iInSpecialReload != 0) { if (m_iClip1 != 8 && pPlayer->GetAmmoCount( m_iPrimaryAmmoType )) { Reload( ); } else { // reload debounce has timed out SendWeaponAnim( ACT_SHOTGUN_RELOAD_FINISH ); // play cocking sound m_iInSpecialReload = 0; SetWeaponIdleTime( GetCurrentTime() + 1.5 ); m_flNextPrimaryAttack = GetCurrentTime() + 0.15; // Add a small delay between finishing reload and firing again } } else { SendWeaponAnim( ACT_VM_IDLE ); } } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseSDKGrenade::PrimaryAttack() { if ( m_bRedraw || m_bPinPulled ) return; CSDKPlayer *pPlayer = GetPlayerOwner(); if ( !pPlayer || pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0 ) return; // The pull pin animation has to finish, then we wait until they aren't holding the primary // attack button, then throw the grenade. SendWeaponAnim( ACT_VM_PULLPIN ); m_bPinPulled = true; // Don't let weapon idle interfere in the middle of a throw! SetWeaponIdleTime( gpGlobals->curtime + SequenceDuration() ); m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration(); }
//------------------------------------------------------------------------------ // Purpose : Update weapon //------------------------------------------------------------------------------ void CWeaponSDKMelee::ItemPostFrame( void ) { CSDKPlayer *pPlayer = GetPlayerOwner(); if ( pPlayer == NULL ) return; if (IsThrowingGrenade()) { if (MaintainGrenadeToss()) return; } else if ((pPlayer->m_nButtons & IN_ALT2) && !IsThrowingGrenade() && pPlayer->GetAmmoCount(GetAmmoDef()->Index("grenades")) && pPlayer->CanAttack()) { bool bAllow = (m_flNextPrimaryAttack < GetCurrentTime()); if (m_bInReload) bAllow = true; if (bAllow) { StartGrenadeToss(); return; } } if (GetSwingTime() > 0 && GetSwingTime() <= GetCurrentTime()) { Swing(); } else if ( (pPlayer->m_nButtons & IN_ATTACK) && (m_flNextPrimaryAttack <= GetCurrentTime()) && pPlayer->CanAttack() ) { PrimaryAttack(); } else if ( (pPlayer->m_nButtons & IN_ATTACK2) && (m_flNextSecondaryAttack <= GetCurrentTime()) && pPlayer->CanAttack() ) { SecondaryAttack(); } else { WeaponIdle(); } }
//----------------------------------------------------------------------------- // Purpose: // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool CBaseSDKGrenade::Holster( CBaseCombatWeapon *pSwitchingTo ) { m_bRedraw = false; m_bPinPulled = false; // when this is holstered make sure the pin isn’t pulled. m_fThrowTime = 0; #ifndef CLIENT_DLL // If they attempt to switch weapons before the throw animation is done, // allow it, but kill the weapon if we have to. CSDKPlayer *pPlayer = GetPlayerOwner(); if( pPlayer->GetAmmoCount(m_iPrimaryAmmoType) <= 0 ) { CBaseCombatCharacter *pOwner = (CBaseCombatCharacter *)pPlayer; pOwner->Weapon_Drop( this ); UTIL_Remove(this); } #endif return BaseClass::Holster( pSwitchingTo ); }
bool CWeaponMP5::Reload( ) { CSDKPlayer *pPlayer = GetPlayerOwner(); if (pPlayer->GetAmmoCount( GetPrimaryAmmoType() ) <= 0) return false; int iResult = DefaultReload( GetMaxClip1(), GetMaxClip2(), ACT_VM_RELOAD ); if ( !iResult ) return false; pPlayer->SetAnimation( PLAYER_RELOAD ); #ifndef CLIENT_DLL if ((iResult) && (pPlayer->GetFOV() != pPlayer->GetDefaultFOV())) { pPlayer->SetFOV( pPlayer, pPlayer->GetDefaultFOV() ); } #endif pPlayer->m_iShotsFired = 0; return true; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseSDKGrenade::ItemPostFrame() { CSDKPlayer *pPlayer = GetPlayerOwner(); if ( !pPlayer ) return; CBaseViewModel *vm = pPlayer->GetViewModel( m_nViewModelIndex ); if ( !vm ) return; // If they let go of the fire button, they want to throw the grenade. if ( m_bPinPulled && !(pPlayer->m_nButtons & IN_ATTACK) ) { pPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); // if (m_bSecondary) // DropGrenade(); // else ThrowGrenade(); if (!pPlayer->IsStyleSkillActive(SKILL_TROLL)) DecrementAmmo( pPlayer ); m_bPinPulled = false; SendWeaponAnim( ACT_VM_THROW ); SetWeaponIdleTime( GetCurrentTime() + SequenceDuration() ); m_bPinPulled = false; // m_bSecondary = false; } else if( m_bRedraw ) { // Has the throw animation finished playing if( m_flTimeWeaponIdle < GetCurrentTime() ) { // if we're officially out of grenades, ditch this weapon if( pPlayer->GetAmmoCount(m_iPrimaryAmmoType) <= 0 ) { #ifdef GAME_DLL pPlayer->Weapon_Drop( this, NULL, NULL ); UTIL_Remove(this); #endif pPlayer->SwitchToNextBestWeapon( NULL ); //Tony; now switch! cuz we rans outs! } else if (pPlayer->IsStyleSkillActive(SKILL_TROLL)) { m_bRedraw = false; m_flNextPrimaryAttack = GetCurrentTime() + 1.2; m_flNextSecondaryAttack = GetCurrentTime() + 1.2; SendWeaponAnim( GetDeployActivity() ); } else { m_bRedraw = false; // Only switch to the next best weapon if the next best weapon is not brawl. CBaseCombatWeapon *pNewWeapon = g_pGameRules->GetNextBestWeapon(pPlayer, this); CWeaponSDKBase* pSDKNewWeapon = dynamic_cast<CWeaponSDKBase*>(pNewWeapon); bool bSwitch = true; if (!pSDKNewWeapon) bSwitch = false; // If I'm going to switch to brawl but I have more grenades, don't switch. else if (pSDKNewWeapon && pSDKNewWeapon->GetWeaponID() == SDK_WEAPON_BRAWL && pPlayer->GetAmmoCount(m_iPrimaryAmmoType) > 0) bSwitch = false; if (bSwitch) pPlayer->SwitchToNextBestWeapon( this ); } return; //don't animate this grenade any more! } } else if( !m_bRedraw ) { BaseClass::ItemPostFrame(); } }
void CWeaponShotgun::PrimaryAttack() { CSDKPlayer *pPlayer = GetPlayerOwner(); if ( !pPlayer ) return; // don't fire underwater if (pPlayer->GetWaterLevel() == 3) { PlayEmptySound( ); m_flNextPrimaryAttack = gpGlobals->curtime + 0.15; return; } // Out of ammo? if ( m_iClip1 <= 0 ) { Reload(); if ( m_iClip1 == 0 ) { PlayEmptySound(); m_flNextPrimaryAttack = gpGlobals->curtime + 0.2; } return; } SendWeaponAnim( ACT_VM_PRIMARYATTACK ); m_iClip1--; pPlayer->DoMuzzleFlash(); // player "shoot" animation pPlayer->SetAnimation( PLAYER_ATTACK1 ); // Dispatch the FX right away with full accuracy. FX_FireBullets( pPlayer->entindex(), pPlayer->Weapon_ShootPosition(), pPlayer->EyeAngles() + 2.0f * pPlayer->GetPunchAngle(), GetWeaponID(), Primary_Mode, CBaseEntity::GetPredictionRandomSeed() & 255, // wrap it for network traffic so it's the same between client and server 0.0675 ); if (!m_iClip1 && pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0) { // HEV suit - indicate out of ammo condition pPlayer->SetSuitUpdate("!HEV_AMO0", false, 0); } if (m_iClip1 != 0) m_flPumpTime = gpGlobals->curtime + 0.5; m_flNextPrimaryAttack = gpGlobals->curtime + 0.875; m_flNextSecondaryAttack = gpGlobals->curtime + 0.875; if (m_iClip1 != 0) SetWeaponIdleTime( gpGlobals->curtime + 2.5 ); else SetWeaponIdleTime( gpGlobals->curtime + 0.875 ); m_fInSpecialReload = 0; // Update punch angles. QAngle angle = pPlayer->GetPunchAngle(); if ( pPlayer->GetFlags() & FL_ONGROUND ) { angle.x -= SharedRandomInt( "ShotgunPunchAngleGround", 4, 6 ); } else { angle.x -= SharedRandomInt( "ShotgunPunchAngleAir", 8, 11 ); } pPlayer->SetPunchAngle( angle ); }
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; }