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 ); }
CPlayer::~CPlayer ( void ) { // Make sure the script debugger doesn't reference us SetScriptDebugLevel ( 0 ); if ( m_pCamera ) { // Remove the camera from its targets FollowingCameras list if ( m_pCamera->GetTarget () ) m_pCamera->GetTarget ()->m_FollowingCameras.remove ( m_pCamera ); delete m_pCamera; m_pCamera = NULL; } // Make sure nobody's syncing us RemoveAllSyncingVehicles (); RemoveAllSyncingPeds (); RemoveAllSyncingObjects (); // Delete the player text manager delete m_pPlayerTextManager; // Destroy our nick if ( m_szNametagText ) { delete [] m_szNametagText; m_szNametagText = NULL; } SetTeam ( NULL, true ); delete m_pPad; delete m_pKeyBinds; CSimControl::RemoveSimPlayer ( this ); // Unparent us (CElement's unparenting will crash because of the incomplete vtable at that point) m_bDoNotSendEntities = true; SetParentObject ( NULL ); // Do this if ( m_pJackingVehicle ) { if ( m_uiVehicleAction == VEHICLEACTION_JACKING ) { CPed * pOccupant = m_pJackingVehicle->GetOccupant ( 0 ); if ( pOccupant ) { m_pJackingVehicle->SetOccupant ( NULL, 0 ); pOccupant->SetOccupiedVehicle ( NULL, 0 ); pOccupant->SetVehicleAction ( VEHICLEACTION_NONE ); } } if ( m_pJackingVehicle->GetJackingPlayer () == this ) m_pJackingVehicle->SetJackingPlayer ( NULL ); } CElementRefManager::RemoveElementRefs ( ELEMENT_REF_DEBUG ( this, "CPlayer" ), &m_pTeam, NULL ); CElementRefManager::RemoveElementListRef ( ELEMENT_REF_DEBUG ( this, "CPlayer m_lstBroadcastList" ), &m_lstBroadcastList ); CElementRefManager::RemoveElementListRef ( ELEMENT_REF_DEBUG ( this, "CPlayer m_lstIgnoredList" ), &m_lstIgnoredList ); delete m_pPlayerStatsPacket; // Unlink from manager Unlink (); }