void CP228::Reload() { if (m_pPlayer->ammo_357sig <= 0) return; if (DefaultReload(iMaxClip(), m_pPlayer->HasShield() ? P228_SHIELD_RELOAD : P228_RELOAD, P228_RELOAD_TIME)) { m_pPlayer->SetAnimation(PLAYER_RELOAD); m_flAccuracy = 0.9f; } }
void CDEAGLE::__MAKE_VHOOK(Reload)() { if (m_pPlayer->ammo_50ae <= 0) return; if (DefaultReload(iMaxClip(), DEAGLE_RELOAD, DEAGLE_RELOAD_TIME)) { m_pPlayer->SetAnimation(PLAYER_RELOAD); m_flAccuracy = 0.9f; } }
void CELITE::Reload() { if (m_pPlayer->ammo_9mm <= 0) return; if (DefaultReload(iMaxClip(), ELITE_RELOAD, ELITE_RELOAD_TIME)) { m_pPlayer->SetAnimation(PLAYER_RELOAD); m_flAccuracy = 0.88f; } }
void CShotgun::WeaponIdle( void ) { ResetEmptySound( ); m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); if (m_flTimeWeaponIdle < UTIL_WeaponTimeBase() ) { if (m_iClip == 0 && m_InSpecialReload == ReloadState::NOT_RELOADING && m_pPlayer->m_rgAmmo[ PrimaryAmmoIndex() ]) { Reload( ); } else if (m_InSpecialReload != ReloadState::NOT_RELOADING ) { if (m_iClip != iMaxClip() && m_pPlayer->m_rgAmmo[ PrimaryAmmoIndex() ]) { Reload( ); } else { // reload debounce has timed out SendWeaponAnim( SHOTGUN_PUMP ); // play cocking sound EMIT_SOUND_DYN( m_pPlayer, CHAN_ITEM, "weapons/scock1.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG(0,0x1f)); m_InSpecialReload = ReloadState::NOT_RELOADING; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.5; } } else { int iAnim; float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 ); if (flRand <= 0.8) { iAnim = SHOTGUN_IDLE_DEEP; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (60.0/12.0);// * RANDOM_LONG(2, 5); } else if (flRand <= 0.95) { iAnim = SHOTGUN_IDLE; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (20.0/9.0); } else { iAnim = SHOTGUN_IDLE4; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (20.0/9.0); } SendWeaponAnim( iAnim ); } } }
void CP90::Reload() { if (m_pPlayer->ammo_57mm <= 0) return; if (DefaultReload(iMaxClip(), P90_RELOAD, P90_RELOAD_TIME)) { m_pPlayer->SetAnimation(PLAYER_RELOAD); m_flAccuracy = 0.2f; m_iShotsFired = 0; } }
void CMP5N::Reload() { if (m_pPlayer->ammo_9mm <= 0) return; if (DefaultReload(iMaxClip(), MP5N_RELOAD, MP5N_RELOAD_TIME)) { m_pPlayer->SetAnimation(PLAYER_RELOAD); m_flAccuracy = 0; m_iShotsFired = 0; } }
void CXM1014::Reload() { if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == iMaxClip()) return; // don't reload until recoil is done if (m_flNextPrimaryAttack > UTIL_WeaponTimeBase()) return; // check to see if we're ready to reload if (m_fInSpecialReload == 0) { m_pPlayer->SetAnimation(PLAYER_RELOAD); SendWeaponAnim(XM1014_START_RELOAD, UseDecrement() != FALSE); m_fInSpecialReload = 1; m_flNextSecondaryAttack = m_flTimeWeaponIdle = m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.55f; m_flNextPrimaryAttack = GetNextAttackDelay(0.55); } else if (m_fInSpecialReload == 1) { if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase()) return; // was waiting for gun to move to side m_fInSpecialReload = 2; if (RANDOM_LONG(0, 1)) EMIT_SOUND_DYN(m_pPlayer->edict(), CHAN_ITEM, "weapons/reload1.wav", VOL_NORM, ATTN_NORM, 0, 85 + RANDOM_LONG(0, 31)); else EMIT_SOUND_DYN(m_pPlayer->edict(), CHAN_ITEM, "weapons/reload3.wav", VOL_NORM, ATTN_NORM, 0, 85 + RANDOM_LONG(0, 31)); SendWeaponAnim(XM1014_RELOAD, UseDecrement()); m_flTimeWeaponIdle = m_flNextReload = UTIL_WeaponTimeBase() + 0.3f; } else { m_iClip++; #ifdef REGAMEDLL_ADD if (refill_bpammo_weapons.value < 3.0f) #endif { m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--; m_pPlayer->ammo_buckshot--; } m_fInSpecialReload = 1; } }
void CShotgun::Reload( void ) { if (m_pPlayer->m_rgAmmo[ PrimaryAmmoIndex() ] <= 0 || m_iClip == iMaxClip()) return; // don't reload until recoil is done if (m_flNextPrimaryAttack > UTIL_WeaponTimeBase()) return; // check to see if we're ready to reload if (m_InSpecialReload == ReloadState::NOT_RELOADING ) { SendWeaponAnim( SHOTGUN_START_RELOAD ); m_InSpecialReload = ReloadState::DO_RELOAD_EFFECTS; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.6; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.6; m_flNextPrimaryAttack = GetNextAttackDelay(1.0); m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0; return; } else if ( m_InSpecialReload == ReloadState::DO_RELOAD_EFFECTS ) { if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase()) return; // was waiting for gun to move to side m_InSpecialReload = ReloadState::RELOAD_ONE; if (RANDOM_LONG(0,1)) EMIT_SOUND_DYN( m_pPlayer, CHAN_ITEM, "weapons/reload1.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG(0,0x1f)); else EMIT_SOUND_DYN( m_pPlayer, CHAN_ITEM, "weapons/reload3.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG(0,0x1f)); SendWeaponAnim( SHOTGUN_RELOAD ); m_flNextReload = UTIL_WeaponTimeBase() + 0.5; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5; } else { // Add them to the clip m_iClip += 1; m_pPlayer->m_rgAmmo[ PrimaryAmmoIndex() ] -= 1; m_InSpecialReload = ReloadState::DO_RELOAD_EFFECTS; } }
//========================================================= // called by the new item with the existing item as parameter // // if we call ExtractAmmo(), it's because the player is picking up this type of weapon for // the first time. If it is spawned by the world, m_iDefaultAmmo will have a default ammo amount in it. // if this is a weapon dropped by a dying player, has 0 m_iDefaultAmmo, which means only the ammo in // the weapon clip comes along. //========================================================= int CBasePlayerWeapon::ExtractAmmo( CBasePlayerWeapon *pWeapon ) { int iReturn; if ( pszAmmo1() != NULL ) { // blindly call with m_iDefaultAmmo. It's either going to be a value or zero. If it is zero, // we only get the ammo in the weapon's clip, which is what we want. iReturn = pWeapon->AddPrimaryAmmo( m_iDefaultAmmo, (char *)pszAmmo1(), iMaxClip(), iMaxAmmo1() ); m_iDefaultAmmo = 0; } if ( pszAmmo2() != NULL ) { iReturn = pWeapon->AddSecondaryAmmo( 0, (char *)pszAmmo2(), iMaxAmmo2() ); } return iReturn; }
void CFamas::__MAKE_VHOOK(Reload)() { if (m_pPlayer->ammo_556nato <= 0) return; if (DefaultReload(iMaxClip(), FAMAS_RELOAD, FAMAS_RELOAD_TIME)) { m_pPlayer->SetAnimation(PLAYER_RELOAD); if (m_pPlayer->m_iFOV != DEFAULT_FOV) { SecondaryAttack(); } m_flAccuracy = 0; m_iShotsFired = 0; m_bDelayFire = false; } }
void CXM1014::WeaponIdle() { ResetEmptySound(); m_pPlayer->GetAutoaimVector(AUTOAIM_5DEGREES); #ifndef REGAMEDLL_FIXES if (m_flPumpTime && m_flPumpTime < UTIL_WeaponTimeBase()) { m_flPumpTime = 0; } #endif if (m_flTimeWeaponIdle < UTIL_WeaponTimeBase()) { if (m_iClip == 0 && m_fInSpecialReload == 0 && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) { Reload(); } else if (m_fInSpecialReload != 0) { if (m_iClip != iMaxClip() && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) { Reload(); } else { // reload debounce has timed out SendWeaponAnim(XM1014_PUMP, UseDecrement() != FALSE); m_fInSpecialReload = 0; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.5f; } } else { SendWeaponAnim(XM1014_IDLE, UseDecrement() != FALSE); } } }
/* ===================== CBasePlayerWeapon::ItemPostFrame Handles weapon firing, reloading, etc. ===================== */ void CBasePlayerWeapon::ItemPostFrame( void ) { if ((m_fInReload) && (m_pPlayer->m_flNextAttack <= 0.0)) { #if 0 // FIXME, need ammo on client to make this work right // complete the reload. int j = min( iMaxClip() - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]); // Add them to the clip m_iClip += j; m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= j; #else m_iClip += 10; #endif m_fInReload = FALSE; } if ((m_pPlayer->pev->button & IN_ATTACK2) && (m_flNextSecondaryAttack <= 0.0)) { if ( pszAmmo2() && !m_pPlayer->m_rgAmmo[SecondaryAmmoIndex()] ) { m_fFireOnEmpty = TRUE; } SecondaryAttack(); m_pPlayer->pev->button &= ~IN_ATTACK2; } else if ((m_pPlayer->pev->button & IN_ATTACK) && (m_flNextPrimaryAttack <= 0.0)) { if ( (m_iClip == 0 && pszAmmo1()) || (iMaxClip() == -1 && !m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] ) ) { m_fFireOnEmpty = TRUE; } PrimaryAttack(); } else if ( m_pPlayer->pev->button & IN_RELOAD && iMaxClip() != WEAPON_NOCLIP && !m_fInReload ) { // reload when reload is pressed, or if no buttons are down and weapon is empty. Reload(); } else if ( !(m_pPlayer->pev->button & (IN_ATTACK|IN_ATTACK2) ) ) { // no fire buttons down m_fFireOnEmpty = FALSE; if ( !m_bPlayedIdleAnim ) { m_bPlayedIdleAnim = TRUE; if ( m_pPlayer->m_iQuakeWeapon == IT_LIGHTNING ) PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_pPlayer->m_usLightning, 0, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, 0.0, 0.0, 0, 1, 0, 0 ); } WeaponIdle( ); return; } // catch all if ( ShouldWeaponIdle() ) { WeaponIdle(); } }
void CBasePlayerWeapon::ItemPostFrame( void ) { if ((m_fInReload) && ( m_pPlayer->m_flNextAttack <= UTIL_WeaponTimeBase() ) ) { // complete the reload. int j = min( iMaxClip() - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]); // Add them to the clip m_iClip += j; m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= j; m_pPlayer->TabulateAmmo(); m_fInReload = FALSE; } if ( !(m_pPlayer->pev->button & IN_ATTACK ) ) { m_flLastFireTime = 0.0f; } if ((m_pPlayer->pev->button & IN_ATTACK2) && CanAttack( m_flNextSecondaryAttack, gpGlobals->time, UseDecrement() ) ) { if ( pszAmmo2() && !m_pPlayer->m_rgAmmo[SecondaryAmmoIndex()] ) { m_fFireOnEmpty = TRUE; } m_pPlayer->TabulateAmmo(); SecondaryAttack(); m_pPlayer->pev->button &= ~IN_ATTACK2; } else if ((m_pPlayer->pev->button & IN_ATTACK) && CanAttack( m_flNextPrimaryAttack, gpGlobals->time, UseDecrement() ) ) { if ( (m_iClip == 0 && pszAmmo1()) || (iMaxClip() == -1 && !m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] ) ) { m_fFireOnEmpty = TRUE; } m_pPlayer->TabulateAmmo(); PrimaryAttack(); } else if ( m_pPlayer->pev->button & IN_RELOAD && iMaxClip() != WEAPON_NOCLIP && !m_fInReload ) { // reload when reload is pressed, or if no buttons are down and weapon is empty. Reload(); } else if ( !(m_pPlayer->pev->button & (IN_ATTACK|IN_ATTACK2) ) ) { // no fire buttons down m_fFireOnEmpty = FALSE; if ( !IsUseable() && m_flNextPrimaryAttack < ( UseDecrement() ? 0.0 : gpGlobals->time ) ) { // weapon isn't useable, switch. if ( !(iFlags() & ITEM_FLAG_NOAUTOSWITCHEMPTY) && g_pGameRules->GetNextBestWeapon( m_pPlayer, this ) ) { m_flNextPrimaryAttack = ( UseDecrement() ? 0.0 : gpGlobals->time ) + 0.3; return; } } else { // weapon is useable. Reload if empty and weapon has waited as long as it has to after firing if ( m_iClip == 0 && !(iFlags() & ITEM_FLAG_NOAUTORELOAD) && m_flNextPrimaryAttack < ( UseDecrement() ? 0.0 : gpGlobals->time ) ) { Reload(); return; } } WeaponIdle( ); return; } // catch all if ( ShouldWeaponIdle() ) { WeaponIdle(); } }
/* ===================== CBasePlayerWeapon::ItemPostFrame Handles weapon firing, reloading, etc. ===================== */ void CBasePlayerWeapon::ItemPostFrame( void ) { if ((m_fInReload) && (m_pPlayer->m_flNextAttack <= 0.0)) { #if 0 // FIXME, need ammo on client to make this work right // complete the reload. int j = min( iMaxClip() - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]); // Add them to the clip m_iClip += j; m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= j; #else m_iClip += 10; #endif m_fInReload = FALSE; } if ((m_pPlayer->pev->button & IN_ATTACK2) && (m_flNextSecondaryAttack <= 0.0)) { if ( pszAmmo2() && !m_pPlayer->m_rgAmmo[SecondaryAmmoIndex()] ) { m_fFireOnEmpty = TRUE; } SecondaryAttack(); m_pPlayer->pev->button &= ~IN_ATTACK2; } else if ((m_pPlayer->pev->button & IN_ATTACK) && (m_flNextPrimaryAttack <= 0.0)) { if ( (m_iClip == 0 && pszAmmo1()) || (iMaxClip() == -1 && !m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] ) ) { m_fFireOnEmpty = TRUE; } PrimaryAttack(); } else if ( m_pPlayer->pev->button & IN_RELOAD && iMaxClip() != WEAPON_NOCLIP && !m_fInReload ) { // reload when reload is pressed, or if no buttons are down and weapon is empty. Reload(); } else if ( !(m_pPlayer->pev->button & (IN_ATTACK|IN_ATTACK2) ) ) { // no fire buttons down m_fFireOnEmpty = FALSE; // weapon is useable. Reload if empty and weapon has waited as long as it has to after firing if ( m_iClip == 0 && !(iFlags() & ITEM_FLAG_NOAUTORELOAD) && m_flNextPrimaryAttack < 0.0 ) { Reload(); return; } WeaponIdle( ); return; } // catch all if ( ShouldWeaponIdle() ) { WeaponIdle(); } }
void CBasePlayerWeapon::ItemPostFrame( void ) { if ((m_fInReload) && ( m_pPlayer->m_flNextAttack <= UTIL_WeaponTimeBase() ) ) { // complete the reload. int j = min( iMaxClip() - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]); // Add them to the clip m_iClip += j; m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= j; m_fInReload = FALSE; } if ((m_pPlayer->pev->button & IN_ATTACK2) && CanAttack( m_flNextSecondaryAttack, gpGlobals->time, UseDecrement() ) ) { if ( pszAmmo2() && !m_pPlayer->m_rgAmmo[SecondaryAmmoIndex()] ) { m_fFireOnEmpty = TRUE; } SecondaryAttack(); m_pPlayer->pev->button &= ~IN_ATTACK2; } else if ((m_pPlayer->pev->button & IN_ATTACK) && CanAttack( m_flNextPrimaryAttack, gpGlobals->time, UseDecrement() ) ) { if ( (m_iClip == 0 && pszAmmo1()) || (iMaxClip() == -1 && !m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] ) ) { m_fFireOnEmpty = TRUE; } PrimaryAttack(); } else if ( m_pPlayer->pev->button & IN_RELOAD && iMaxClip() != WEAPON_NOCLIP && !m_fInReload ) { // reload when reload is pressed, or if no buttons are down and weapon is empty. Reload(); } else if ( !(m_pPlayer->pev->button & (IN_ATTACK|IN_ATTACK2) ) ) { // no fire buttons down if ( !m_bPlayedIdleAnim ) { m_bPlayedIdleAnim = TRUE; SendWeaponAnim( 0, 1 ); if ( m_pPlayer->m_iQuakeWeapon == IT_LIGHTNING ) { PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_pPlayer->m_usLightning, 0, (float *)&m_pPlayer->pev->origin, (float *)&m_pPlayer->pev->angles, 0.0, 0.0, 0, 1, 0, 0 ); if ( m_pPlayer->m_pActiveItem ) ((CQuakeGun*)m_pPlayer->m_pActiveItem)->DestroyEffect(); } } WeaponIdle( ); return; } // catch all if ( ShouldWeaponIdle() ) { WeaponIdle(); } }
/* ===================== CBasePlayerWeapon::ItemPostFrame Handles weapon firing, reloading, etc. ===================== */ void CBasePlayerWeapon::ItemPostFrame( void ) { int button = m_pPlayer->pev->button; if (!HasSecondaryAttack()) button &= ~IN_ATTACK2; if (m_flGlock18Shoot != 0) { m_iClip--; if( m_iClip < 0 ) { m_iClip = m_iGlock18ShotsFired = 0; } FireRemaining(m_iGlock18ShotsFired, m_flGlock18Shoot, TRUE); } else if (gpGlobals->time > m_flFamasShoot && m_flFamasShoot != 0) { m_iClip--; if( m_iClip < 0 ) { m_iClip = m_iFamasShotsFired = 0; } FireRemaining(m_iFamasShotsFired, m_flFamasShoot, FALSE); } if (m_flNextPrimaryAttack <= 0.0f) { if (m_pPlayer->m_bResumeZoom) { m_pPlayer->pev->fov = m_pPlayer->m_iFOV = m_pPlayer->m_iLastZoom; if (m_pPlayer->m_iFOV == m_pPlayer->m_iLastZoom) m_pPlayer->m_bResumeZoom = false; } } if (!g_bHoldingShield) { if (m_fInReload && m_pPlayer->pev->button & IN_ATTACK2) { SecondaryAttack(); m_pPlayer->pev->button &= ~IN_ATTACK2; m_fInReload = FALSE; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase(); } } if ((m_fInReload) && m_pPlayer->m_flNextAttack <= UTIL_WeaponTimeBase()) { int j = min(iMaxClip() - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]); m_iClip += j; m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= j; m_fInReload = FALSE; } if ((button & IN_ATTACK2) && m_flNextSecondaryAttack <= UTIL_WeaponTimeBase()) { if (pszAmmo2() && !m_pPlayer->m_rgAmmo[SecondaryAmmoIndex()]) m_fFireOnEmpty = TRUE; SecondaryAttack(); m_pPlayer->pev->button &= ~IN_ATTACK2; } else if ((m_pPlayer->pev->button & IN_ATTACK) && m_flNextPrimaryAttack <= UTIL_WeaponTimeBase()) { if ((!m_iClip && pszAmmo1()) || (iMaxClip() == WEAPON_NOCLIP && !m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()])) m_fFireOnEmpty = TRUE; if (m_pPlayer->m_bCanShoot == true) PrimaryAttack(); } else if (m_pPlayer->pev->button & IN_RELOAD && iMaxClip() != WEAPON_NOCLIP && !m_fInReload) { if (m_flNextPrimaryAttack < UTIL_WeaponTimeBase()) { if (m_flFamasShoot == 0 && m_flGlock18Shoot == 0) { if (!(m_iWeaponState & WPNSTATE_SHIELD_DRAWN)) Reload(); } } } else if (!(button & (IN_ATTACK | IN_ATTACK2))) { if (m_bDelayFire == true) { m_bDelayFire = false; if (m_iShotsFired > 15) m_iShotsFired = 15; m_flDecreaseShotsFired = gpGlobals->time + 0.4; } m_fFireOnEmpty = FALSE; if (m_iId != WEAPON_USP && m_iId != WEAPON_GLOCK18 && m_iId != WEAPON_P228 && m_iId != WEAPON_DEAGLE && m_iId != WEAPON_ELITE && m_iId != WEAPON_FIVESEVEN) { if (m_iShotsFired > 0) { if (gpGlobals->time > m_flDecreaseShotsFired) { m_iShotsFired--; m_flDecreaseShotsFired = gpGlobals->time + 0.0225; } } } else m_iShotsFired = 0; if (!(m_iWeaponState & WPNSTATE_SHIELD_DRAWN)) { if (m_iClip == 0 && !(iFlags() & ITEM_FLAG_NOAUTORELOAD) && m_flNextPrimaryAttack < UTIL_WeaponTimeBase()) { if (m_flFamasShoot == 0 && m_flGlock18Shoot == 0) { Reload(); return; } } } WeaponIdle(); return; } }
/* ===================== CBasePlayerWeapon::ItemPostFrame Handles weapon firing, reloading, etc. ===================== */ void CBasePlayerWeapon::ItemPostFrame( void ) { WeaponTick(); if( ( m_fInReload ) && ( m_pPlayer->m_flNextAttack <= UTIL_WeaponTimeBase() ) ) { #ifdef SERVER_DLL // FIXME, need ammo on client to make this work right // complete the reload. int j = min( iMaxClip() - m_iClip, m_pPlayer->m_rgAmmo[ PrimaryAmmoIndex() ] ); // Add them to the clip m_iClip += j; m_pPlayer->m_rgAmmo[ PrimaryAmmoIndex() ] -= j; #else m_iClip += 10; #endif m_fInReload = false; } #ifdef SERVER_DLL if( !m_pPlayer->GetButtons().Any( IN_ATTACK ) ) { m_flLastFireTime = 0.0f; } #endif if( m_pPlayer->GetButtons().Any( IN_ATTACK2 ) && CanAttack( m_flNextSecondaryAttack, gpGlobals->time, IsPredicted() ) ) { if( pszAmmo2() && !m_pPlayer->m_rgAmmo[ SecondaryAmmoIndex() ] ) { m_bFireOnEmpty = true; } SecondaryAttack(); m_pPlayer->GetButtons().ClearFlags( IN_ATTACK2 ); } else if( m_pPlayer->GetButtons().Any( IN_ATTACK ) && CanAttack( m_flNextPrimaryAttack, gpGlobals->time, IsPredicted() ) ) { if( ( m_iClip == 0 && pszAmmo1() ) || ( iMaxClip() == -1 && !m_pPlayer->m_rgAmmo[ PrimaryAmmoIndex() ] ) ) { m_bFireOnEmpty = true; } PrimaryAttack(); } else if( m_pPlayer->GetButtons().Any( IN_RELOAD ) && iMaxClip() != WEAPON_NOCLIP && !m_fInReload ) { // reload when reload is pressed, or if no buttons are down and weapon is empty. Reload(); } else if( !m_pPlayer->GetButtons().Any( IN_ATTACK | IN_ATTACK2 ) ) { // no fire buttons down m_bFireOnEmpty = false; //Only the server checks for weapon switching. - Solokiller #ifdef SERVER_DLL if( !IsUseable() && m_flNextPrimaryAttack < ( IsPredicted() ? 0.0 : gpGlobals->time ) ) { // weapon isn't useable, switch. if( !( iFlags() & ITEM_FLAG_NOAUTOSWITCHEMPTY ) && g_pGameRules->GetNextBestWeapon( m_pPlayer, this ) ) { m_flNextPrimaryAttack = ( IsPredicted() ? 0.0 : gpGlobals->time ) + 0.3; return; } } else #endif { // weapon is useable. Reload if empty and weapon has waited as long as it has to after firing if( m_iClip == 0 && !( iFlags() & ITEM_FLAG_NOAUTORELOAD ) && CanReload( m_flNextPrimaryAttack, gpGlobals->time, IsPredicted() ) ) { Reload(); return; } } WeaponIdle(); return; } // catch all if( ShouldWeaponIdle() ) { WeaponIdle(); } }
void CBasePlayerWeapon::ItemPostFrame( void ) { if ((m_fInReload) && ( m_pPlayer->m_flNextAttack <= UTIL_WeaponTimeBase() ) ) { // Pcjoe: Regular HL weapon if(!MMWeapon()) { // complete the reload. int j = min( iMaxClip() - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]); // Add them to the clip m_iClip += j; // Removed by Pcjoe /* m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= j; m_pPlayer->TabulateAmmo();*/ } // Pcjoe: Reload MM weapon else if(((CMMWeapon*)this)->RapidFireWeapon()) { CBaseRapidFireGun *pWeapon = (CBaseRapidFireGun*)this; // Reload ammo for non-power weapons if(!pWeapon->UsePowerPrimary()) { pWeapon->m_iPrimaryCur = pWeapon->MaxRounds(); pWeapon->m_iClip = pWeapon->MaxRounds(); } if(!pWeapon->UsePowerSecondary()) { pWeapon->m_iSecondaryCur = pWeapon->m_iSecondaryMax; } } m_fInReload = FALSE; } // Edited by Pcjoe // if ((m_pPlayer->pev->button & IN_ATTACK2) && CanAttack( m_flNextSecondaryAttack, gpGlobals->time, UseDecrement() ) ) if ((m_pPlayer->pev->button & IN_ATTACK2) && !m_pPlayer->m_fImpact && !m_pPlayer->m_fBoost && CanAttack( m_flNextSecondaryAttack, gpGlobals->time, UseDecrement() ) ) { if ( pszAmmo2() && !m_pPlayer->m_rgAmmo[SecondaryAmmoIndex()] ) { m_fFireOnEmpty = TRUE; } // Removed by Pcjoe // m_pPlayer->TabulateAmmo(); SecondaryAttack(); m_pPlayer->pev->button &= ~IN_ATTACK2; } // Edited by Pcjoe // else if ((m_pPlayer->pev->button & IN_ATTACK) && CanAttack( m_flNextPrimaryAttack, gpGlobals->time, UseDecrement() ) ) else if ((m_pPlayer->pev->button & IN_ATTACK) && !m_pPlayer->m_fImpact && !m_pPlayer->m_fBoost && CanAttack( m_flNextPrimaryAttack, gpGlobals->time, UseDecrement() ) ) { if ( (m_iClip == 0 && pszAmmo1()) || (iMaxClip() == -1 && !m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] ) ) { m_fFireOnEmpty = TRUE; } // Removed by Pcjoe // m_pPlayer->TabulateAmmo(); PrimaryAttack(); } else if ( m_pPlayer->pev->button & IN_RELOAD && iMaxClip() != WEAPON_NOCLIP && !m_fInReload ) { // reload when reload is pressed, or if no buttons are down and weapon is empty. Reload(); } else if ( !(m_pPlayer->pev->button & (IN_ATTACK|IN_ATTACK2) ) ) { // no fire buttons down m_fFireOnEmpty = FALSE; if ( !IsUseable() && m_flNextPrimaryAttack < ( UseDecrement() ? 0.0 : gpGlobals->time ) ) { // weapon isn't useable, switch. if ( !(iFlags() & ITEM_FLAG_NOAUTOSWITCHEMPTY) && g_pGameRules->GetNextBestWeapon( m_pPlayer, this ) ) { m_flNextPrimaryAttack = ( UseDecrement() ? 0.0 : gpGlobals->time ) + 0.3; return; } } else { // weapon is useable. Reload if empty and weapon has waited as long as it has to after firing if ( m_iClip == 0 && !(iFlags() & ITEM_FLAG_NOAUTORELOAD) && m_flNextPrimaryAttack < ( UseDecrement() ? 0.0 : gpGlobals->time ) ) { Reload(); // Pcjoe: Allow mm weapons to call idle if(!MMWeapon()) { return; } } } WeaponIdle( ); return; } // catch all if ( ShouldWeaponIdle() ) { WeaponIdle(); } }
/* ===================== CBasePlayerWeapon::ItemPostFrame Handles weapon firing, reloading, etc. ===================== */ void CBasePlayerWeapon::ItemPostFrame( void ) { if ((m_fInReload) && (m_pPlayer->m_flNextAttack <= 0.0)) { /////////////////////////////////////////////////////////////////////////////////////////////////////// // Put code in here to predict reloads (ie, have the ammo on screen update before we get a response) // /////////////////////////////////////////////////////////////////////////////////////////////////////// //#if 0 // FIXME, need ammo on client to make this work right // // complete the reload. // int j = min( iMaxClip() - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]); // // // Add them to the clip // m_iClip += j; // m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= j; //#else // m_iClip += 10; //#endif m_fInReload = FALSE; } if ((m_pPlayer->pev->button & IN_ATTACK2) && (m_flNextSecondaryAttack <= 0.0)) { if (GetCanUseWeapon()) { if ( pszAmmo2() && !m_pPlayer->m_rgAmmo[SecondaryAmmoIndex()] ) { m_fFireOnEmpty = TRUE; } SecondaryAttack(); m_pPlayer->pev->button &= ~IN_ATTACK2; } } else if ( (m_pPlayer->pev->button & IN_ATTACK) && (m_flNextPrimaryAttack <= 0.0) ) { if (GetCanUseWeapon()) { if ( (m_iClip == 0 && pszAmmo1()) || (iMaxClip() == -1 && !m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] ) ) { m_fFireOnEmpty = TRUE; } //#ifdef AVH_CLIENT //if((m_iClip == 0) && ? //#endif PrimaryAttack(); } } else if ( m_pPlayer->pev->button & IN_RELOAD && iMaxClip() != WEAPON_NOCLIP && !m_fInReload ) { if (GetCanUseWeapon()) { // reload when reload is pressed, or if no buttons are down and weapon is empty. Reload(); } } else if ( !(m_pPlayer->pev->button & (IN_ATTACK|IN_ATTACK2) ) ) { if (GetCanUseWeapon()) { // no fire buttons down m_fFireOnEmpty = FALSE; // weapon is useable. Reload if empty and weapon has waited as long as it has to after firing if ( m_iClip == 0 && !(iFlags() & ITEM_FLAG_NOAUTORELOAD) && m_flNextPrimaryAttack < 0.0 ) { // << CGC >> Only reload if we have more ammo to reload with if(m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] > 0) { Reload(); return; } } WeaponIdle( ); } return; } // catch all if ( ShouldWeaponIdle() ) { WeaponIdle(); } }