void CMapManager::SendPerPlayerEntities ( CPlayer& Player ) { CEntityAddPacket Packet; // Add the markers to the packet list < CMarker* > ::const_iterator iterMarkers = m_pMarkerManager->IterBegin (); for ( ; iterMarkers != m_pMarkerManager->IterEnd (); iterMarkers++ ) { if ( (*iterMarkers)->IsVisibleToPlayer ( Player ) ) { Packet.Add ( *iterMarkers ); } } // Add the radar areas to the packet list < CRadarArea* > ::const_iterator iterAreas = m_pRadarAreaManager->IterBegin (); for ( ; iterAreas != m_pRadarAreaManager->IterEnd (); iterAreas++ ) { if ( (*iterAreas)->IsVisibleToPlayer ( Player ) ) { Packet.Add ( *iterAreas ); } } // Send it to the player Player.Send ( Packet ); }
void CPerPlayerEntity::CreateEntity(CPlayer* pPlayer) { // Are we visible? if (m_bIsSynced) { // Create the add entity packet CEntityAddPacket Packet; Packet.Add(this); // Send it to the player if available, if not everyone if (pPlayer) { // Only send it to him if we can if (!pPlayer->DoNotSendEntities()) { // CLogger::DebugPrintf ( "Created %u (%s) for %s\n", GetID (), GetName (), pPlayer->GetNick () ); pPlayer->Send(Packet); } } else { // CLogger::DebugPrintf ( "Created %u (%s) for everyone (%u)\n", GetID (), GetName (), m_Players.size () ); BroadcastOnlyVisible(Packet); } } }
void CMapManager::BroadcastResourceElements ( CElement* pResourceElement, CElementGroup* pElementGroup ) { CEntityAddPacket Packet; Packet.Add ( pResourceElement ); std::set < CElement* > doneElements; // Lookup map of elements already processed std::vector < CPerPlayerEntity* > pPerPlayerList; // A list of per player elements we will process the last if ( pResourceElement->CountChildren() > 0 ) BroadcastElementChildren ( pResourceElement, Packet, pPerPlayerList, doneElements ); // Also send elements that are in the element group but have not been processed yet (i.e. are not parented by the resource) for ( CFastList < CElement* > ::const_iterator iter = pElementGroup->IterBegin() ; iter != pElementGroup->IterEnd() ; iter++ ) if ( !MapContains( doneElements, *iter ) ) BroadcastElement( *iter, Packet, pPerPlayerList ); //send to all players g_pGame->GetPlayerManager()->BroadcastOnlyJoined ( Packet ); std::vector < CPerPlayerEntity* > ::const_iterator iter = pPerPlayerList.begin(); for ( ; iter != pPerPlayerList.end(); iter++ ) { (*iter)->Sync ( true ); } }
void CMapManager::SendBlips ( CPlayer& Player ) { CTimeUsMarker < 20 > marker; marker.Set ( "Start" ); // Add all blips to an entity add packet CEntityAddPacket Packet; // Tell him about all the blips added by script list < CBlip* > ::const_iterator iterBlips = m_pBlipManager->IterBegin (); for ( ; iterBlips != m_pBlipManager->IterEnd (); iterBlips++ ) { if ( (*iterBlips)->IsVisibleToPlayer ( Player ) ) { Packet.Add ( *iterBlips ); } } marker.Set ( "Compile" ); // Tell the player Player.Send ( Packet ); marker.Set ( "Send" ); // Add debug info if wanted if ( CPerfStatDebugInfo::GetSingleton ()->IsActive ( "SendBlips" ) ) CPerfStatDebugInfo::GetSingleton ()->AddLine ( "SendBlips", marker.GetString () ); }
void CMapManager::BroadcastElement ( CElement* pElement, CEntityAddPacket &Packet, std::vector < CPerPlayerEntity* > &pPerPlayerList ) { // Is it a per-player entity if ( pElement->IsPerPlayerEntity () ) { pPerPlayerList.push_back ( static_cast < CPerPlayerEntity* > ( pElement ) ); } else { Packet.Add ( pElement ); } }
void CMapManager::SendBlips ( CPlayer& Player ) { // Add all blips to an entity add packet CEntityAddPacket Packet; // Tell him about all the blips added by script list < CBlip* > ::const_iterator iterBlips = m_pBlipManager->IterBegin (); for ( ; iterBlips != m_pBlipManager->IterEnd (); iterBlips++ ) { if ( (*iterBlips)->IsVisibleToPlayer ( Player ) ) { Packet.Add ( *iterBlips ); } } // Tell the player Player.Send ( Packet ); }
void CMapManager::BroadcastElements ( CElement* pElement, bool bBroadcastAll ) { CEntityAddPacket Packet; Packet.Add ( pElement ); //a list of per player elements we will process the last list < CPerPlayerEntity* > pPerPlayerList; if ( pElement->CountChildren() > 0 ) BroadcastElementChildren ( pElement, Packet, pPerPlayerList, bBroadcastAll ); //send to all players g_pGame->GetPlayerManager()->BroadcastOnlyJoined ( Packet ); list < CPerPlayerEntity* > ::const_iterator iter = pPerPlayerList.begin(); for ( ; iter != pPerPlayerList.end(); iter++ ) { (*iter)->Sync ( true ); } }
CElement* CMapManager::LoadMapData ( CResource& Loader, CElement& Parent, CXMLNode& Node ) { // Load the elements vector < CElement* > ElementsAdded; CElement* pLoadedRoot = LoadNode ( Loader, Node, &Parent, &ElementsAdded, false ); if ( pLoadedRoot ) { // Add all the elements that are entities to a sync packet CEntityAddPacket AddPacket; vector < CElement* > ::const_iterator iter = ElementsAdded.begin (); for ( ; iter != ElementsAdded.end (); iter++ ) { // Is it a per-player entity? Sync it. Otherwize add it to the packet. if ( IS_PERPLAYER_ENTITY ( *iter ) ) { static_cast < CPerPlayerEntity* > ( *iter )->Sync ( true ); } else { AddPacket.Add ( *iter ); } } // Send it to everyone m_pPlayerManager->BroadcastOnlyJoined ( AddPacket ); return pLoadedRoot; } // If unsuccessfull, destroy the new elements. Remember removing it from our element group. CElementGroup* pElementGroup = Loader.GetElementGroup (); vector < CElement* > ::const_iterator iter = ElementsAdded.begin (); for ( ; iter != ElementsAdded.end (); iter++ ) { pElementGroup->Remove ( *iter ); delete *iter; } // Failed return NULL; }
void CMapManager::BroadcastElementChildren ( CElement* pParentElement, CEntityAddPacket &Packet, std::vector < CPerPlayerEntity* > &pPerPlayerList, std::set < CElement* >& outDoneElements ) { CChildListType ::const_iterator iter = pParentElement->IterBegin (); for ( ; iter != pParentElement->IterEnd(); iter++ ) { CElement* pChildElement = *iter; MapInsert( outDoneElements, pChildElement ); // Is it a per-player entity if ( pChildElement->IsPerPlayerEntity () ) { pPerPlayerList.push_back ( static_cast < CPerPlayerEntity* > ( pChildElement ) ); } else { Packet.Add ( pChildElement ); } if ( pChildElement->CountChildren() > 0 ) BroadcastElementChildren ( pChildElement, Packet, pPerPlayerList, outDoneElements ); } }
void CMapManager::BroadcastElementChildren ( CElement* pElement, CEntityAddPacket &Packet, list < CPerPlayerEntity* > &pPerPlayerList, bool bBroadcastAll ) { CElement * pTemp; CChildListType ::const_iterator iter = pElement->IterBegin (); for ( ; iter != pElement->IterEnd(); iter++ ) { pTemp = *iter; // Is this a map created entity or our resource's root element if ( bBroadcastAll || ( pTemp->IsMapCreated () || ( pTemp->GetType () == CElement::DUMMY && !strcmp ( pTemp->GetTypeName ().c_str (), "map" ) ) ) ) { // Is it a per-player entity if ( pTemp->IsPerPlayerEntity () ) { pPerPlayerList.push_back ( static_cast < CPerPlayerEntity* > ( pTemp ) ); } else { Packet.Add ( pTemp ); } } if ( pTemp->CountChildren() > 0 ) BroadcastElementChildren ( pTemp, Packet, pPerPlayerList, bBroadcastAll ); } }
void CMapManager::SendMapInformation ( CPlayer& Player ) { // Start an entity list packet CEntityAddPacket EntityPacket; // Add the dummys to the packet list < CDummy* > ::const_iterator iterDummys = m_pGroups->IterBegin (); for ( ; iterDummys != m_pGroups->IterEnd () ; iterDummys++ ) { CDummy* pDummy = *iterDummys; if ( pDummy != m_pRootElement ) { EntityPacket.Add ( pDummy ); } } // Add the objects to the packet CObjectListType::const_iterator iterObjects = m_pObjectManager->IterBegin (); for ( ; iterObjects != m_pObjectManager->IterEnd (); iterObjects++ ) { EntityPacket.Add ( *iterObjects ); } // Add the pickups to the packet list < CPickup* > ::const_iterator iterPickups = m_pPickupManager->IterBegin (); for ( ; iterPickups != m_pPickupManager->IterEnd (); iterPickups++ ) { EntityPacket.Add ( *iterPickups ); } // Add the vehicles to the packet list < CVehicle* > ::const_iterator iterVehicles = m_pVehicleManager->IterBegin (); for ( ; iterVehicles != m_pVehicleManager->IterEnd (); iterVehicles++ ) { EntityPacket.Add ( *iterVehicles ); } // Add the teams to the packet list < CTeam* > ::const_iterator iterTeams = m_pTeamManager->IterBegin (); for ( ; iterTeams != m_pTeamManager->IterEnd (); iterTeams++ ) { EntityPacket.Add ( *iterTeams ); } // Add the peds to the packet list < CPed* > ::const_iterator iterPeds = m_pPedManager->IterBegin (); for ( ; iterPeds != m_pPedManager->IterEnd (); iterPeds++ ) { EntityPacket.Add ( *iterPeds ); } // Add the colshapes to the packet vector < CColShape* > ::const_iterator iterColShapes = m_pColManager->IterBegin (); for ( ; iterColShapes != m_pColManager->IterEnd (); iterColShapes++ ) { CColShape * pColShape = *iterColShapes; if ( !pColShape->IsPartnered () ) { EntityPacket.Add ( *iterColShapes ); } } // Add the water polys to the packet CWaterManager* pWaterManager = g_pGame->GetWaterManager (); list < CWater* > ::const_iterator iterWater = pWaterManager->IterBegin (); for ( ; iterWater != pWaterManager->IterEnd (); iterWater++ ) { CWater* pWater = *iterWater; EntityPacket.Add ( pWater ); } // Send it Player.Send ( EntityPacket ); // Send per-player entities SendPerPlayerEntities ( Player ); // Send the trailer attachments CVehicle* pVehicle; CVehicle* pTowedVehicle; iterVehicles = m_pVehicleManager->IterBegin (); for ( ; iterVehicles != m_pVehicleManager->IterEnd (); iterVehicles++ ) { pVehicle = *iterVehicles; pTowedVehicle = pVehicle->GetTowedVehicle ( ); if ( pTowedVehicle ) { CVehicleTrailerPacket AttachPacket ( pVehicle, pTowedVehicle, true ); Player.Send ( AttachPacket ); } } }
void CMapManager::BroadcastMapInformation ( void ) { // Start an entity list packet CEntityAddPacket EntityPacket; // Add the dummys to the packet list < CDummy* > ::const_iterator iterDummys = m_pGroups->IterBegin (); for ( ; iterDummys != m_pGroups->IterEnd () ; iterDummys++ ) { CDummy* pDummy = *iterDummys; if ( pDummy != m_pRootElement ) { EntityPacket.Add ( pDummy ); } } // Add the objects to the packet CObjectListType::const_iterator iterObjects = m_pObjectManager->IterBegin (); for ( ; iterObjects != m_pObjectManager->IterEnd (); iterObjects++ ) { EntityPacket.Add ( *iterObjects ); } // Add the pickups to the packet list < CPickup* > ::const_iterator iterPickups = m_pPickupManager->IterBegin (); for ( ; iterPickups != m_pPickupManager->IterEnd (); iterPickups++ ) { (*iterPickups)->Randomize (); EntityPacket.Add ( *iterPickups ); } // Add the vehicles to the packet list < CVehicle* > ::const_iterator iterVehicles = m_pVehicleManager->IterBegin (); for ( ; iterVehicles != m_pVehicleManager->IterEnd (); iterVehicles++ ) { EntityPacket.Add ( *iterVehicles ); } // Add the teams to the packet list < CTeam* > ::const_iterator iterTeams = m_pTeamManager->IterBegin (); for ( ; iterTeams != m_pTeamManager->IterEnd (); iterTeams++ ) { EntityPacket.Add ( *iterTeams ); } // Add the peds to the packet list < CPed* > ::const_iterator iterPeds = m_pPedManager->IterBegin (); for ( ; iterPeds != m_pPedManager->IterEnd (); iterPeds++ ) { EntityPacket.Add ( *iterPeds ); } // Add the colshapes to the packet vector < CColShape* > ::const_iterator iterColShapes = m_pColManager->IterBegin (); for ( ; iterColShapes != m_pColManager->IterEnd (); iterColShapes++ ) { CColShape * pColShape = *iterColShapes; if ( !pColShape->IsPartnered () ) { EntityPacket.Add ( *iterColShapes ); } } // Send it m_pPlayerManager->BroadcastOnlyJoined ( EntityPacket ); // Tell each player individually about the per-player entities list < CPlayer* > ::const_iterator iterPlayers = m_pPlayerManager->IterBegin (); for ( ; iterPlayers != m_pPlayerManager->IterEnd (); iterPlayers++ ) { SendPerPlayerEntities ( **iterPlayers ); SendBlips ( **iterPlayers ); } }
void CMapManager::SendMapInformation ( CPlayer& Player ) { CTimeUsMarker < 20 > marker; marker.Set ( "Start" ); // Start an entity list packet CEntityAddPacket EntityPacket; // Add the dummys to the packet list < CDummy* > ::const_iterator iterDummys = m_pGroups->IterBegin (); for ( ; iterDummys != m_pGroups->IterEnd () ; iterDummys++ ) { CDummy* pDummy = *iterDummys; if ( pDummy != m_pRootElement ) { EntityPacket.Add ( pDummy ); } } marker.Set ( "Dummys" ); // Add the objects to the packet CObjectListType::const_iterator iterObjects = m_pObjectManager->IterBegin (); for ( ; iterObjects != m_pObjectManager->IterEnd (); iterObjects++ ) { EntityPacket.Add ( *iterObjects ); } marker.Set ( "Objects" ); // Add the pickups to the packet list < CPickup* > ::const_iterator iterPickups = m_pPickupManager->IterBegin (); for ( ; iterPickups != m_pPickupManager->IterEnd (); iterPickups++ ) { EntityPacket.Add ( *iterPickups ); } marker.Set ( "Pickups" ); // Add the vehicles to the packet list < CVehicle* > ::const_iterator iterVehicles = m_pVehicleManager->IterBegin (); for ( ; iterVehicles != m_pVehicleManager->IterEnd (); iterVehicles++ ) { EntityPacket.Add ( *iterVehicles ); } marker.Set ( "Vehicles" ); // Add the teams to the packet list < CTeam* > ::const_iterator iterTeams = m_pTeamManager->IterBegin (); for ( ; iterTeams != m_pTeamManager->IterEnd (); iterTeams++ ) { EntityPacket.Add ( *iterTeams ); } marker.Set ( "Teams" ); // Add the peds to the packet list < CPed* > ::const_iterator iterPeds = m_pPedManager->IterBegin (); for ( ; iterPeds != m_pPedManager->IterEnd (); iterPeds++ ) { EntityPacket.Add ( *iterPeds ); } marker.Set ( "Peds" ); // Add the colshapes to the packet vector < CColShape* > ::const_iterator iterColShapes = m_pColManager->IterBegin (); for ( ; iterColShapes != m_pColManager->IterEnd (); iterColShapes++ ) { CColShape * pColShape = *iterColShapes; if ( !pColShape->IsPartnered () ) { EntityPacket.Add ( *iterColShapes ); } } marker.Set ( "ColShapes" ); // Add the water polys to the packet CWaterManager* pWaterManager = g_pGame->GetWaterManager (); list < CWater* > ::const_iterator iterWater = pWaterManager->IterBegin (); for ( ; iterWater != pWaterManager->IterEnd (); iterWater++ ) { CWater* pWater = *iterWater; EntityPacket.Add ( pWater ); } marker.Set ( "Water" ); // Send it Player.Send ( EntityPacket ); marker.Set ( "SendEntityPacket" ); // Send per-player entities SendPerPlayerEntities ( Player ); marker.Set ( "SendPerPlayerEntities" ); // Send the trailer attachments CVehicle* pVehicle; CVehicle* pTowedVehicle; iterVehicles = m_pVehicleManager->IterBegin (); for ( ; iterVehicles != m_pVehicleManager->IterEnd (); iterVehicles++ ) { pVehicle = *iterVehicles; pTowedVehicle = pVehicle->GetTowedVehicle ( ); if ( pTowedVehicle ) { CVehicleTrailerPacket AttachPacket ( pVehicle, pTowedVehicle, true ); Player.Send ( AttachPacket ); } } marker.Set ( "SendAttachPackets" ); // Add debug info if wanted if ( CPerfStatDebugInfo::GetSingleton ()->IsActive ( "SendMapInformation" ) ) CPerfStatDebugInfo::GetSingleton ()->AddLine ( "SendMapInformation", marker.GetString () ); }