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 ); } } }
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); } } }
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 ); } } }