Exemple #1
0
void CElementRPCs::SetElementHealth ( NetBitStreamInterface& bitStream )
{
    ElementID ID;
    float fHealth;
    unsigned char ucTimeContext;
    if ( bitStream.Read ( ID ) &&
         bitStream.Read ( fHealth ) &&
         bitStream.Read ( ucTimeContext ) )
    {
        CClientEntity * pEntity = CElementIDs::GetElement ( ID );
        if ( pEntity )
        {
            pEntity->SetSyncTimeContext ( ucTimeContext );

            switch ( pEntity->GetType () )
            {
                case CCLIENTPED:
                case CCLIENTPLAYER:
                {
                    CClientPed* pPed = static_cast < CClientPed * > ( pEntity );                    
                    pPed->SetHealth ( fHealth );
                    break;
                }

                case CCLIENTVEHICLE:
                {
                    CClientVehicle* pVehicle = static_cast < CClientVehicle * > ( pEntity );
                    pVehicle->SetHealth ( fHealth );
                    break;
                }
            }
        }
    }
}
Exemple #2
0
void CElementRPCs::SetElementPosition ( NetBitStreamInterface& bitStream )
{
    // Read out the entity id and the position
    ElementID ID;
    CVector vecPosition;
    unsigned char ucTimeContext;
    if ( bitStream.Read ( ID ) &&
         bitStream.Read ( vecPosition.fX ) &&
         bitStream.Read ( vecPosition.fY ) &&
         bitStream.Read ( vecPosition.fZ ) &&
         bitStream.Read ( ucTimeContext ) )
    {
        // Grab the entity
        CClientEntity* pEntity = CElementIDs::GetElement ( ID );
        if ( pEntity )
        {            
            // Update the sync context to the new one
            pEntity->SetSyncTimeContext ( ucTimeContext );

            // If it's a player, use Teleport
            if ( pEntity->GetType () == CCLIENTPLAYER )
            {
                unsigned char ucWarp = 1;
                bitStream.Read ( ucWarp );

                CClientPlayer* pPlayer = static_cast < CClientPlayer* > ( pEntity );

                if ( ucWarp )
                {
                    pPlayer->Teleport ( vecPosition );
                    pPlayer->ResetInterpolation ();
                }
                else
                {
                    pPlayer->SetPosition ( vecPosition );
                }

                // If local player, reset return position (so we can't warp back if connection fails)
                if ( pPlayer->IsLocalPlayer () )
                {
                    m_pClientGame->GetNetAPI ()->ResetReturnPosition ();
                }
            }
            else if ( pEntity->GetType () == CCLIENTVEHICLE ) 
            {
                CClientVehicle* pVehicle = static_cast < CClientVehicle* > ( pEntity );
                pVehicle->RemoveTargetPosition ();
                pVehicle->SetPosition ( vecPosition );
            }
            else
            {
                // Set its position
                pEntity->SetPosition ( vecPosition );
            }
        }
    }
}
Exemple #3
0
void CElementRPCs::DetachElements ( NetBitStreamInterface& bitStream )
{
    ElementID ID;
    unsigned char ucTimeContext;
    if ( bitStream.Read ( ID ) &&
         bitStream.Read ( ucTimeContext ) )
    {
        CClientEntity* pEntity = CElementIDs::GetElement ( ID );
        if ( pEntity )
        {
            pEntity->SetSyncTimeContext ( ucTimeContext );
            pEntity->AttachTo ( NULL );

            CVector vecPosition;
            if ( bitStream.Read ( vecPosition.fX ) &&
                 bitStream.Read ( vecPosition.fY ) &&
                 bitStream.Read ( vecPosition.fZ ) )
            {
                pEntity->SetPosition ( vecPosition );
            }
        }
    }
}