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 CPedSync::Packet_PedStopSync ( NetBitStreamInterface& BitStream ) { // Read out the ped id ElementID ID; if ( BitStream.Read ( ID ) ) { // Grab the ped CClientPed* pPed = static_cast < CClientPed* > ( m_pPedManager->Get ( ID ) ); if ( pPed ) { // Lock health and armour pPed->LockHealth ( pPed->GetHealth() ); pPed->LockArmor ( pPed->GetArmor() ); // Stop syncing it RemovePed ( pPed ); } } }
void CElementRPCs::SetElementHealth ( CClientEntity* pSource, NetBitStreamInterface& bitStream ) { float fHealth; unsigned char ucTimeContext; if ( bitStream.Read ( fHealth ) && bitStream.Read ( ucTimeContext ) ) { pSource->SetSyncTimeContext ( ucTimeContext ); switch ( pSource->GetType () ) { case CCLIENTPED: case CCLIENTPLAYER: { CClientPed* pPed = static_cast < CClientPed * > ( pSource ); if ( pPed->IsHealthLocked() ) pPed->LockHealth ( fHealth ); else pPed->SetHealth ( fHealth ); break; } case CCLIENTVEHICLE: { CClientVehicle* pVehicle = static_cast < CClientVehicle * > ( pSource ); pVehicle->SetHealth ( fHealth ); break; } case CCLIENTOBJECT: case CCLIENTWEAPON: { CClientObject* pObject = static_cast < CClientObject * > ( pSource ); pObject->SetHealth ( fHealth ); break; } } } }