Beispiel #1
0
void CPedRPCs::SetPedRotation ( CClientEntity* pSource, NetBitStreamInterface& bitStream )
{
    SPedRotationSync rotation;
    unsigned char ucTimeContext;
    if ( bitStream.Read ( &rotation ) &&
         bitStream.Read ( ucTimeContext ) )
    {
        uchar ucNewWay = 0;
        if ( bitStream.GetNumberOfBytesUsed () > 0 )
            bitStream.Read ( ucNewWay );

        CClientPed* pPed = m_pPedManager->Get ( pSource->GetID (), true );
        if ( pPed )
        {
            if ( ucNewWay == 1 )
                pPed->SetCurrentRotationNew ( rotation.data.fRotation );
            else
                pPed->SetCurrentRotation ( rotation.data.fRotation );

            if ( !IS_PLAYER ( pPed ) )
                pPed->SetCameraRotation ( rotation.data.fRotation );
            pPed->SetSyncTimeContext ( ucTimeContext );
        }
    }
}
Beispiel #2
0
void CPedSync::Packet_PedSync ( NetBitStreamInterface& BitStream )
{
    // While we're not out of peds
    while ( BitStream.GetNumberOfUnreadBits () > 32 )
    {
        // Read out the ped id
        ElementID ID;
        if ( BitStream.Read ( ID ) )
        {
            // Read out the sync time context. See CClientEntity for documentation on that.
            unsigned char ucSyncTimeContext = 0;
            BitStream.Read ( ucSyncTimeContext );

            unsigned char ucFlags = 0;
            BitStream.Read ( ucFlags );

            CVector vecPosition, vecMoveSpeed;
            float fRotation, fHealth, fArmor;

            // Read out the position
            if ( ucFlags & 0x01 )
            {
                BitStream.Read ( vecPosition.fX );
                BitStream.Read ( vecPosition.fY );
                BitStream.Read ( vecPosition.fZ );
            }

            // And rotation
            if ( ucFlags & 0x02 ) BitStream.Read ( fRotation );

            // And the move speed
            if ( ucFlags & 0x04 )
            {
                BitStream.Read ( vecMoveSpeed.fX );
                BitStream.Read ( vecMoveSpeed.fY );
                BitStream.Read ( vecMoveSpeed.fZ );
            }

            // And health with armour
            if ( ucFlags & 0x08 ) BitStream.Read ( fHealth );
            if ( ucFlags & 0x10 ) BitStream.Read ( fArmor );

            // Grab the ped. Only update the sync if this packet is from the same context.
            CClientPed* pPed = m_pPedManager->Get ( ID );
            if ( pPed && pPed->CanUpdateSync ( ucSyncTimeContext ) )
            {
                if ( ucFlags & 0x01 ) pPed->SetPosition ( vecPosition );
                if ( ucFlags & 0x02 ) pPed->SetCurrentRotation ( fRotation );
                if ( ucFlags & 0x04 ) pPed->SetMoveSpeed ( vecMoveSpeed );
                if ( ucFlags & 0x08 ) pPed->LockHealth ( fHealth );
                if ( ucFlags & 0x10 ) pPed->LockArmor ( fArmor );
            }
        }
    }
}
//
// Apply object movement to contacting peds
//
void CDeathmatchObject::UpdateContacting(const CVector& vecCenterOfRotation, const CVector& vecFrameTranslation, const CVector& vecFrameRotation)
{
    bool bHasRotation = (vecFrameRotation.fX != 0 || vecFrameRotation.fY != 0 || vecFrameRotation.fZ != 0);
    bool bHasTranslation = (vecFrameTranslation.fX != 0 || vecFrameTranslation.fY != 0 || vecFrameTranslation.fZ != 0);

    // Early out if no orientation change here
    if (!bHasRotation && !bHasTranslation)
        return;

    // Step through each contacting ped
    list<CClientPed*>::iterator iter = m_Contacts.begin();
    for (; iter != m_Contacts.end(); ++iter)
    {
        CClientPed* pPed = *iter;

        // Do not move the ped if it is frozen
        if (pPed->IsFrozen())
            continue;

        // Get ped start position
        CVector vecPlayerPosition;
        pPed->GetPosition(vecPlayerPosition);

        // Apply rotation effect on position
        if (bHasRotation)
        {
            vecPlayerPosition -= vecCenterOfRotation;
            RotateVector(vecPlayerPosition, CVector(-vecFrameRotation.fX, -vecFrameRotation.fY, -vecFrameRotation.fZ));
            vecPlayerPosition += vecCenterOfRotation;
        }

        // Apply translation
        vecPlayerPosition += vecFrameTranslation;
        pPed->SetPosition(vecPlayerPosition);

        // Also change ped facing direction
        if (vecFrameRotation.fZ != 0)
        {
            float fRotationZ = pPed->GetCurrentRotation();
            pPed->SetCurrentRotation(fRotationZ + vecFrameRotation.fZ);
        }
    }

    // Look in attached objects for more ped contacts
    for (uint i = 0; i < m_AttachedEntities.size(); ++i)
    {
        CClientEntity* pEntity = m_AttachedEntities[i];
        if (IS_OBJECT(pEntity))
        {
            CDeathmatchObject* pObject = static_cast<CDeathmatchObject*>(pEntity);
            pObject->UpdateContacting(vecCenterOfRotation, vecFrameTranslation, vecFrameRotation);
        }
    }
}
Beispiel #4
0
void CPedSync::Packet_PedStartSync ( NetBitStreamInterface& BitStream )
{
    // Read out the element id
    ElementID ID;
    if ( BitStream.Read ( ID ) )
    {
        // Grab the ped
        CClientPed* pPed = static_cast < CClientPed* > ( m_pPedManager->Get ( ID ) );
        if ( pPed )
        {
            // Read out the position
            CVector vecPosition;
            BitStream.Read ( vecPosition.fX );
            BitStream.Read ( vecPosition.fY );
            BitStream.Read ( vecPosition.fZ );

            // And rotation
            float fRotation;
            BitStream.Read ( fRotation );

            // And the velocity
            CVector vecVelocity;
            BitStream.Read ( vecVelocity.fX );
            BitStream.Read ( vecVelocity.fY );
            BitStream.Read ( vecVelocity.fZ );

            // And health/armor
            float fHealth, fArmor;
            BitStream.Read ( fHealth );
            BitStream.Read ( fArmor );

            // Set data
            pPed->SetPosition ( vecPosition );
            pPed->SetCurrentRotation ( fRotation );
            pPed->SetMoveSpeed ( vecVelocity );

            // Set the new health
            pPed->SetHealth ( fHealth );
            pPed->SetArmor ( fArmor );

            // Unlock health and armour for the syncer
            pPed->UnlockHealth ();
            pPed->UnlockArmor ();

            AddPed ( pPed );
        }
    }
}