Beispiel #1
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 );
            }
        }
    }
}
Beispiel #2
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 );
            }
        }
    }
}
Beispiel #3
0
void CElementRPCs::SetElementInterior ( NetBitStreamInterface& bitStream )
{
    ElementID ID;
    unsigned char ucInterior, ucSetPosition;
    if ( bitStream.Read ( ID ) && bitStream.Read ( ucInterior ) && bitStream.Read ( ucSetPosition ) )
    {
        CClientEntity* pEntity = CElementIDs::GetElement ( ID );
        if ( pEntity )
        {
            pEntity->SetInterior ( ucInterior );

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