void Player::DoUpdate(int iCurrentTime) { // Get time since last update double delta = iCurrentTime - _previousTime; // Get x y components of distance to mouse double dx = _pGameMain->GetCurrentMouseX() - _x; double dy = _pGameMain->GetCurrentMouseY() - _y; // Euclidean distance to mouse double dist = sqrt(pow(dx, 2) + pow(dy, 2)); // Vary speed based upon distance from mouse if (dist > 1 && dist < 50) SetSpeed(_maxVelocity * dist / 50); else if (dist > 1) SetSpeed(_maxVelocity); else SetSpeed(0); // Set angle to point towards the mouse int angle = (int) ((atan2(dy, dx) * 180 / PI) + 450) % 360; SetAngle(angle); CheckPowerups(iCurrentTime); CheckKeys(iCurrentTime); // Call to the super call DoUpdate method Actor::DoUpdate(iCurrentTime); }
void CBasePlayer::PostThink() { if( g_fGameOver ) goto pt_end; // intermission or finale if( !IsAlive() ) goto pt_end; // Handle Tank controlling if( m_pTank != NULL ) { // if they've moved too far from the gun, or selected a weapon, unuse the gun if( m_pTank->OnControls( this ) && !HasWeaponModelName() ) { m_pTank->Use( this, this, USE_SET, 2 ); // try fire the gun } else { // they've moved off the platform m_pTank->Use( this, this, USE_OFF, 0 ); m_pTank = NULL; } } // do weapon stuff ItemPostFrame(); // check to see if player landed hard enough to make a sound // falling farther than half of the maximum safe distance, but not as far a max safe distance will // play a bootscrape sound, and no damage will be inflicted. Fallling a distance shorter than half // of maximum safe distance will make no sound. Falling farther than max safe distance will play a // fallpain sound, and damage will be inflicted based on how far the player fell if( GetFlags().Any( FL_ONGROUND ) && ( GetHealth() > 0 ) && m_flFallVelocity >= PLAYER_FALL_PUNCH_THRESHHOLD ) { // ALERT ( at_console, "%f\n", m_flFallVelocity ); if( GetWaterType() == CONTENTS_WATER ) { // Did he hit the world or a non-moving entity? // BUG - this happens all the time in water, especially when // BUG - water has current force //CBaseEntity* pEntity = GetGroundEntity(); //if ( !pEntity || pEntity->GetAbsVelocity().z == 0 ) // EMIT_SOUND( this, CHAN_BODY, "player/pl_wade1.wav", 1, ATTN_NORM); } else if( m_flFallVelocity > PLAYER_MAX_SAFE_FALL_SPEED ) { // after this point, we start doing damage float flFallDamage = g_pGameRules->FlPlayerFallDamage( this ); if( flFallDamage > GetHealth() ) {//splat // note: play on item channel because we play footstep landing on body channel EMIT_SOUND( this, CHAN_ITEM, "common/bodysplat.wav", 1, ATTN_NORM ); } if( flFallDamage > 0 ) { TakeDamage( CWorld::GetInstance(), CWorld::GetInstance(), flFallDamage, DMG_FALL ); Vector vecPunchAngle = GetPunchAngle(); vecPunchAngle.x = 0; SetPunchAngle( vecPunchAngle ); } } if( IsAlive() ) { SetAnimation( PLAYER_WALK ); } } if( GetFlags().Any( FL_ONGROUND ) ) { if( m_flFallVelocity > 64 && !g_pGameRules->IsMultiplayer() ) { CSoundEnt::InsertSound( bits_SOUND_PLAYER, GetAbsOrigin(), m_flFallVelocity, 0.2 ); // ALERT( at_console, "fall %f\n", m_flFallVelocity ); } m_flFallVelocity = 0; } // select the proper animation for the player character if( IsAlive() ) { if( !GetAbsVelocity().x && !GetAbsVelocity().y ) SetAnimation( PLAYER_IDLE ); else if( ( GetAbsVelocity().x || GetAbsVelocity().y ) && ( GetFlags().Any( FL_ONGROUND ) ) ) SetAnimation( PLAYER_WALK ); else if( GetWaterLevel() > WATERLEVEL_FEET ) SetAnimation( PLAYER_WALK ); } StudioFrameAdvance(); CheckPowerups( this ); UpdatePlayerSound(); pt_end: #if defined( CLIENT_WEAPONS ) // Decay timers on weapons // go through all of the weapons and make a list of the ones to pack for( int i = 0; i < MAX_WEAPON_SLOTS; i++ ) { if( m_rgpPlayerItems[ i ] ) { CBasePlayerWeapon *pPlayerItem = m_rgpPlayerItems[ i ]; while( pPlayerItem ) { if( pPlayerItem->IsPredicted() ) { pPlayerItem->m_flNextPrimaryAttack = max( pPlayerItem->m_flNextPrimaryAttack - gpGlobals->frametime, -1.0f ); pPlayerItem->m_flNextSecondaryAttack = max( pPlayerItem->m_flNextSecondaryAttack - gpGlobals->frametime, -0.001f ); if( pPlayerItem->m_flTimeWeaponIdle != 1000 ) { pPlayerItem->m_flTimeWeaponIdle = max( pPlayerItem->m_flTimeWeaponIdle - gpGlobals->frametime, -0.001f ); } if( pPlayerItem->pev->fuser1 != 1000 ) { pPlayerItem->pev->fuser1 = max( pPlayerItem->pev->fuser1 - gpGlobals->frametime, -0.001f ); } pPlayerItem->DecrementTimers( gpGlobals->frametime ); // Only decrement if not flagged as NO_DECREMENT // if ( gun->m_flPumpTime != 1000 ) // { // gun->m_flPumpTime = max( gun->m_flPumpTime - gpGlobals->frametime, -0.001 ); // } } pPlayerItem = pPlayerItem->m_pNext; } } } m_flNextAttack -= gpGlobals->frametime; if( m_flNextAttack < -0.001 ) m_flNextAttack = -0.001; if( m_flNextAmmoBurn != 1000 ) { m_flNextAmmoBurn -= gpGlobals->frametime; if( m_flNextAmmoBurn < -0.001 ) m_flNextAmmoBurn = -0.001; } if( m_flAmmoStartCharge != 1000 ) { m_flAmmoStartCharge -= gpGlobals->frametime; if( m_flAmmoStartCharge < -0.001 ) m_flAmmoStartCharge = -0.001; } #endif // Track button info so we can detect 'pressed' and 'released' buttons next frame m_afButtonLast = GetButtons().Get(); }