void CMapManager::LinkupElements ( void ) { // * Link up all the attaching elements list < CVehicle* > ::const_iterator iterVehicles = m_pVehicleManager->IterBegin (); for ( ; iterVehicles != m_pVehicleManager->IterEnd (); iterVehicles++ ) { CVehicle* pVehicle = *iterVehicles; char* szAttachToID = pVehicle->GetAttachToID (); if ( szAttachToID [ 0 ] ) { CElement* pElement = g_pGame->GetMapManager ()->GetRootElement ()->FindChild ( szAttachToID, 0, true ); if ( pElement ) pVehicle->AttachTo ( pElement ); } } list < CPlayer* > ::const_iterator iterPlayers = m_pPlayerManager->IterBegin (); for ( ; iterPlayers != m_pPlayerManager->IterEnd (); iterPlayers++ ) { CPlayer* pPlayer = *iterPlayers; // Link up all the attaching elements char* szAttachToID = pPlayer->GetAttachToID (); if ( szAttachToID [ 0 ] ) { CElement* pElement = g_pGame->GetMapManager ()->GetRootElement ()->FindChild ( szAttachToID, 0, true ); if ( pElement ) pPlayer->AttachTo ( pElement ); } } CObjectListType::const_iterator iterObjects = m_pObjectManager->IterBegin (); for ( ; iterObjects != m_pObjectManager->IterEnd (); iterObjects++ ) { CObject* pObject = *iterObjects; // Link up all the attaching elements char* szAttachToID = pObject->GetAttachToID (); if ( szAttachToID [ 0 ] ) { CElement* pElement = g_pGame->GetMapManager ()->GetRootElement ()->FindChild ( szAttachToID, 0, true ); if ( pElement ) pObject->AttachTo ( pElement ); } } list < CBlip* > ::const_iterator iterBlips = m_pBlipManager->IterBegin (); for ( ; iterBlips != m_pBlipManager->IterEnd (); iterBlips++ ) { CBlip* pBlip = *iterBlips; // Link up all the attaching elements char* szAttachToID = pBlip->GetAttachToID (); if ( szAttachToID [ 0 ] ) { CElement* pElement = g_pGame->GetMapManager ()->GetRootElement ()->FindChild ( szAttachToID, 0, true ); if ( pElement ) pBlip->AttachTo ( pElement ); } } }
void CMapManager::SpawnPlayer ( CPlayer& Player, const CVector& vecPosition, float fRotation, unsigned short usModel, unsigned char ucInterior, unsigned short usDimension, CTeam* pTeam ) { // Don't force them off their team if the spawnpoint doesn't have one if ( pTeam == NULL ) pTeam = Player.GetTeam (); ElementID TeamID = ( pTeam ) ? pTeam->GetID () : INVALID_ELEMENT_ID; // Change the time context to avoid old sync packets arriving causing players // to slide from previous location to the new one. unsigned char ucTimeContext = Player.GenerateSyncTimeContext (); // Tell everyone where he spawns m_pPlayerManager->BroadcastOnlyJoined ( CPlayerSpawnPacket ( Player.GetID (), vecPosition, fRotation, usModel, ucInterior, usDimension, TeamID, ucTimeContext ) ); // Remove him from any occupied vehicle CVehicle* pVehicle = Player.GetOccupiedVehicle (); if ( pVehicle ) { pVehicle->SetOccupant ( NULL, Player.GetOccupiedVehicleSeat () ); Player.SetOccupiedVehicle ( NULL, 0 ); } // If this guy was jacking someone, make sure its aborted pVehicle = Player.GetJackingVehicle (); if ( pVehicle ) { if ( Player.GetVehicleAction () == CPlayer::VEHICLEACTION_JACKING ) { CPed * pOccupant = pVehicle->GetOccupant ( 0 ); if ( pOccupant ) { pOccupant->SetVehicleAction ( CPlayer::VEHICLEACTION_NONE ); // Tell everyone CVehicleInOutPacket Reply ( pVehicle->GetID (), 0, CGame::VEHICLE_NOTIFY_JACK_RETURN, pOccupant->GetID (), Player.GetID () ); Reply.SetSourceElement ( &Player ); m_pPlayerManager->BroadcastOnlyJoined ( Reply ); } } if ( pVehicle->GetJackingPlayer () == &Player ) pVehicle->SetJackingPlayer ( NULL ); } // Update the player data Player.SetSpawned ( true ); Player.SetHealth ( Player.GetMaxHealth () ); Player.SetIsDead ( false ); Player.SetWearingGoggles ( false ); Player.SetHasJetPack ( false ); Player.SetPosition ( vecPosition ); Player.SetRotation ( fRotation ); Player.SetModel ( usModel ); Player.SetVehicleAction ( CPlayer::VEHICLEACTION_NONE ); Player.SetTeam ( pTeam, true ); Player.SetInterior ( ucInterior ); Player.SetDimension ( usDimension ); Player.AttachTo ( NULL ); // Call onPlayerSpawn CLuaArguments OnPlayerSpawnArguments; OnPlayerSpawnArguments.PushNumber ( vecPosition.fX ); OnPlayerSpawnArguments.PushNumber ( vecPosition.fY ); OnPlayerSpawnArguments.PushNumber ( vecPosition.fZ ); OnPlayerSpawnArguments.PushNumber ( fRotation ); OnPlayerSpawnArguments.PushElement ( pTeam ); OnPlayerSpawnArguments.PushNumber ( usModel ); OnPlayerSpawnArguments.PushNumber ( ucInterior ); OnPlayerSpawnArguments.PushNumber ( usDimension ); Player.CallEvent ( "onPlayerSpawn", OnPlayerSpawnArguments ); }