void CClientPathNode::DoPulse(void)
{
    list<CClientEntity*>::iterator iter = m_List.begin();
    for (; iter != m_List.end(); iter++)
    {
        // TEST!
        if ((*iter)->GetType() == CCLIENTVEHICLE)
        {
            CClientVehicle* pVehicle = static_cast<CClientVehicle*>(*iter);
            CVector         vecMoveSpeed;
            pVehicle->GetMoveSpeed(vecMoveSpeed);
            vecMoveSpeed.fZ = 0.0f;
            pVehicle->SetMoveSpeed(vecMoveSpeed);
        }
        (*iter)->SetPosition(m_vecPosition);
    }
}
///////////////////////////////////////////////////////////////
//
// 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;
            }
        }
    }
}
void CClientPacketRecorder::RecordLocalData(CClientPlayer* pLocalPlayer)
{
    if (m_bRecording && m_szFilename)
    {
        // Open our file
        FILE* pFile = fopen(m_szFilename, "ab+");
        if (pFile)
        {
            // Write our timestamp
            if (m_bFrameBased)
            {
                long lFrameStamp = m_lFrames - m_lRelative;
                fwrite(&lFrameStamp, sizeof(long), 1, pFile);
            }
            else
            {
                long lTimeStamp = CClientTime::GetTime() - m_lRelative;
                fwrite(&lTimeStamp, sizeof(long), 1, pFile);
            }
            //          fwrite ( &ulTimeStamp, sizeof ( unsigned long ), 1, pFile );

            // Write the packet ID
            fputc(0xFE, pFile);

            // Grab the vehicle
            CClientVehicle* pVehicle = pLocalPlayer->GetOccupiedVehicle();
            if (pVehicle)
            {
                // Read out the matrix, movespeed and turnspeed
                CMatrix matVehicle;
                CVector vecMoveSpeed;
                CVector vecTurnSpeed;
                pVehicle->GetMatrix(matVehicle);
                pVehicle->GetMoveSpeed(vecMoveSpeed);
                pVehicle->GetTurnSpeed(vecTurnSpeed);
                float fHealth = pVehicle->GetHealth();

                // Write it
                fwrite(&matVehicle.vRight.fX, sizeof(float), 1, pFile);
                fwrite(&matVehicle.vRight.fY, sizeof(float), 1, pFile);
                fwrite(&matVehicle.vRight.fZ, sizeof(float), 1, pFile);

                fwrite(&matVehicle.vFront.fX, sizeof(float), 1, pFile);
                fwrite(&matVehicle.vFront.fY, sizeof(float), 1, pFile);
                fwrite(&matVehicle.vFront.fZ, sizeof(float), 1, pFile);

                fwrite(&matVehicle.vUp.fX, sizeof(float), 1, pFile);
                fwrite(&matVehicle.vUp.fY, sizeof(float), 1, pFile);
                fwrite(&matVehicle.vUp.fZ, sizeof(float), 1, pFile);

                fwrite(&matVehicle.vPos.fX, sizeof(float), 1, pFile);
                fwrite(&matVehicle.vPos.fY, sizeof(float), 1, pFile);
                fwrite(&matVehicle.vPos.fZ, sizeof(float), 1, pFile);

                fwrite(&vecMoveSpeed.fX, sizeof(float), 1, pFile);
                fwrite(&vecMoveSpeed.fY, sizeof(float), 1, pFile);
                fwrite(&vecMoveSpeed.fZ, sizeof(float), 1, pFile);

                fwrite(&vecTurnSpeed.fX, sizeof(float), 1, pFile);
                fwrite(&vecTurnSpeed.fY, sizeof(float), 1, pFile);
                fwrite(&vecTurnSpeed.fZ, sizeof(float), 1, pFile);
                fwrite(&fHealth, sizeof(float), 1, pFile);

                // Write the controller state
                CControllerState cs;
                g_pGame->GetPad()->GetCurrentControllerState(&cs);
                fwrite(&cs, sizeof(CControllerState), 1, pFile);
            }

            // Close the file
            fclose(pFile);
        }
    }
}