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 ); } } } }
void CElementRPCs::SetElementVelocity ( NetBitStreamInterface& bitStream ) { // Read out the entity id and the speed ElementID ID; CVector vecVelocity; if ( bitStream.Read ( ID ) && bitStream.Read ( vecVelocity.fX ) && bitStream.Read ( vecVelocity.fY ) && bitStream.Read ( vecVelocity.fZ ) ) { // Grab the entity CClientEntity* pEntity = CElementIDs::GetElement ( ID ); if ( pEntity ) { switch ( pEntity->GetType () ) { case CCLIENTPED: case CCLIENTPLAYER: { CClientPed* pPed = static_cast < CClientPed* > ( pEntity ); pPed->SetMoveSpeed ( vecVelocity ); pPed->ResetInterpolation (); // If local player, reset return position (so we can't warp back if connection fails) if ( pPed->IsLocalPlayer () ) { m_pClientGame->GetNetAPI ()->ResetReturnPosition (); } break; } case CCLIENTVEHICLE: { CClientVehicle* pVehicle = static_cast < CClientVehicle* > ( pEntity ); pVehicle->SetMoveSpeed ( vecVelocity ); break; } case CCLIENTOBJECT: { CClientObject * pObject = static_cast < CClientObject * > ( pEntity ); pObject->SetMoveSpeed ( vecVelocity ); break; } } } } }
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 ); } } }