//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CHudDemomanChargeMeter::ShouldDraw( void ) { C_TFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer(); if ( !pPlayer || !pPlayer->IsPlayerClass( TF_CLASS_DEMOMAN ) || !pPlayer->IsAlive() ) { return false; } CTFWeaponBase *pWpn = pPlayer->GetActiveTFWeapon(); if ( !pWpn ) { return false; } int iWeaponID = pWpn->GetWeaponID(); if ( iWeaponID != TF_WEAPON_PIPEBOMBLAUNCHER ) { return false; } return CHudElement::ShouldDraw(); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CHudDemomanChargeMeter::OnTick( void ) { C_TFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer(); if ( !pPlayer ) return; CTFWeaponBase *pWpn = pPlayer->GetActiveTFWeapon(); ITFChargeUpWeapon *pChargeupWeapon = dynamic_cast< ITFChargeUpWeapon *>( pWpn ); if ( !pWpn || !pChargeupWeapon ) return; if ( m_pChargeMeter ) { float flChargeMaxTime = pChargeupWeapon->GetChargeMaxTime(); if ( flChargeMaxTime != 0 ) { float flChargeBeginTime = pChargeupWeapon->GetChargeBeginTime(); if ( flChargeBeginTime > 0 ) { float flTimeCharged = max( 0, gpGlobals->curtime - flChargeBeginTime ); float flPercentCharged = min( 1.0, flTimeCharged / flChargeMaxTime ); m_pChargeMeter->SetProgress( flPercentCharged ); } else { m_pChargeMeter->SetProgress( 0.0f ); } } } }
void CProxySniperRifleCharge::OnBind( void *pC_BaseEntity ) { Assert( m_pResult ); C_TFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer(); if ( GetSpectatorTarget() != 0 && GetSpectatorMode() == OBS_MODE_IN_EYE ) { pPlayer = (C_TFPlayer *)UTIL_PlayerByIndex( GetSpectatorTarget() ); } if ( pPlayer ) { CTFSniperRifle *pWeapon = assert_cast<CTFSniperRifle*>(pPlayer->GetActiveTFWeapon()); if ( pWeapon ) { float flChargeValue = ( ( 1.0 - pWeapon->GetHUDDamagePerc() ) * 0.8 ) + 0.6; VMatrix mat, temp; Vector2D center( 0.5, 0.5 ); MatrixBuildTranslation( mat, -center.x, -center.y, 0.0f ); // scale { Vector2D scale( 1.0f, 0.25f ); MatrixBuildScale( temp, scale.x, scale.y, 1.0f ); MatrixMultiply( temp, mat, mat ); } MatrixBuildTranslation( temp, center.x, center.y, 0.0f ); MatrixMultiply( temp, mat, mat ); // translation { Vector2D translation( 0.0f, flChargeValue ); MatrixBuildTranslation( temp, translation.x, translation.y, 0.0f ); MatrixMultiply( temp, mat, mat ); } m_pResult->SetMatrixValue( mat ); } } if ( ToolsEnabled() ) { ToolFramework_RecordMaterialParams( GetMaterial() ); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CHudMedicChargeMeter::OnTick( void ) { C_TFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer(); if ( !pPlayer ) return; CTFWeaponBase *pWpn = pPlayer->GetActiveTFWeapon(); if ( !pWpn || ( pWpn->GetWeaponID() != TF_WEAPON_MEDIGUN ) ) return; CWeaponMedigun *pMedigun = static_cast< CWeaponMedigun *>( pWpn ); if ( !pMedigun ) return; float flCharge = pMedigun->GetChargeLevel(); if ( flCharge != m_flLastChargeValue ) { if ( m_pChargeMeter ) { m_pChargeMeter->SetProgress( flCharge ); } if ( !m_bCharged ) { if ( flCharge >= 1.0 ) { g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( this, "HudMedicCharged" ); m_bCharged = true; } } else { // we've got invuln charge or we're using our invuln if ( !pMedigun->IsReleasingCharge() ) { g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( this, "HudMedicChargedStop" ); m_bCharged = false; } } } m_flLastChargeValue = flCharge; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CHudMedicChargeMeter::ShouldDraw( void ) { C_TFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer(); if ( !pPlayer || !pPlayer->IsPlayerClass( TF_CLASS_MEDIC ) || !pPlayer->IsAlive() ) { return false; } CTFWeaponBase *pWpn = pPlayer->GetActiveTFWeapon(); if ( !pWpn ) { return false; } if ( pWpn->GetWeaponID() != TF_WEAPON_MEDIGUN ) { return false; } return CHudElement::ShouldDraw(); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CTFHudWeaponAmmo::ShouldDraw( void ) { // Get the player and active weapon. C_TFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer(); if ( !pPlayer ) { return false; } CTFWeaponBase *pWeapon = pPlayer->GetActiveTFWeapon(); if ( !pWeapon ) { return false; } if ( pWeapon->GetWeaponID() == TF_WEAPON_MEDIGUN ) { return false; } return CHudElement::ShouldDraw(); }
//----------------------------------------------------------------------------- // Purpose: This runs on both the client and the server. On the server, it // only does the damage calculations. On the client, it does all the effects. //----------------------------------------------------------------------------- void FX_FireBullets( int iPlayer, const Vector &vecOrigin, const QAngle &vecAngles, int iWeapon, int iMode, int iSeed, float flSpread, float flDamage /* = -1.0f */, bool bCritical /* = false*/ ) { // Get the weapon information. const char *pszWeaponAlias = WeaponIdToAlias( iWeapon ); if ( !pszWeaponAlias ) { DevMsg( 1, "FX_FireBullets: weapon alias for ID %i not found\n", iWeapon ); return; } WEAPON_FILE_INFO_HANDLE hWpnInfo = LookupWeaponInfoSlot( pszWeaponAlias ); if ( hWpnInfo == GetInvalidWeaponInfoHandle() ) { DevMsg( 1, "FX_FireBullets: LookupWeaponInfoSlot failed for weapon %s\n", pszWeaponAlias ); return; } CTFWeaponInfo *pWeaponInfo = static_cast<CTFWeaponInfo*>( GetFileWeaponInfoFromHandle( hWpnInfo ) ); if( !pWeaponInfo ) return; bool bDoEffects = false; #ifdef CLIENT_DLL C_TFPlayer *pPlayer = ToTFPlayer( ClientEntityList().GetBaseEntity( iPlayer ) ); #else CTFPlayer *pPlayer = ToTFPlayer( UTIL_PlayerByIndex( iPlayer ) ); #endif if ( !pPlayer ) return; // Client specific. #ifdef CLIENT_DLL bDoEffects = true; // The minigun has custom sound & animation code to deal with its windup/down. if ( !pPlayer->IsLocalPlayer() && iWeapon != TF_WEAPON_MINIGUN ) { // Fire the animation event. if ( pPlayer && !pPlayer->IsDormant() ) { if ( iMode == TF_WEAPON_PRIMARY_MODE ) { pPlayer->m_PlayerAnimState->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); } else { pPlayer->m_PlayerAnimState->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_SECONDARY ); } } //FX_WeaponSound( pPlayer->entindex(), SINGLE, vecOrigin, pWeaponInfo ); } // Server specific. #else // If this is server code, send the effect over to client as temp entity and // dispatch one message for all the bullet impacts and sounds. TE_FireBullets( pPlayer->entindex(), vecOrigin, vecAngles, iWeapon, iMode, iSeed, flSpread, bCritical ); // Let the player remember the usercmd he fired a weapon on. Assists in making decisions about lag compensation. pPlayer->NoteWeaponFired(); #endif // Fire bullets, calculate impacts & effects. StartGroupingSounds(); #if !defined (CLIENT_DLL) // Move other players back to history positions based on local player's lag lagcompensation->StartLagCompensation( pPlayer, pPlayer->GetCurrentCommand() ); #endif // Get the shooting angles. Vector vecShootForward, vecShootRight, vecShootUp; AngleVectors( vecAngles, &vecShootForward, &vecShootRight, &vecShootUp ); // Initialize the static firing information. FireBulletsInfo_t fireInfo; fireInfo.m_vecSrc = vecOrigin; if ( flDamage < 0.0f ) { fireInfo.m_flDamage = pWeaponInfo->GetWeaponData( iMode ).m_nDamage; } else { fireInfo.m_flDamage = static_cast<int>(flDamage); } fireInfo.m_flDistance = pWeaponInfo->GetWeaponData( iMode ).m_flRange; fireInfo.m_iShots = 1; fireInfo.m_vecSpread.Init( flSpread, flSpread, 0.0f ); fireInfo.m_iAmmoType = pWeaponInfo->iAmmoType; // Setup the bullet damage type & roll for crit. int nDamageType = DMG_GENERIC; int nCustomDamageType = TF_DMG_CUSTOM_NONE; CTFWeaponBase *pWeapon = pPlayer->GetActiveTFWeapon(); if ( pWeapon ) { nDamageType = pWeapon->GetDamageType(); if ( pWeapon->IsCurrentAttackACrit() || bCritical ) { nDamageType |= DMG_CRITICAL; } nCustomDamageType = pWeapon->GetCustomDamageType(); } if ( iWeapon != TF_WEAPON_MINIGUN ) { fireInfo.m_iTracerFreq = 2; } // Reset multi-damage structures. ClearMultiDamage(); int nBulletsPerShot = pWeaponInfo->GetWeaponData( iMode ).m_nBulletsPerShot; for ( int iBullet = 0; iBullet < nBulletsPerShot; ++iBullet ) { // Initialize random system with this seed. RandomSeed( iSeed ); // Determine if the first bullet should be perfectly accurate. bool bPerfectAccuracy = false; if ( pWeapon && iBullet == 0 ) { float flFireInterval = gpGlobals->curtime - pWeapon->GetLastFireTime(); if ( nBulletsPerShot == 1 ) bPerfectAccuracy = flFireInterval > 1.25f; else bPerfectAccuracy = flFireInterval > 0.25f; } float x = 0.0f; float y = 0.0f; // tf_use_fixed_weapon_spread calculations go here. if ( !bPerfectAccuracy ) { // Get circular gaussian spread. x = RandomFloat( -0.5, 0.5 ) + RandomFloat( -0.5, 0.5 ); y = RandomFloat( -0.5, 0.5 ) + RandomFloat( -0.5, 0.5 ); } // Initialize the varialbe firing information. fireInfo.m_vecDirShooting = vecShootForward + ( x * flSpread * vecShootRight ) + ( y * flSpread * vecShootUp ); fireInfo.m_vecDirShooting.NormalizeInPlace(); // Fire a bullet. pPlayer->FireBullet( fireInfo, bDoEffects, nDamageType, nCustomDamageType ); // Use new seed for next bullet. ++iSeed; } // Apply damage if any. ApplyMultiDamage(); #if !defined (CLIENT_DLL) lagcompensation->FinishLagCompensation( pPlayer ); #endif EndGroupingSounds(); }