예제 #1
0
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 );
    }
}
예제 #2
0
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);
        }
    }
}
예제 #3
0
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 );
}
예제 #4
0
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 () );
}
예제 #5
0
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 );
}
예제 #6
0
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 );
    }
}
예제 #7
0
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 );
    }
}
예제 #8
0
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;
}
예제 #9
0
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 );
    }
}
예제 #10
0
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 );
    }
}
예제 #11
0
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 );
        }
    }
}
예제 #12
0
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 );
    }
}
예제 #13
0
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 () );
}