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 } } }