bool AbstractRoutingProfile::ParametrizeForCar(const osmscout::TypeConfig& typeConfig, const std::map<std::string,double>& speedMap, double maxSpeed) { bool everythingResolved=true; speeds.clear(); SetVehicle(vehicleCar); SetVehicleMaxSpeed(maxSpeed); for (const auto &type : typeConfig.GetTypes()) { if (!type->GetIgnore() && type->CanRouteCar()) { std::map<std::string,double>::const_iterator speed=speedMap.find(type->GetName()); if (speed==speedMap.end()) { log.Error() << "No speed for type '" << type->GetName() << "' defined!"; everythingResolved=false; continue; } AddType(type,speed->second); } } return everythingResolved; }
void CNetworkPlayer::RemoveFromVehicle( CNetworkVehicle * pVehicle ) { DEBUG_TRACE("CNetworkPlayer::RemoveFromVehicle"); // Is the player and vehicle valid? if( m_pPlayerPed && pVehicle && IsSpawned() ) { // Remove the player from the vehicle m_pPlayerPed->GetInOutVehicle( pVehicle->GetVehicle()->GetVehicle(), m_seat, false, true ); // Handle with the vehicle pVehicle->HandlePlayerExit ( this, m_seat ); // Reset SetVehicle ( NULL ); SetSeat ( INVALID_ENTITY_ID ); m_playerState = ePlayerState::PLAYERSTATE_ONFOOT; } // Is the player exiting a vehicle? if( m_VehicleExit.m_bIsExiting ) { // Reset m_VehicleExit.m_bIsExiting = false; m_VehicleExit.m_ulExitStartTime = 0; m_VehicleExit.m_pExitAICommand = NULL; } }
void CLocalPlayer::HandleSpawn( bool bRespawn ) { // Are we respawning and not dead? if( bRespawn && !IsDead() ) return; // Have we already just spawned? if( (SharedUtility::GetTime() - m_ulSpawnTime) < 500 ) return; // Set the spawn time m_ulSpawnTime = SharedUtility::GetTime(); // Reset the death time m_ulDeathTime = 0; // Set the state SetState( ePlayerState::PLAYERSTATE_ONFOOT ); // Mark as not dead SetDead( false ); // Mark as spawned SetSpawned( true ); // Are we in a vehicle? if( IsInVehicle() ) { // Handle this enter with the network vehicle m_pVehicle->HandlePlayerExit( this, m_seat, false ); // Reset the vehicle SetVehicle( NULL ); // Reset the seat SetSeat( INVALID_ENTITY_ID ); } // Reset the player position and rotation Teleport ( CVector3() ); SetRotation ( CVector3() ); // Send RPC to server pCore->GetNetworkModule()->Call( RPC_PLAYER_SPAWN, NULL, HIGH_PRIORITY, RELIABLE, true ); // Restore the camera (TODO: Use real game function to reset camera behind player!) pCore->GetCamera()->LockControl ( false ); LockControls ( false ); // Restore the camera control pCore->GetCamera()->LockControl ( bOldCameraState ); // Restore the control state LockControls ( bOldCTRLState ); }
void AbstractRoutingProfile::ParametrizeForFoot(const TypeConfig& typeConfig, double maxSpeed) { speeds.clear(); SetVehicle(vehicleFoot); SetVehicleMaxSpeed(maxSpeed); for (const auto &type : typeConfig.GetTypes()) { if (!type->GetIgnore() && type->CanRouteFoot()) { AddType(type,maxSpeed); } } }
void CNetworkPlayer::PutInVehicle( CNetworkVehicle * pVehicle, EntityId seatId ) { DEBUG_TRACE("CNetworkPlayer::PutInVehicle"); // Is the player spawned and the vehicle valid? if( m_pPlayerPed && pVehicle && IsSpawned() && pVehicle->IsSpawned() ) { bool bOldControlState; // Is this the localplayer? if ( IsLocalPlayer() ) { // Get the old control state bOldControlState = ((CLocalPlayer *)this)->AreControlsLocked(); // Lock the player controls ((CLocalPlayer *)this)->LockControls( true ); } // Does the target vehicle already have a driver? if ( pVehicle->GetDriver() ) { // Todo: some checks to check the last sync time from the driver. If he's timed out of not even connected anymore, reset the driver and put this player in the vehicle CLogFile::Printf ( "WARNING: Got tasked to put a player (%d) in vehicle (%d), but there's already a driver (%d) in that vehicle!", m_playerId, pVehicle->GetId(), pVehicle->GetDriver()->GetId() ); CLogFile::Printf ( "Internal driver ped pointer: 0x%p, Internal driver ped vehicle pointer: 0x%p", pVehicle->GetDriver()->GetPlayerPed()->GetPed(), pVehicle->GetDriver()->GetPlayerPed()->GetPed()->m_pCurrentVehicle ); // Is the driver still in the vehicle? if ( pVehicle->GetDriver()->InternalIsInVehicle ( pVehicle->GetVehicle() ) ) return; // Clean the network vehicle data pVehicle->HandlePlayerExit ( pVehicle->GetDriver (), 0 ); CLogFile::Printf ( "We still have a driver set, but he's no longer inside the vehicle. Cleaned network vehicle driver pointer and continuing code.." ); } // Terminate any sync objects if this is not the localplayer if ( !IsLocalPlayer() ) TerminateSyncObjects (); // Put the player in the vehicle m_pPlayerPed->GetInOutVehicle( pVehicle->GetVehicle()->GetVehicle(), seatId, true, true ); // Handle with the vehicle pVehicle->HandlePlayerEnter ( this, (seatId - 1) ); // Set the vehicle SetVehicle( pVehicle ); // Set the seat SetSeat( seatId ); // Reset the target data SetEnteringVehicle( NULL, INVALID_ENTITY_ID ); // Set the player state m_playerState = (seatId == 1 ? ePlayerState::PLAYERSTATE_DRIVER : ePlayerState::PLAYERSTATE_PASSENGER); // Is this the localplayer? if ( IsLocalPlayer() ) { // Lock the player controls ((CLocalPlayer *)this)->LockControls( bOldControlState ); } } }
void CNetworkPlayer::ExitVehicle( bool bExit, bool bQuickly ) { DEBUG_TRACE("CNetworkPlayer::ExitVehicle"); // Are we not in a vehicle? if( !m_pVehicle ) return; // Are we already exiting? if ( IsExitingVehicle() ) { CLogFile::Printf ( "WARNING: This player (%s) is already exiting a vehicle, skipping!", GetNick().Get () ); return; } // Is the player ped active? if( m_pPlayerPed && IsSpawned() ) { // Should we remove the player from the vehicle? if( bExit ) { // Are we in a vehicle? if( InternalIsInVehicle() ) { #ifdef DEBUG CLogFile::Printf( "CPlayer::ExitVehicle - Quickly? %s", (bQuickly ? "true" : "false") ); #endif // Reset the target data SetEnteringVehicle( NULL, INVALID_ENTITY_ID ); m_VehicleEnter.m_bIsEntering = false; // Remove from vehicle C_SyncObject * pSyncObject = m_pPlayerPed->GetInOutVehicle( m_pPlayerPed->GetCurrentVehicle(), m_seat, bQuickly ); #ifdef DEBUG CLogFile::Printf ( "Exit vehicle sync object: 0x%p", pSyncObject ); #endif // Are we not quickly exiting? if( !bQuickly ) { m_VehicleExit.m_pExitAICommand = new CM2SyncObject( pSyncObject ); m_VehicleExit.m_bIsExiting = true; m_VehicleExit.m_ulExitStartTime = SharedUtility::GetTime (); } } #ifdef DEBUG CLogFile::Print ( "Handling with vehicle..." ); #endif // Handle this enter with the network vehicle m_pVehicle->HandlePlayerExit( this, (m_seat - 1) ); #ifdef DEBUG CLogFile::Print ( "Done!" ); #endif } // Reset the vehicle SetVehicle( NULL ); // Reset the seat SetSeat( INVALID_ENTITY_ID ); // Reset the playerstate m_playerState = ePlayerState::PLAYERSTATE_ONFOOT; } }
void CNetworkPlayer::EnterVehicle( CNetworkVehicle * pVehicle, M2Enums::eVehicleSeat seat, bool bEnter ) { DEBUG_TRACE("CNetworkPlayer::EnterVehicle"); // Are we already entering? if ( IsEnteringVehicle() ) { CLogFile::Printf ( "WARNING: This player (%s) is already entering a vehicle, skipping!", GetNick().Get () ); return; } // Is the player ped and network vehicle active? if( m_pPlayerPed && pVehicle && IsSpawned() ) { // Clean up any sync objects TerminateSyncObjects (); // Should we put the player in the vehicle? if( bEnter ) { // Remove the ped from the vehicle if we're already in one if( InternalIsInVehicle() ) m_pPlayerPed->GetInOutVehicle( m_pPlayerPed->GetCurrentVehicle(), m_seat, false, true ); // Get our current position CVector3 vecPosition; GetPosition( &vecPosition ); // Get the vehicle position CVector3 vecVehiclePos; pVehicle->GetPosition( &vecVehiclePos ); // bool bForced = false; // Is the vehicle too far away? if( Math::GetDistanceBetweenPoints( vecPosition, vecVehiclePos ) > 4.0f ) // 2.68 = max distance bForced = true; CLogFile::Printf ( "EnterVehicle - Forced: %s", (bForced ? "Yes" : "No") ); // Is the vehicle invalid? if ( !pVehicle->GetVehicle() || !pVehicle->GetVehicle()->GetVehicle() ) { CLogFile::Printf ( "EnterVehicle - Invalid game vehicle, skipping to prevent crash!" ); return; } // Enter the vehicle m_VehicleEnter.m_pEnterAICommand = new CM2SyncObject( m_pPlayerPed->GetInOutVehicle( pVehicle->GetVehicle()->GetVehicle(), seat, true, bForced ) ); CLogFile::Printf ( "Done!" ); // Don't finish this sync object when we delete it m_VehicleEnter.m_pEnterAICommand->SetDoneOnDelete ( false ); // Handle this enter with the network vehicle pVehicle->HandlePlayerEnter( this, (seat - 1) ); } // Set the vehicle SetVehicle( pVehicle ); // Set the seat SetSeat( seat ); // Reset the target data SetEnteringVehicle( pVehicle, seat ); // Set the player state m_playerState = (seat == 1 ? ePlayerState::PLAYERSTATE_DRIVER : ePlayerState::PLAYERSTATE_PASSENGER); } }
void CLocalPlayer::OnLeaveVehicle( void ) { // Set the player state SetState( PLAYERSTATE_ONFOOT ); // Is the vehicle instance valid? if( m_pVehicle ) { // Get the seat of this player EntityId seat = m_seat; // Construct a new bitstream RakNet::BitStream pBitStream; // Write the vehicle id pBitStream.WriteCompressed( m_pVehicle->GetId() ); // Write the seat pBitStream.WriteCompressed( seat ); // Write if we're exiting quickly! m_bFastExitVehicle ? pBitStream.Write1() : pBitStream.Write0(); // Send to the server pCore->GetNetworkModule()->Call( RPC_EXIT_VEHICLE, &pBitStream, HIGH_PRIORITY, RELIABLE_ORDERED, true ); #ifdef DEBUG pCore->GetChat()->AddDebugMessage( "CLocalPlayer::OnExitVehicle( %d, %d ) - Forcefully: %s", m_pVehicle->GetId(), seat, (IsBeingRemovedForcefully () ? "Yes" : "No") ); #endif // Are we not being removed forcefully? if ( !IsBeingRemovedForcefully () ) { // Handle this enter with the network vehicle m_pVehicle->HandlePlayerExit( this, seat, false ); // Do we need to respawn this vehicle? (Set to true when vehicle enters water) if( bRespawnVehicle && m_seat == 0 ) { // Respawn the vehicle m_pVehicle->Respawn(); // bRespawnVehicle = false; } // Are we a passenger? if( m_seat > 0 ) { // Restore the player controls LockControls( bOldControlState ); // Restore the camera lock state pCore->GetCamera()->LockControl( bOldCameraState ); // *(DWORD *)(m_pPlayerPed->GetPed() + 0x310) = 6; } } // Reset the vehicle SetVehicle( NULL ); // Reset the seat SetSeat( INVALID_ENTITY_ID ); // Reset the target data SetEnteringVehicle( NULL, INVALID_ENTITY_ID ); // Reset the fast vehicle exit flag FlagForFastExitVehicle ( false ); // Reset the forceful exit flag SetRemoveForcefully ( false ); } }
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 ); } }