void CClientPedManager::RestreamPeds ( unsigned short usModel ) { // Store the affected vehicles CClientPed* pPed; std::vector < CClientPed* > ::const_iterator iter = IterBegin (); for ( ; iter != IterEnd (); iter++ ) { pPed = *iter; // Streamed in and same vehicle ID? if ( pPed->IsStreamedIn () && pPed->GetModel () == usModel ) { // Stream it out for a while until streamed decides to stream it // back in eventually pPed->StreamOutForABit (); // Hack fix for Players not unloading. if ( IS_PLAYER ( pPed ) ) { // Awesome hack skills + 1, change him to another model while we unload for the lulz // Translation: My hack level has increased to ninety eight and we need to wait a frame before reloading the model ID in question so that the custom model unloads properly. // To do this we set him to CJ (Impossible to mod to my knowledge) and then set him back in CPed::StreamedInPulse pPed->SetModel ( 0, true ); } } } }
/////////////////////////////////////////////////////////////// // // CClientModelCacheManagerImpl::ProcessPedList // /////////////////////////////////////////////////////////////// void CClientModelCacheManagerImpl::ProcessPedList(std::map<ushort, float>& outNeedCacheList, const std::vector<CClientPed*>& pedList, float fMaxStreamDistanceSq) { const ulong ulTimeNow = CClientTime::GetTime(); for (std::vector<CClientPed*>::const_iterator iter = pedList.begin(); iter != pedList.end(); ++iter) { CClientPed* pPed = *iter; const ushort usModelId = (ushort)pPed->GetModel(); if (usModelId < 7 || usModelId > 312) continue; // Check if currently within distance { // Check distance CVector vecPosition; pPed->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; } } // Check if will be within distance soon { // Extrapolate position for 2 seconds time ulong ulSyncAge = 0; if (ulSyncAge < 8000) { // Get velocity CVector vecVelocity; pPed->GetMoveSpeed(vecVelocity); vecVelocity *= m_fGameFps; // Extrapolate position for 2 seconds time float fSecondsToAdd = std::min(6000UL, ulSyncAge + 2000) * 0.001f; CVector vecPosition; pPed->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, PURESYNC_TYPE_NONE, usModelId, vecPosition, vecNewPosition); continue; } AddProcessStat("n", false, PURESYNC_TYPE_NONE, usModelId, vecPosition, vecNewPosition); continue; } } } }