Ejemplo n.º 1
0
void CBlipManager::AttachToVehicle(EntityId blipId, EntityId vehicleId) 
{
	if(m_bActive[blipId])
	{
		if(g_pVehicleManager->Exists(vehicleId)) 
		{
			CNetworkVehicle * pVehicle = g_pVehicleManager->Get(vehicleId);
			
			//Remove the position blip
			Scripting::RemoveBlip(m_Blips[blipId].uiBlipIndex);

			//And create one for the vehicle
			Scripting::AddBlipForCar(pVehicle->GetScriptingHandle(), &m_Blips[blipId].uiBlipIndex);

			// Set the blip sprite
			ChangeBlipSprite(m_Blips[blipId].uiBlipIndex, (Scripting::eBlipSprite)m_Blips[blipId].iSprite);

			// Set the blip color
			SetColor(blipId, m_Blips[blipId].uiColor);

			// Set the blip size
			SetSize(blipId, m_Blips[blipId].fSize);

			// Set short-range
			ToggleShortRange(blipId, m_Blips[blipId].bShortRange);

			// Set route
			ToggleRouteBlip(blipId, m_Blips[blipId].bRouteBlip);

			m_Blips[blipId].attachedVehicle = vehicleId;
		}
	}
}
Ejemplo n.º 2
0
void RespawnVehicle( RakNet::BitStream * pBitStream, RakNet::Packet * pPacket )
{
	// Read the vehicle id
	EntityId vehicleId;
	pBitStream->ReadCompressed( vehicleId );

	// Read the spawn position
	CVector3 vecPosition;
	pBitStream->Read( vecPosition );

	// Read teh spawn rotation
	CVector3 vecRotation;
	pBitStream->Read( vecRotation );

	// Get a pointer to the network vehicle
	CNetworkVehicle * pNetworkVehicle = pCore->GetVehicleManager()->Get( vehicleId );

	// Is the vehicle pointer valid?
	if( pNetworkVehicle )
	{
		// Set the spawn position
		pNetworkVehicle->SetSpawnPosition( CVector3( vecPosition.fX, vecPosition.fY, (vecPosition.fZ - 1.0f) ) );

		// Set the spawn rotation
		pNetworkVehicle->SetSpawnRotation( vecRotation );

		// Handle the respawn with the vehicle
		pNetworkVehicle->HandleRespawn();
	}
}
Ejemplo n.º 3
0
// getVehicleRotation(vehicleid)
SQInteger CVehicleNatives::GetRotation(SQVM * pVM)
{
    EntityId vehicleId;
    sq_getentity(pVM, -1, &vehicleId);

    if(g_pVehicleManager->Exists(vehicleId))
    {
        CNetworkVehicle * pVehicle = g_pVehicleManager->Get(vehicleId);

        if(pVehicle)
        {
            CVector3 vecRotation;
            pVehicle->GetRotation(vecRotation);
            CSquirrelArguments args;
            args.push(vecRotation.fX);
            args.push(vecRotation.fY);
            args.push(vecRotation.fZ);
            sq_pusharg(pVM, CSquirrelArgument(args, true));
            return 1;
        }
    }

    sq_pushbool(pVM, false);
    return 1;
}
Ejemplo n.º 4
0
// getVehicleOccupants(vehicleid)
SQInteger CVehicleNatives::GetOccupants(SQVM * pVM)
{
    EntityId vehicleId;
    sq_getentity(pVM, -1, &vehicleId);

    CNetworkVehicle * pVehicle = g_pClient->GetVehicleManager()->Get(vehicleId);

    if(pVehicle)
    {
        CSquirrelArguments args;

        for(BYTE i = 0; i < (MAX_VEHICLE_PASSENGERS + 1); i++)
        {
            args.push((int)(i + 1));
            CNetworkPlayer * pOccupant = pVehicle->GetOccupant(i);
            args.push(pOccupant ? (int)pOccupant->GetPlayerId() : (int)INVALID_ENTITY_ID);
        }

        sq_pusharg(pVM, CSquirrelArgument(args, false));
        return 1;
    }

    sq_pushbool(pVM, false);
    return 1;
}
void CVehicleManager::Pulse()
{
	std::list<CStreamableEntity *> * streamedVehicles = g_pClient->GetStreamer()->GetStreamedInEntitiesOfType(STREAM_ENTITY_VEHICLE);

	for(std::list<CStreamableEntity *>::iterator iter = streamedVehicles->begin(); iter != streamedVehicles->end(); ++iter)
	{
		CNetworkVehicle * pVehicle = reinterpret_cast<CNetworkVehicle *>(*iter);

		// Process the vehicle
		pVehicle->Pulse();
	}
}
Ejemplo n.º 6
0
void VehicleToMe(char * szParams)
{
	int vehicleId = 0;
	sscanf(szParams, "%d", &vehicleId);
	CNetworkVehicle * pVehicle = g_pClient->GetVehicleManager()->Get(vehicleId);

	if(pVehicle)
	{
		CVector3 vecPosition;
		g_pClient->GetLocalPlayer()->GetPosition(&vecPosition);
		pVehicle->GetGameVehicle()->SetPosition(&vecPosition);
		pVehicle->GetGameVehicle()->RemoveFromWorld();
		pVehicle->GetGameVehicle()->AddToWorld();
	}
}
Ejemplo n.º 7
0
// getVehicleLocked(vehicleid)
SQInteger CVehicleNatives::GetLocked(SQVM * pVM)
{
    EntityId vehicleId;
    sq_getentity(pVM, -1, &vehicleId);

    CNetworkVehicle * pVehicle = g_pVehicleManager->Get(vehicleId);

    if(pVehicle)
    {
        sq_pushinteger(pVM, pVehicle->GetDoorLockState());
        return 1;
    }

    sq_pushbool(pVM, false);
    return 1;
}
Ejemplo n.º 8
0
// isVehicleOccupied(vehicleid)
SQInteger CVehicleNatives::IsOccupied(SQVM * pVM)
{
    EntityId vehicleId;
    sq_getentity(pVM, -1, &vehicleId);

    CNetworkVehicle * pVehicle = g_pClient->GetVehicleManager()->Get(vehicleId);

    if(pVehicle)
    {
        sq_pushbool(pVM, pVehicle->IsOccupied());
        return 1;
    }

    sq_pushbool(pVM, false);
    return 1;
}
Ejemplo n.º 9
0
void UnoccupiedVehicleSync( RakNet::BitStream * pBitStream, RakNet::Packet * pPacket )
{
	// Read the vehicle id
	EntityId vehicleId;
	pBitStream->ReadCompressed( vehicleId );

	// Get a pointer to the network vehicle
	CNetworkVehicle * pNetworkVehicle = pCore->GetVehicleManager()->Get( vehicleId );

	// Is the vehicle pointer valid?
	if( pNetworkVehicle )
	{
		// Process the unoccupied sync with this vehicle
		pNetworkVehicle->ProcessUnoccupiedSync( pBitStream );
	}
}
Ejemplo n.º 10
0
// getVehicleDirtLevel(vehicleid)
SQInteger CVehicleNatives::GetDirtLevel(SQVM * pVM)
{
    EntityId vehicleId;
    sq_getentity(pVM, -1, &vehicleId);

    CNetworkVehicle * pVehicle = g_pVehicleManager->Get(vehicleId);

    if(pVehicle)
    {
        sq_pushfloat(pVM, pVehicle->GetDirtLevel());
        return 1;
    }

    sq_pushbool(pVM, false);
    return 1;
}
Ejemplo n.º 11
0
// getVehicleModel(vehicleid)
SQInteger CVehicleNatives::GetModel(SQVM * pVM)
{
    EntityId vehicleId;
    sq_getentity(pVM, -1, &vehicleId);

    CNetworkVehicle * pVehicle = g_pClient->GetVehicleManager()->Get(vehicleId);

    if(pVehicle)
    {
        sq_pushinteger(pVM, g_pClient->GetModelManager()->ModelHashToVehicleId(pVehicle->GetModelInfo()->GetHash()));
        return 1;
    }

    sq_pushbool(pVM, false);
    return 1;
}
Ejemplo n.º 12
0
// getVehicleEngineHealth(vehicleid)
SQInteger CVehicleNatives::GetEngineHealth(SQVM * pVM)
{
    EntityId vehicleId;
    sq_getentity(pVM, -1, &vehicleId);

    CNetworkVehicle * pVehicle = g_pClient->GetVehicleManager()->Get(vehicleId);

    if(pVehicle)
    {
        CLogFile::Printf("Function getVehicleEngineHealth is depreciated: please use getVehicleHealth.");
        sq_pushfloat(pVM, (float)pVehicle->GetHealth());
        return 1;
    }

    sq_pushbool(pVM, false);
    return 1;
}
Ejemplo n.º 13
0
// getVehicleAngularVelocity(vehicleid)
SQInteger CVehicleNatives::GetAngularVelocity(SQVM * pVM)
{
    EntityId vehicleId;
    sq_getentity(pVM, -1, &vehicleId);

    CNetworkVehicle * pVehicle = g_pClient->GetVehicleManager()->Get(vehicleId);

    if(pVehicle)
    {
        CVector3 vecTurnSpeed;
        pVehicle->GetTurnSpeed(vecTurnSpeed);
        CSquirrelArguments args;
        args.push(vecTurnSpeed.fX);
        args.push(vecTurnSpeed.fY);
        args.push(vecTurnSpeed.fZ);
        sq_pusharg(pVM, CSquirrelArgument(args, true));
        return 1;
    }

    sq_pushbool(pVM, false);
    return 1;
}
Ejemplo n.º 14
0
// getVehicleCoordinates(vehicleid)
SQInteger CVehicleNatives::GetCoordinates(SQVM * pVM)
{
    EntityId vehicleId;
    sq_getentity(pVM, -1, &vehicleId);

    CNetworkVehicle * pVehicle = g_pClient->GetVehicleManager()->Get(vehicleId);

    if(pVehicle)
    {
        CVector3 vecPosition;
        pVehicle->GetPosition(vecPosition);
        CSquirrelArguments args;
        args.push(vecPosition.fX);
        args.push(vecPosition.fY);
        args.push(vecPosition.fZ);
        sq_pusharg(pVM, CSquirrelArgument(args, true));
        return 1;
    }

    sq_pushbool(pVM, false);
    return 1;
}
Ejemplo n.º 15
0
void SavePosCommand(char * szParams)
{
	FILE * file = fopen(SharedUtility::GetAbsolutePath("SavedData.txt"), "a");
	if(!file)
	{
		g_pClient->GetChatWindow()->AddInfoMessage("Failed to open 'SavedData.txt'");
		return;
	}

	CVector3 vecPosition;

	// Get our local player
	CLocalPlayer * pLocalPlayer = g_pClient->GetLocalPlayer();

	if(pLocalPlayer->IsInVehicle())
	{
		CNetworkVehicle * pVehicle = pLocalPlayer->GetVehicle();

		if(pVehicle)
		{
			pVehicle->GetPosition(vecPosition);
			CVector3 vecRotation;
			pVehicle->GetRotation(vecRotation);
			BYTE byteColors[4];
			pVehicle->GetColors(byteColors[0], byteColors[1], byteColors[2], byteColors[3]);
			fprintf(file, "createVehicle(%d, %f, %f, %f, %f, %f, %f, %d, %d, %d, %d);%s%s\n", g_pClient->GetModelManager()->ModelHashToVehicleId(pVehicle->GetModelInfo()->GetHash()), vecPosition.fX, vecPosition.fY, vecPosition.fZ, vecRotation.fX, vecRotation.fY, vecRotation.fZ, byteColors[0], byteColors[1], byteColors[2], byteColors[3], szParams ? " // " : "", szParams ? szParams : "");
		}
	}
	else
	{
		pLocalPlayer->GetPosition(vecPosition);
		int iModelId = ModelHashToSkinId(pLocalPlayer->GetModelInfo()->GetHash());
		fprintf(file, "PlayerData(%d, %f, %f, %f, %f(%f));%s%s\n", iModelId, vecPosition.fX, vecPosition.fY, vecPosition.fZ, pLocalPlayer->GetCurrentHeading(), pLocalPlayer->GetDesiredHeading(),szParams ? " // " : "", szParams ? szParams : "");
	}

	fclose(file);
	g_pClient->GetChatWindow()->AddInfoMessage("Position data saved to 'SavedData.txt'");
}
Ejemplo n.º 16
0
// getVehicleColor(vehicleid)
SQInteger CVehicleNatives::GetColor(SQVM * pVM)
{
    EntityId vehicleId;
    sq_getentity(pVM, -1, &vehicleId);

    CNetworkVehicle * pVehicle = g_pClient->GetVehicleManager()->Get(vehicleId);

    if(pVehicle)
    {
        BYTE byteColors[4];
        pVehicle->GetColors(byteColors[0], byteColors[1], byteColors[2], byteColors[3]);
        CSquirrelArguments args;
        args.push((int)byteColors[0]);
        args.push((int)byteColors[1]);
        args.push((int)byteColors[2]);
        args.push((int)byteColors[3]);
        sq_pusharg(pVM, CSquirrelArgument(args, true));
        return 1;
    }

    sq_pushbool(pVM, false);
    return 1;
}
Ejemplo n.º 17
0
void SpawnVehicle( RakNet::BitStream * pBitStream, RakNet::Packet * pPacket )
{
	// Read the vehicle id
	EntityId vehicleId;
	pBitStream->ReadCompressed( vehicleId );

	// Read the spawn position
	CVector3 vecPosition;
	pBitStream->Read( vecPosition );

	// Read teh spawn rotation
	CVector3 vecRotation;
	pBitStream->Read( vecRotation );

	// Get a pointer to the network vehicle
	CNetworkVehicle * pNetworkVehicle = pCore->GetVehicleManager()->Get( vehicleId );

	// Is the vehicle pointer valid?
	if( pNetworkVehicle )
	{
		// Is the vehicle not already spawned?
		if( !pNetworkVehicle->IsSpawned() )
		{
			// Set the spawn position
			pNetworkVehicle->SetSpawnPosition( vecPosition );

			// Set the spawn rotation
			pNetworkVehicle->SetSpawnRotation( vecRotation );

			// Create the vehicle
			pNetworkVehicle->Create();

			// Read the occupant count
			int iTotalOccupants;
			pBitStream->Read( iTotalOccupants );

#ifdef DEBUG
			CLogFile::Printf( "(SpawnVehicle) Total occupants: %d", iTotalOccupants );
#endif

			// Loop over the total occupants
			EntityId occupantId = INVALID_ENTITY_ID;
			int iSeat = 0;
			CRemotePlayer * pOccupant = NULL;
			for( int i = 0; i < iTotalOccupants; i++ )
			{
				// Read the current occupant id
				pBitStream->ReadCompressed( occupantId );

				// Read the current occupant seat
				pBitStream->Read( iSeat );

#ifdef DEBUG
				CLogFile::Printf( "SpawnVehicle - Read occupant %d in seat %d.", occupantId, iSeat );
#endif

				// Is the read data valid?
				if( occupantId != INVALID_ENTITY_ID )
				{
					// Get a pointer to the current occupant
					pOccupant = pCore->GetPlayerManager()->Get( occupantId );

					// Is the pointer valid?
					if( pOccupant )
					{
						// Set the occupant vehicle
						pOccupant->SetVehicle( pNetworkVehicle );

						// Set the occupant seat
						pOccupant->SetSeat( (iSeat + 1) );

						// Set the vehicle passenger
						pNetworkVehicle->SetOccupant( iSeat, pOccupant );

#ifdef DEBUG
						CLogFile::Printf( "Put occupant %d into vehicle %d (%d)", occupantId, pNetworkVehicle->GetId(), (iSeat + 1) );
#endif
					}
				}
			}

#ifdef DEBUG
			CLogFile::Print ( "SpawnVehicle RPC done!" );
#endif
		}
	}
}
Ejemplo n.º 18
0
void CLocalPlayer::SendInVehicleSync( void )
{
	// Are we not connected to the network?
	if( !pCore->GetNetworkModule()->IsConnected() )
		return;

	// Are we dead?
	if( IsDead() )
		return;

	// Get the vehicle instance
	CNetworkVehicle * pVehicle = pCore->GetVehicleManager()->GetFromGameGUID( GetPlayerPed()->GetCurrentVehicle()->m_dwGUID );

	// Did we fail to find the vehicle?
	if( !pVehicle )
		return;

	// Construct a new bitstream
	RakNet::BitStream pBitStream;

	// Write the vehicle id
	pBitStream.WriteCompressed( pVehicle->GetId() );

	// Construct a new in vehicle sync data structure
	InVehicleSync inVehicleSync;

	// Get the vehicle position
	pVehicle->GetPosition( &inVehicleSync.m_vecPosition );

	// Get the vehicle rotation
	pVehicle->GetRotation( &inVehicleSync.m_vecRotation );

	// Get the vehicle dirt level
	inVehicleSync.m_fDirtLevel = pVehicle->GetVehicle()->GetDirtLevel();

	// Get the vehicle tuning table
	inVehicleSync.m_iTuningTable = pVehicle->GetVehicle()->GetTuningTable();

	// Get the vehicle horn state
	inVehicleSync.m_bHornState = pVehicle->GetVehicle()->IsHornOn();

	// Get the vehicle siren state
	inVehicleSync.m_bSirenState = pVehicle->GetVehicle()->IsSirenOn();

	// Get the vehicle fuel
	inVehicleSync.m_fFuel = pVehicle->GetVehicle()->GetFuel();

	// Get the vehicle speed
	pVehicle->GetSpeedVec( &inVehicleSync.m_vecVelocity );

	// Get the turn speed
	inVehicleSync.m_fTurnSpeed = pVehicle->GetSteer();

	// Get the engine damage
	inVehicleSync.m_fEngineDamage = pVehicle->GetVehicle()->GetEngineDamage();

	// Get the vehicle plate text
	strcpy( inVehicleSync.m_szPlateText, pVehicle->GetPlateText() );
	inVehicleSync.m_szPlateText[ 6 ] = '\0';

	// Get the vehicle colour
	pVehicle->GetColour( &inVehicleSync.m_primaryColour, &inVehicleSync.m_secondaryColour );

	// Get the power state
	inVehicleSync.m_bPower = pVehicle->GetVehicle()->GetPower();

	// Get the brake state
	inVehicleSync.m_bBrake = pVehicle->GetVehicle()->GetBrake();

	// Get the vehicle wheel models (DISABLED FOR TESTING)
	for ( int i = 0; i < 3; i++ )
		inVehicleSync.m_bWheelModels[ i ] = 0xFF; //Game::GetIdFromVehicleWheelModel ( pVehicle->GetVehicle()->GetWheelTexture ( i ) );

	// Get the handbrake state
	inVehicleSync.m_bHandbrake = pVehicle->GetVehicle()->IsHandbrakeOn ();

	// Get the light state
	inVehicleSync.m_bLightState = pVehicle->GetVehicle()->GetLightState ();

	// Write the sync structure into the bitstream
	pBitStream.Write( (char *)&inVehicleSync, sizeof(InVehicleSync) );

	// Send the bitstream to the server
	pCore->GetNetworkModule()->Call( RPC_VEHICLE_SYNC, &pBitStream, LOW_PRIORITY, UNRELIABLE_SEQUENCED, true );
}
Ejemplo n.º 19
0
// Direct3DDevice9::EndScene
void Direct3DRender()
{
	// Check for pause menu
	if(g_pNetworkManager)
	{
		if(CGame::IsMenuActive() && CGame::GetState() == GAME_STATE_INGAME && g_pNetworkManager->IsConnected())
			CGame::SetState(GAME_STATE_PAUSE_MENU);
		else if(!CGame::IsMenuActive() && CGame::GetState() == GAME_STATE_PAUSE_MENU && g_pNetworkManager->IsConnected())
			CGame::SetState(GAME_STATE_INGAME);
	}
	// Are we in the main menu?
	if(CGame::GetState() == GAME_STATE_MAIN_MENU || CGame::GetState() == GAME_STATE_LOADING)
	{
		// Is the main menu shown?
		if(CGame::IsMenuActive())
		{
			// Clear the screen
			g_pDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 0, 0, 0), 1.0, 0);
		}
	}
	if(g_pMainMenu && CGame::GetState() == GAME_STATE_MAIN_MENU || CGame::GetState() == GAME_STATE_IVMP_PAUSE_MENU)
	{
		if(!g_pMainMenu->IsVisible())
		{
			if(g_pNetworkManager && g_pNetworkManager->IsConnected())
			{
				g_pMainMenu->SetDisconnectButtonVisible(true);
				g_pMainMenu->SetVisible(true);
			}
			else
			{
				g_pMainMenu->SetDisconnectButtonVisible(false);
				g_pMainMenu->SetVisible(true);
			}
		}
	}
	else
	{
		if(g_pMainMenu->IsVisible())
			g_pMainMenu->SetVisible(false);
	}

	if(g_pClientScriptManager && g_pClientScriptManager->GetGUIManager())
	{
		if(CGame::GetState() != GAME_STATE_INGAME)
		{
			if(!g_pClientScriptManager->GetGUIManager()->IsHidden())
				g_pClientScriptManager->GetGUIManager()->Hide();
		}
		else
		{
			if(g_pClientScriptManager->GetGUIManager()->IsHidden())
				g_pClientScriptManager->GetGUIManager()->Show();
		}
	}

	// If our GUI class exists render it
	if(g_pGUI)
		g_pGUI->Render();

	// If our WebKit class exists render it
	/*	
	#ifdef IVMP_WEBKIT
		if(g_pWebkit)
		{
			g_pWebkit->RenderAll();
		}
	#endif
	*/
	// If our main menu exists process it
	if(g_pMainMenu)
		g_pMainMenu->Process();

	// if our chat exist draw it
	if(g_pChatWindow && !CGame::IsMenuActive())
		g_pChatWindow->Draw();

	// If our fps class exists update it
	if(g_pFPSCounter)
		g_pFPSCounter->Pulse();

	// If our credits class exists process it
	if(g_pCredits)
		g_pCredits->Process();

	// If our scripting manager exists, call the frame event
	if(g_pEvents && !g_pMainMenu->IsVisible())
		g_pEvents->Call("frameRender");

	// Check if our screen shot write failed
	if(CScreenShot::IsDone())
	{
		if(CScreenShot::HasSucceeded())
			g_pChatWindow->AddInfoMessage("Screen shot written (%s).", CScreenShot::GetWriteName().Get());
		else
			g_pChatWindow->AddInfoMessage("Screen shot write failed (%s).", CScreenShot::GetError().Get());

		CScreenShot::Reset();
	}
	
	// Moving Camera for main menu, problem: g_pCamera->SetLookAt() cause an crash at change
	/*if(g_pNetworkManager && g_pCamera)
	{
		if(!g_pNetworkManager->IsConnected() && CGame::IsGameLoaded())
		{
			if(g_iCameraTime > 500)
			{
				if(g_iCameraState == 1)
					g_iCameraState = 2;
				else if(g_iCameraState == 2)
					g_iCameraState = 3;
				else if(g_iCameraState == 3)
					g_iCameraState = 1;

				g_iCameraTime = 0;

				if(g_iCameraState == 1)
				{
					g_pCamera->SetPosition(CVector3(HAPPINESS_CAMERA_POS));
					//g_pCamera->SetLookAt(CVector3(HAPPINESS_CAMERA_LOOK_AT));
				}
				if(g_iCameraState == 2)
				{
					g_pCamera->SetPosition(CVector3(TRIANGLE_CAMERA_POS));
					//g_pCamera->SetLookAt(CVector3(TRIANGLE_CAMERA_LOOK_AT));
				}
				if(g_iCameraState == 3)
				{
					g_pCamera->SetPosition(CVector3(TRIANGLE_CAMERA_POS_OLD));
					//g_pCamera->SetLookAt(CVector3(TRIANGLE_CAMERA_LOOK_AT_OLD));
				}
			}
			else
			{
				g_iCameraTime++;

				CVector3 vecPosition;
				g_pCamera->GetPosition(vecPosition);

				vecPosition.fX += 0.1f;
				vecPosition.fY += 0.1f;

				g_pCamera->SetPosition(vecPosition);
			}
		}
	}
	if(g_pNetworkManager)
	{
		if(!g_pNetworkManager->IsConnected() && CGame::IsGameLoaded())
		{
			if(CGame::GetState() == (eState)3)
				CGame::SetState(GAME_STATE_IVMP_PAUSE_MENU);

			if(!g_pMainMenu->IsVisible() && !CGame::IsMenuActive())
				CGame::SetState(GAME_STATE_IVMP_PAUSE_MENU);
		}
	}*/

	// Are we in game?
	if(CGame::GetState() == GAME_STATE_INGAME)
	{
		// Is F4 held down and do we have a network manager?
		if(GetAsyncKeyState(VK_F4) && g_pNetworkManager)
		{
			// Get the network statistics
			CNetStats * pNetStats = g_pNetworkManager->GetNetClient()->GetNetStats();

			// Convert the network statistics to a string
			char szNetworkStats[10000];
			pNetStats->ToString(szNetworkStats, 2);

			// Create the statistics string
			String strStats(szNetworkStats);

			// Append loaded and unloaded model counts to the stats
			// jenksta: too performance heavy to be done every frame
			//strStats.AppendF("Models (Loaded/Unload): %d/%d\n", CGame::GetLoadedModelCount(), CGame::GetUnloadedModelCount());

			// Append streamed in/out entity counts and streamed in limits to the stats
			strStats.AppendF("Vehicles (StreamedIn/StreamedInLimit): %d/%d\n", g_pStreamer->GetStreamedInEntityCountOfType(STREAM_ENTITY_VEHICLE), g_pStreamer->GetStreamedInLimitOfType(STREAM_ENTITY_VEHICLE));
			strStats.AppendF("Pickups (StreamedIn/StreamedInLimit): %d/%d\n", g_pStreamer->GetStreamedInEntityCountOfType(STREAM_ENTITY_PICKUP), g_pStreamer->GetStreamedInLimitOfType(STREAM_ENTITY_PICKUP));
			strStats.AppendF("Objects (StreamedIn/StreamedInLimit): %d/%d\n", g_pStreamer->GetStreamedInEntityCountOfType(STREAM_ENTITY_OBJECT), g_pStreamer->GetStreamedInLimitOfType(STREAM_ENTITY_OBJECT));
			strStats.AppendF("Checkpoints (StreamedIn/StreamedInLimit): %d/%d\n", g_pStreamer->GetStreamedInEntityCountOfType(STREAM_ENTITY_CHECKPOINT), g_pStreamer->GetStreamedInLimitOfType(STREAM_ENTITY_CHECKPOINT));

			// Draw the string
			g_pGUI->DrawText(strStats, CEGUI::Vector2(26, 30), (CEGUI::colour)D3DCOLOR_RGBA(255, 255, 255, 255), g_pGUI->GetFont("tahoma-bold", 10));
			g_pChatWindow->SetEnabled(false);
			g_bNetworkStatsDisplayed = true;
		}
		else
		{
			// If our network stats were displayed
			if(g_bNetworkStatsDisplayed) {
				if(g_pChatWindow && !g_pChatWindow->IsEnabled())
					g_pChatWindow->SetEnabled(true);
				
				g_bNetworkStatsDisplayed = false;
			}

			// If our input window exists draw it
			if(g_pInputWindow)
				g_pInputWindow->Draw();
		}

		// Update the time
		if(g_pTime)
		{
			// jenksta: Setting this every frame causes the weather to change
			// rapidly
			unsigned char ucHour = 0, ucMinute = 0;
			g_pTime->GetTime(&ucHour, &ucMinute);
			CGame::SetTime(ucHour, ucMinute);
			CGame::SetDayOfWeek(g_pTime->GetDayOfWeek());
		}
		/* Vehicle Headlights testcode
			IVVehicle * pGameVehicle = pVehicle->GetGameVehicle()->GetVehicle();
			//*(BYTE *)(pVehicle->GetGameVehicle()->GetVehicle() + 0xF71) |= 1;
			*((BYTE *)pGameVehicle + 3953) = *((BYTE *)pGameVehicle + 3953) & 0xFE | 2;
				
		}

		 CViewportManager + 0x00 = sysArray (CViewport *)
		 CViewport + 0x53C = Viewport ID
		 GET_VIEWPORT_POS_AND_SIZE(unsigned int uiViewportId, float * fPosX, float * fPosY, float * fSizeX, float * fSizeY)
		 (pViewport + 0x10) is always used
		 ((pViewport + 0x10) + 0x298) = float fPosX;
		 (((pViewport + 0x10) + 0x298) + 0x4) = float fPosY;
		 (((pViewport + 0x10) + 0x298) + 0x8) = float fSizeX;
		 (((pViewport + 0x10) + 0x298) + 0xC) = float fSizeY;
		 GET_VIEWPORT_POSITION_OF_COORD(float fCoordX, float fCoordY, float fCoordZ, unsigned int uiViewportId, float * fPosX, float * fPosY)
		 Viewport 1 = CViewportPrimaryOrtho
		 Viewport 2 = CViewportGame
		 Viewport 3 = CViewportRadar
		*/
		if(g_pLocalPlayer)
		{
			if(g_pLocalPlayer->GetVehicleInfos())
			{
				if(g_pVehicleManager)
				{
					CVector3 vecWorldPosition;
					Vector2 vecScreenPosition;

					for(EntityId i = 0; i < MAX_VEHICLES; i++)
					{
						if(g_pVehicleManager->Exists(i))
						{
							CNetworkVehicle * pVehicle = g_pVehicleManager->Get(i);

							if(!pVehicle->IsStreamedIn())
								continue;

							if(!pVehicle->IsOnScreen())
								continue;
					
							pVehicle->GetPosition(vecWorldPosition); 
							CGame::GetScreenPositionFromWorldPosition(vecWorldPosition, vecScreenPosition);

							//if(g_pGraphics)
							//{
							//	CVector3 vecScreen;
							//	g_pGraphics->GetScreenPositionFromWorldPosition(vecWorldPosition, &vecScreen);
						
							//	if( vecScreen.fZ < 0 )
							//		return;
							//}
							//else
							//	return;
							
							int health = pVehicle->GetHealth();
							int model = pVehicle->GetEngineState();
							float petrol = pVehicle->GetPetrolTankHealth();
							CVector3 vecPos; pVehicle->GetPosition(vecPos);
							CVector3 vecRot; pVehicle->GetRotation(vecRot);
							g_pGUI->DrawText(String("VehicleId %d, Enginestate: %d, Health: %d, PetrolTankHealth: %f\nPosition(%.3f,%.3f,%.3f), Rot(%.3f,%.3f,%.3f)", i, model, health, petrol, vecPos.fX,vecPos.fY,vecPos.fZ,vecRot.fX,vecRot.fY,vecRot.fZ), CEGUI::Vector2(vecScreenPosition.X, vecScreenPosition.Y));
						}
					}
				}
			}
		}
		if(g_pNameTags)
			g_pNameTags->Draw();
	}
}
Ejemplo n.º 20
0
// (John) TODO: Only SAFE_DELETE and re-instantiate things that really need it, otherwise give them a Reset() method.
void CClient::InternalResetGame(bool bAutoConnect)
{
	CLogFile::Printf("Initializing game for multiplayer activities");

	// Remove local player from vehicle
	if(m_pLocalPlayer)
		m_pLocalPlayer->RemoveFromVehicle();

	// Remove all current GUIs
	// CClientScriptManager destructor will take care of this
	//m_pClientScriptManager->RemoveAll();
	//m_pClientScriptManager->GetGUIManager()->DeleteAll();

	SAFE_DELETE(m_pClientScriptManager);
	m_pClientScriptManager = new CClientScriptManager();
	m_pEvents->clear();
	m_pGUI->SetScriptedCursorVisible(false);
	CLogFile::Printf("Reset clientside scripting stuff");

	SAFE_DELETE(m_pModelManager);
	m_pModelManager = new CModelManager();
	CLogFile::Printf("Created model manager instance");

	SAFE_DELETE(m_pPickupManager);
	m_pPickupManager = new CPickupManager();
	CLogFile::Printf("Created pickup manager instance");

	SAFE_DELETE(m_pCheckpointManager);
	m_pCheckpointManager = new CCheckpointManager();
	CLogFile::Printf("Created checkpoint manager instance");

	SAFE_DELETE(m_pBlipManager);
	m_pBlipManager = new CBlipManager();
	CLogFile::Printf("Created blip manager instance");

	SAFE_DELETE(m_pObjectManager);
	m_pObjectManager = new CObjectManager();
	CLogFile::Printf("Created object manager instance");

	SAFE_DELETE(m_pFireManager);
	m_pFireManager = new CFireManager();
	CLogFile::Printf("Created fire manager instance");

	SAFE_DELETE(m_p3DLabelManager);
	m_p3DLabelManager = new C3DLabelManager();
	CLogFile::Printf("Created 3d label manager instance");

	// Set all vehicles to destroyable
	if(m_pVehicleManager)
	{
		for(EntityId i = 0; i < MAX_PLAYERS; i++)
		{
			CNetworkVehicle * pVehicle = m_pVehicleManager->Get(i);

			if(pVehicle)
				pVehicle->MarkAsActorVehicle(false);
		}
	}

	SAFE_DELETE(m_pVehicleManager);
	m_pVehicleManager = new CVehicleManager();
	CLogFile::Printf("Created vehicle manager instance");

	SAFE_DELETE(m_pActorManager);
	m_pActorManager = new CActorManager();
	CLogFile::Printf("Created actor manager instance");

	// Reset the streamer
	m_pStreamer->Reset();
	CLogFile::Printf("Reset streamer instance");

	if(!m_pLocalPlayer)
	{
		m_pLocalPlayer = new CLocalPlayer();
		CLogFile::Printf("Created local player instance");
	}

	m_pLocalPlayer->Reset();
	m_pLocalPlayer->SetPlayerId(INVALID_ENTITY_ID);
	m_pLocalPlayer->SetModel(Scripting::MODEL_PLAYER);
	m_pLocalPlayer->Teleport(CVector3());
	m_pLocalPlayer->SetPlayerControlAdvanced(false, false);
	m_pLocalPlayer->RemoveAllWeapons();
	m_pLocalPlayer->ResetMoney();
	m_pLocalPlayer->SetHealth(200);
	m_pLocalPlayer->SetControl(true);
	CLogFile::Printf("Reset local player instance");

	SAFE_DELETE(m_pPlayerManager);
	m_pPlayerManager = new CPlayerManager();
	CLogFile::Printf("Created player manager instance");


	// Create network manager if it doesn't exist
	if(!m_pNetworkManager)
	{
		m_pNetworkManager = new CNetworkManager();
		m_pNetworkManager->Startup(GetHost(), GetPort(), GetPassword());
		CLogFile::Printf("Created network manager instance");
	}
	else
	{
		// Reset network manager
		m_pNetworkManager->Reset();
		CLogFile::Printf("Reset network manager instance");
	}

	// Clear our file transfer list
	m_pFileTransfer->Clear(true);

	// Reset game world
	m_pTime->SetDayOfWeek(2);
	m_pTime->SetMinuteDuration(0);
	m_pTrafficLights->Reset();
	m_pNameTags->SetEnabled(true);
	CGame::SetWantedLevel(0);
	CGame::SetHudVisible(false);
	CGame::SetRadarVisible(false);
	CGame::SetAreaNamesEnabled(false);
	CGame::ResetScrollBars();
	CGame::SetScrollBarColor();
	CGame::ToggleLazlowStation(true);

	//
	Scripting::SetScenarioPedDensityMultiplier(0, 0);
	Scripting::SetPedDensityMultiplier(0);
	Scripting::SetParkedCarDensityMultiplier(0);
	Scripting::SetRandomCarDensityMultiplier(0);

	// Set the time and weather after the camera set, one of the camera stuff changes the time and the weather
	CGame::GetWeather()->SetWeather(WEATHER_SUNNY);
	m_pTime->SetTime(0, 0);
	CGame::SetTime(0, 0);
	// SetCanBurstCarTyres(bool canburst);
	Scripting::SetMaxWantedLevel(0);
	Scripting::SetCreateRandomCops(false);
	// Test if this is needed (Script is unloaded, so it shouldn't be)
	Scripting::AllowStuntJumpsToTrigger(false);
	CLogFile::Printf("Reset world");

	// Destroy the camera and create it again
	SAFE_DELETE(m_pCamera);
	m_pCamera = new CCamera();

	// Mark the game as loaded.
	if(!m_bGameLoaded)
		m_bGameLoaded = true;

	CGame::SetGameLoaded(m_bGameLoaded);

	// Reset the network stats
	m_pMainMenu->ResetNetworkStats();

	// Auto-connect if needed, otherwise show the main menu.
	if(m_pNetworkManager && bAutoConnect)
		m_pNetworkManager->Connect();
	else
		m_pMainMenu->SetVisible(true);

	CLogFile::Printf("Sucessfully (re)initialized game for multiplayer activities");
}
Ejemplo n.º 21
0
void CClient::OnD3DEndScene()
{
	// Check for pause menu
	if(m_pNetworkManager)
	{
		if(CGame::IsMenuActive() && CGame::GetState() == GAME_STATE_INGAME && m_pNetworkManager->IsConnected())
			CGame::SetState(GAME_STATE_PAUSE_MENU);
		else if(!CGame::IsMenuActive() && CGame::GetState() == GAME_STATE_PAUSE_MENU && m_pNetworkManager->IsConnected())
			CGame::SetState(GAME_STATE_INGAME);
	}
	// Are we in the main menu?
	if(CGame::GetState() == GAME_STATE_MAIN_MENU || CGame::GetState() == GAME_STATE_LOADING)
	{
		// Is the main menu shown?
		if(CGame::IsMenuActive())
		{
			// Clear the screen
			m_pDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 0, 0, 0), 1.0, 0);
		}
	}
	if(m_pMainMenu && CGame::GetState() == GAME_STATE_MAIN_MENU || CGame::GetState() == GAME_STATE_IVMP_PAUSE_MENU)
	{
		if(!m_pMainMenu->IsVisible())
		{
			if(m_pNetworkManager && m_pNetworkManager->IsConnected())
			{
				m_pMainMenu->SetDisconnectButtonVisible(true);
				m_pMainMenu->SetVisible(true);
			}
			else
			{
				m_pMainMenu->SetDisconnectButtonVisible(false);
				m_pMainMenu->SetVisible(true);
			}

			if(CGame::GetState() == GAME_STATE_MAIN_MENU)
			{
				String strPostPath("/getlatestversion.php");
				m_pHttpClient->Get(strPostPath);

				if(strcmp(m_strConnectHost,"0.0.0.0"))
				{
					// Send connect event
					m_pMainMenu->OnDirectConnect(m_strConnectHost,m_usConnectPort);

					// Remove current connect entries from xml file
					CVAR_SET_STRING("currentconnect_server","0.0.0.0");
					CVAR_SET_INTEGER("currentconnect_port",9999);
				}
			}
		}
	}
	else
	{
		if(m_pMainMenu->IsVisible())
		{
			m_pMainMenu->SetVisible(false);
			m_pChatWindow->SetEnabled(true);
		}
	}

	if(m_pClientScriptManager && m_pClientScriptManager->GetGUIManager())
	{
		if(CGame::GetState() != GAME_STATE_INGAME)
		{
			if(!m_pClientScriptManager->GetGUIManager()->IsHidden())
				m_pClientScriptManager->GetGUIManager()->Hide();
		}
		else
		{
			if(m_pClientScriptManager->GetGUIManager()->IsHidden())
				m_pClientScriptManager->GetGUIManager()->Show();
		}
	}

	// If our GUI class exists render it
	if(m_pGUI)
		m_pGUI->Render();

	// If our main menu exists process it
	if(m_pMainMenu)
		m_pMainMenu->Process();

	// If our chat window exist draw it
	if(m_pChatWindow && !CGame::IsMenuActive())
		m_pChatWindow->Draw();

	// If our fps class exists update it
	if(m_pFPSCounter)
		m_pFPSCounter->Pulse();

	// If our credits class exists process it
	if(m_pCredits)
		m_pCredits->Process();

	if(m_p3DLabelManager)
		m_p3DLabelManager->Render();

	// If our scripting manager exists, call the frame event
	if(m_pEvents && !m_pMainMenu->IsVisible())
		m_pEvents->Call("frameRender");

#ifdef IVMP_DEBUG
	if(m_pDebugView && m_pGUI && m_pLocalPlayer)
		m_pDebugView->Draw();
#endif

	// Check if our screen shot write failed
	if(CScreenShot::IsDone())
	{
		if(CScreenShot::HasSucceeded())
			m_pChatWindow->AddInfoMessage("Screen shot written (%s).", CScreenShot::GetWriteName().Get());
		else
			m_pChatWindow->AddInfoMessage("Screen shot write failed (%s).", CScreenShot::GetError().Get());

		CScreenShot::Reset();
	}
	
	if(CGame::GetState() == GAME_STATE_MAIN_MENU)
	{
		if(m_pHttpClient->IsBusy())
			m_pHttpClient->Process();
		if(m_pHttpClient->GotData())
		{
			// Get the data
			String * strData = m_pHttpClient->GetData();

			// Did we get any data?
			if(!strData->IsEmpty())
			{
#ifndef IVMP_DEBUG
				if(strcmp(strData->Get(), MOD_VERSION_STRING))
				{
					if(m_pGUI)
						m_pGUI->ShowMessageBox(String("A new version of IV:MP is available (Version %s)", strData->Get()).Get(), "New Version available");
				}
#endif
			}
		}
	}

	// Are we in game?
	if(CGame::GetState() == GAME_STATE_INGAME)
	{
		// Is F4 held down and do we have a network manager?
		if(GetAsyncKeyState(VK_F4) && m_pNetworkManager && m_pActorManager)
		{
			// Get the network statistics
			CNetStats * pNetStats = m_pNetworkManager->GetNetClient()->GetNetStats();

			// Convert the network statistics to a string
			char szNetworkStats[10000];
			pNetStats->ToString(szNetworkStats, 2);

			// Create the statistics string
			String strStats(szNetworkStats);

			// Append loaded and unloaded model counts to the stats
			// jenksta: too performance heavy to be done every frame
			//strStats.AppendF("Models (Loaded/Unload): %d/%d\n", CGame::GetLoadedModelCount(), CGame::GetUnloadedModelCount());

			// Append streamed in/out entity counts and streamed in limits to the stats
			strStats.AppendF("Players (StreamedIn/StreamedInLimit): %d/%d\n", m_pStreamer->GetStreamedInEntityCountOfType(STREAM_ENTITY_PLAYER)+1, m_pStreamer->GetStreamedInLimitOfType(STREAM_ENTITY_PLAYER));
			strStats.AppendF("Vehicles (StreamedIn/StreamedInLimit): %d/%d\n", m_pStreamer->GetStreamedInEntityCountOfType(STREAM_ENTITY_VEHICLE), m_pStreamer->GetStreamedInLimitOfType(STREAM_ENTITY_VEHICLE));
			strStats.AppendF("Actors (Actor-Count/Max-Actors): %d/%d\n", m_pActorManager->GetActorCount(), MAX_ACTORS);
			strStats.AppendF("Pickups (StreamedIn/StreamedInLimit): %d/%d\n", m_pStreamer->GetStreamedInEntityCountOfType(STREAM_ENTITY_PICKUP), m_pStreamer->GetStreamedInLimitOfType(STREAM_ENTITY_PICKUP));
			strStats.AppendF("Objects (StreamedIn/StreamedInLimit): %d/%d\n", m_pStreamer->GetStreamedInEntityCountOfType(STREAM_ENTITY_OBJECT), m_pStreamer->GetStreamedInLimitOfType(STREAM_ENTITY_OBJECT));
			strStats.AppendF("Checkpoints (StreamedIn/StreamedInLimit): %d/%d\n", m_pStreamer->GetStreamedInEntityCountOfType(STREAM_ENTITY_CHECKPOINT), m_pStreamer->GetStreamedInLimitOfType(STREAM_ENTITY_CHECKPOINT));

			// Draw the string
			m_pGUI->DrawText(strStats, CEGUI::Vector2(26, 30), (CEGUI::colour)D3DCOLOR_RGBA(255, 255, 255, 255), m_pGUI->GetFont("tahoma-bold", 10));
			m_pChatWindow->SetEnabled(false);
			m_bNetworkStatsDisplayed = true;
		}
		else
		{
			// If our network stats were displayed
			if(m_bNetworkStatsDisplayed)
			{
				if(m_pChatWindow && !m_pChatWindow->IsEnabled())
					m_pChatWindow->SetEnabled(true);
				
				m_bNetworkStatsDisplayed = false;
			}

			// If our input window exists draw it
			if(m_pInputWindow)
				m_pInputWindow->Draw();
		}

		// Update the time
		if(m_pTime)
		{
			// jenksta: Setting this every frame causes the weather to change
			// rapidly
			unsigned char ucHour = 0, ucMinute = 0;
			m_pTime->GetTime(&ucHour, &ucMinute);
			CGame::SetTime(ucHour, ucMinute);
			CGame::SetDayOfWeek(m_pTime->GetDayOfWeek());
		}

#ifdef IVMP_DEBUG
		if(m_pVehicleManager)
		{
			CVector3 vecWorldPosition;
			Vector2 vecScreenPosition;

			for(EntityId i = 0; i < MAX_VEHICLES; i++)
			{
				CNetworkVehicle * pVehicle = m_pVehicleManager->Get(i);
				if(pVehicle)
				{
					if(!pVehicle->IsStreamedIn())
						continue;

					if(!pVehicle->IsOnScreen())
						continue;
					
					pVehicle->GetPosition(vecWorldPosition); 
					if(!CGame::GetScreenPositionFromWorldPosition(vecWorldPosition, vecScreenPosition))
						continue;

							
					int iHealth = pVehicle->GetHealth();
					int iModel = pVehicle->GetEngineState();
					float fPetrol = pVehicle->GetPetrolTankHealth();
					CVector3 vecPos; pVehicle->GetPosition(vecPos);
					CVector3 vecRot; pVehicle->GetRotation(vecRot);
					m_pGUI->DrawText(String("VehicleId %d, Enginestate: %d, Health: %d, PetrolTankHealth: %f\nPosition(%.3f,%.3f,%.3f), Rot(%.3f,%.3f,%.3f)", i, iModel, iHealth, fPetrol, vecPos.fX,vecPos.fY,vecPos.fZ,vecRot.fX,vecRot.fY,vecRot.fZ), CEGUI::Vector2(vecScreenPosition.fX, vecScreenPosition.fY));
				}
			}
		}
#endif

		if(m_pNameTags)
			m_pNameTags->Draw();
	}
}
Ejemplo n.º 22
0
void CLocalPlayer::OnEnterVehicle( void )
{
	// Get the vehicle instance from the vehicle guid
	CNetworkVehicle * pNetworkVehicle = pCore->GetVehicleManager()->GetFromGameGUID( GetPlayerPed()->GetCurrentVehicle()->m_dwGUID );

	// Is the vehicle instance valid?
	if( pNetworkVehicle )
	{
#ifdef _DEBUG
		M2Vehicle * pVehicle = pNetworkVehicle->GetVehicle()->GetVehicle();
		DWORD dwVehicleData = (DWORD)(pVehicle) + 0xA8;

		pCore->GetChat()->AddDebugMessage ( "Vehicle: 0x%p, VehicleData: 0x%p", pVehicle, dwVehicleData );
#endif

		// Set the initial seat as the driver
		EntityId seat = 0;

		// Is the player in the passenger seat?
		//if( GetState() == PLAYERSTATE_PASSENGER )
		//	seat = pNetworkVehicle->GetVehicle()->GetPedOccupiedSeat( GetPlayerPed()->GetPed() );

		// Does the vehicle already have a driver?
		if ( pNetworkVehicle->GetDriver () )
			seat = pNetworkVehicle->GetVehicle()->GetPedOccupiedSeat( GetPlayerPed()->GetPed() );

		// Are we getting in as the driver?
		if( seat == 0 )
			SetState( PLAYERSTATE_DRIVER );
		else
			SetState( PLAYERSTATE_PASSENGER );

#ifdef _DEBUG
		pCore->GetChat()->AddDebugMessage( "Seat: %d, Driver: 0x%p, State: %d", seat, pNetworkVehicle->GetDriver (), GetState () );
#endif

		// Construct a new bitstream
		RakNet::BitStream pBitStream;

		// Write the vehicle id
		pBitStream.WriteCompressed( pNetworkVehicle->GetId() );

		// Write the seat
		pBitStream.WriteCompressed( seat );

		// Send to the server
		pCore->GetNetworkModule()->Call( RPC_ENTER_VEHICLE, &pBitStream, HIGH_PRIORITY, RELIABLE_ORDERED, true );

#ifdef _DEBUG
		pCore->GetChat()->AddDebugMessage( "CLocalPlayer::OnEnterVehicle( %d, %d )", pNetworkVehicle->GetId(), seat );
#endif

		// Handle this enter with the network vehicle
		pNetworkVehicle->HandlePlayerEnter( this, seat );

		// Set the vehicle
		SetVehicle( pNetworkVehicle );

		// Set the seat
		SetSeat( seat );

		// Set the target data
		SetEnteringVehicle( pNetworkVehicle, seat );
	}
}
Ejemplo n.º 23
0
void CLocalPlayer::GetClosestVehicle( CNetworkVehicle ** pNetworkVehicle, EntityId * seatId )
{
	// Are we spawned and not dead and not already in a vehicle?
	if( IsSpawned() && !IsDead() && !m_pPlayerPed->GetCurrentVehicle() )
	{
		//
		float fCurrentDistance = 2.68f;
		CVector3 vecVehiclePos;
		CNetworkVehicle * pClosestVehicle = NULL;

		// Get our position
		CVector3 vecCurrentPosition;
		GetPosition( &vecCurrentPosition );

		// Loop through all network vehicles
		for( int i = 0; i < MAX_VEHICLES; i++ )
		{
			// Is the current vehicle active?
			if( pCore->GetVehicleManager()->IsActive( i ) )
			{
				// Get a pointer to the current vehicle
				CNetworkVehicle * pCurrentVehicle = pCore->GetVehicleManager()->Get( i );

				// Get the vehicle position
				pCurrentVehicle->GetPosition( &vecVehiclePos );

				// Get the distance between the current vehicle and us
				float fDistance = Math::GetDistanceBetweenPoints( vecCurrentPosition, vecVehiclePos );

				// Is this distance less than the current distance?
				if( fDistance < fCurrentDistance )
				{
					// Set the current distance
					fCurrentDistance = fDistance;

					// Set the closest vehicle
					pClosestVehicle = pCurrentVehicle;
				}
			}
		}

		// Isn't there a vehicle in range?
		if( !pClosestVehicle )
			return;

		// Loop through all the passenger seats
		BYTE byteCurrentSeat = 0;
		for( BYTE i = 2; i < 5; i++ )
		{
			// Is there no one in this seat?
			if( !pClosestVehicle->GetVehicle()->GetSeatOccupant( i ) )
			{
				byteCurrentSeat = i;
				break;
			}
		}

		// Didn't we find a seat?
		if( !byteCurrentSeat )
			return;

		// Set the seat
		*seatId = byteCurrentSeat;

		// Set the vehicle
		*pNetworkVehicle = pClosestVehicle;
	}
}