void CClientPlayerManager::DoPulse ( void ) { unsigned long ulCurrentTime = CClientTime::GetTime (); CClientPlayer * pPlayer = NULL; vector < CClientPlayer* > ::const_iterator iter = m_Players.begin (); for ( ; iter != m_Players.end (); ++iter ) { pPlayer = *iter; if ( !pPlayer->IsLocalPlayer () ) { // Pulse voice data if voice is enabled if ( g_pClientGame->GetVoiceRecorder()->IsEnabled() && pPlayer->GetVoice() ) pPlayer->GetVoice()->DoPulse(); // Flag him with connection error if its been too long since last puresync and force his position unsigned long ulLastPuresyncTime = pPlayer->GetLastPuresyncTime (); bool bHasConnectionTrouble = ( ulLastPuresyncTime != 0 && ulCurrentTime >= ulLastPuresyncTime + REMOTE_PLAYER_CONNECTION_TROUBLE_TIME ); if ( bHasConnectionTrouble && !g_pClientGame->IsDownloadingBigPacket () && !pPlayer->IsDeadOnNetwork () ) { pPlayer->SetHasConnectionTrouble ( true ); // Reset his controller so he doesn't get stuck shooting or something CControllerState State; memset ( &State, 0, sizeof ( CControllerState ) ); pPlayer->SetControllerState ( State ); // Grab his vehicle if any and force the position to where he was last sync CClientVehicle* pVehicle = pPlayer->GetOccupiedVehicle (); if ( pVehicle ) { // Is he driving the vehicle? if ( pPlayer->GetOccupiedVehicleSeat () == 0 ) { // Force his position to where he was last sync pVehicle->SetPosition ( pPlayer->GetLastPuresyncPosition () ); pVehicle->SetMoveSpeed ( CVector ( 0, 0, 0 ) ); pVehicle->SetTurnSpeed ( CVector ( 0, 0, 0 ) ); pPlayer->ResetInterpolation (); } } else { // Force his position to where he was last sync pPlayer->SetPosition ( pPlayer->GetLastPuresyncPosition () ); pPlayer->ResetInterpolation (); pPlayer->SetMoveSpeed ( CVector ( 0, 0, 0 ) ); pPlayer->ResetInterpolation (); } } else { pPlayer->SetHasConnectionTrouble ( false ); } } } }
/////////////////////////////////////////////////////////////// // // CClientModelCacheManagerImpl::ProcessVehicleList // /////////////////////////////////////////////////////////////// void CClientModelCacheManagerImpl::ProcessVehicleList(std::map<ushort, float>& outNeedCacheList, const std::vector<CClientVehicle*>& vehicleList, float fMaxStreamDistanceSq) { const ulong ulTimeNow = CClientTime::GetTime(); for (std::vector<CClientVehicle*>::const_iterator iter = vehicleList.begin(); iter != vehicleList.end(); ++iter) { CClientVehicle* pVehicle = *iter; const ushort usModelId = pVehicle->GetModel(); if (usModelId < 400 || usModelId > 611) continue; // Check if currently within distance { // Check distance CVector vecPosition; pVehicle->GetPosition(vecPosition); float fDistSq = (m_vecCameraPos - vecPosition).LengthSquared(); if (fDistSq < fMaxStreamDistanceSq) { // Add model to needed list InsertIntoNeedCacheList(outNeedCacheList, usModelId, fDistSq); AddProcessStat("p", true, PURESYNC_TYPE_NONE, usModelId, vecPosition, vecPosition); continue; } } CClientPlayer* pDriver = DynamicCast<CClientPlayer>(pVehicle->GetControllingPlayer()); if (!pDriver) continue; // Check if will be within distance soon ePuresyncType syncType = pDriver->GetLastPuresyncType(); if (syncType == PURESYNC_TYPE_PURESYNC || syncType == PURESYNC_TYPE_LIGHTSYNC) { ulong ulSyncAge = ulTimeNow - pDriver->GetLastPuresyncTime(); if (ulSyncAge < 8000) { // Get velocity from somewhere CVector vecVelocity; if (syncType == PURESYNC_TYPE_LIGHTSYNC) vecVelocity = pDriver->GetLightsyncCalcedVelocity(); else { pVehicle->GetMoveSpeed(vecVelocity); vecVelocity *= m_fGameFps; } // Extrapolate position for 2 seconds time float fSecondsToAdd = std::min(6000UL, ulSyncAge + 2000) * 0.001f; CVector vecPosition; pVehicle->GetPosition(vecPosition); CVector vecNewPosition = vecPosition + vecVelocity * fSecondsToAdd; // Check distance float fDistSq = (m_vecCameraPos - vecNewPosition).LengthSquared(); if (fDistSq < fMaxStreamDistanceSq) { // Add model to needed list InsertIntoNeedCacheList(outNeedCacheList, usModelId, fDistSq); AddProcessStat("l", true, syncType, usModelId, vecPosition, vecNewPosition); continue; } AddProcessStat("n", false, syncType, usModelId, vecPosition, vecNewPosition); continue; } } } }