void CBlipManager::AttachToVehicle(EntityId blipId, EntityId vehicleId) { if(blipId >= MAX_BLIPS) return; if(m_bActive[blipId]) { CNetworkVehicle * pVehicle = g_pClient->GetVehicleManager()->Get(vehicleId); if(pVehicle && pVehicle->IsSpawned()) { //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; } } }
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 } } }