// getVehicleAngularVelocity(vehicleid) CVector3 CVehicleModuleNatives::GetAngularVelocity(EntityId vehicleid) { if(g_pVehicleManager->DoesExist(vehicleid)) { CVehicle * pVehicle = g_pVehicleManager->GetAt(vehicleid); if(pVehicle) { CVector3 vecTurnSpeed; pVehicle->GetTurnSpeed(vecTurnSpeed); return vecTurnSpeed; } } return CVector3(); }
void CLocalPlayer::SendInCarFullSyncData() { if(m_pPlayerPed) { RakNet::BitStream bsVehicleSync; VEHICLE_SYNC_DATA vehicleSyncData; MATRIX4X4 matVehicle; CVehicleManager * pVehicleManager = pNetowkManager->GetVehicleManager(); CVehicle * pGameVehicle = NULL; // write packet id bsVehicleSync.Write((MessageID)ID_VEHICLE_SYNC); vehicleSyncData.vehicleID = pVehicleManager->FindIDFromGtaPtr(m_pPlayerPed->GetGtaVehicle()); // make sure we have a valid vehicle if(vehicleSyncData.vehicleID == INVALID_ENTITY_ID) { return; } // get the player keys vehicleSyncData.wKeys = m_pPlayerPed->GetKeys(); // get the vehicle pointer pGameVehicle = pVehicleManager->GetAt(vehicleSyncData.vehicleID); // make sure the vehicle pointer is valid if(!pGameVehicle) { return; } // get the vehicle matrix pGameVehicle->GetMatrix(&matVehicle); // copy the roll and direction vectors memcpy(&vehicleSyncData.vecRoll, &matVehicle.vLookRight, sizeof(Vector3)); memcpy(&vehicleSyncData.vecDirection, &matVehicle.vLookUp, sizeof(Vector3)); // pack the roll and direction vectors //CompressVector1(&matVehicle.vLookRight, &vehicleSyncData.cvecRoll); //CompressVector1(&matVehicle.vLookUp, &vehicleSyncData.cvecDirection); // copy the vehicle position memcpy(&vehicleSyncData.vecPos, &matVehicle.vPos, sizeof(Vector3)); // get the vehicle move speed pGameVehicle->GetMoveSpeed(&vehicleSyncData.vecMoveSpeed); // get the vehicle turn speed pGameVehicle->GetTurnSpeed(&vehicleSyncData.vecTurnSpeed); // pack the vehicle health vehicleSyncData.byteVehicleHealth = PACK_VEHICLE_HEALTH(pGameVehicle->GetHealth()); // get the player health (casted to a byte to save space) vehicleSyncData.bytePlayerHealth = (BYTE)m_pPlayerPed->GetHealth(); // get the player armour (casted to a byte to save space) vehicleSyncData.bytePlayerArmour = (BYTE)m_pPlayerPed->GetArmour(); // write vehicle sync struct to bit stream bsVehicleSync.Write((char *)&vehicleSyncData, sizeof(VEHICLE_SYNC_DATA)); // send sync data pNetowkManager->GetRakPeer()->Send(&bsVehicleSync,HIGH_PRIORITY,UNRELIABLE_SEQUENCED,0,UNASSIGNED_SYSTEM_ADDRESS,TRUE); } }
bool CVehiclePuresyncPacket::Write ( NetBitStreamInterface& BitStream ) const { // Got a player to send? if ( m_pSourceElement ) { CPlayer * pSourcePlayer = static_cast < CPlayer * > ( m_pSourceElement ); // Player is in a vehicle and is the driver? CVehicle* pVehicle = pSourcePlayer->GetOccupiedVehicle (); if ( pVehicle ) { // Player ID ElementID PlayerID = pSourcePlayer->GetID (); BitStream.Write ( PlayerID ); // Write the time context of that player BitStream.Write ( pSourcePlayer->GetSyncTimeContext () ); // Write his ping divided with 2 plus a small number so the client can find out when this packet was sent unsigned short usLatency = pSourcePlayer->GetPing (); BitStream.WriteCompressed ( usLatency ); // Write the keysync data CControllerState ControllerState = pSourcePlayer->GetPad ()->GetCurrentControllerState (); WriteFullKeysync ( ControllerState, BitStream ); // Write the vehicle matrix only if he's the driver CVector vecTemp; unsigned int uiSeat = pSourcePlayer->GetOccupiedVehicleSeat (); if ( uiSeat == 0 ) { // Vehicle position SPositionSync position ( false ); position.data.vecPosition = pVehicle->GetPosition (); BitStream.Write ( &position ); // Vehicle rotation SRotationDegreesSync rotation; pVehicle->GetRotationDegrees ( rotation.data.vecRotation ); BitStream.Write ( &rotation ); // Move speed vector SVelocitySync velocity; velocity.data.vecVelocity = pVehicle->GetVelocity (); BitStream.Write ( &velocity ); // Turn speed vector SVelocitySync turnSpeed; turnSpeed.data.vecVelocity = pVehicle->GetTurnSpeed (); BitStream.Write ( &turnSpeed ); // Health SVehicleHealthSync health; health.data.fValue = pVehicle->GetHealth (); BitStream.Write ( &health ); } // Player health and armor SPlayerHealthSync health; health.data.fValue = pSourcePlayer->GetHealth (); BitStream.Write ( &health ); SPlayerArmorSync armor; armor.data.fValue = pSourcePlayer->GetArmor (); BitStream.Write ( &armor ); // Weapon unsigned char ucWeaponType = pSourcePlayer->GetWeaponType (); // Flags SVehiclePuresyncFlags flags; flags.data.bIsWearingGoggles = pSourcePlayer->IsWearingGoggles (); flags.data.bIsDoingGangDriveby = pSourcePlayer->IsDoingGangDriveby (); flags.data.bIsSirenOrAlarmActive = pVehicle->IsSirenActive (); flags.data.bIsSmokeTrailEnabled = pVehicle->IsSmokeTrailEnabled (); flags.data.bIsLandingGearDown = pVehicle->IsLandingGearDown (); flags.data.bIsOnGround = pVehicle->IsOnGround (); flags.data.bIsInWater = pVehicle->IsInWater (); flags.data.bIsDerailed = pVehicle->IsDerailed (); flags.data.bIsAircraft = ( pVehicle->GetVehicleType () == VEHICLE_PLANE || pVehicle->GetVehicleType () == VEHICLE_HELI ); flags.data.bHasAWeapon = ( ucWeaponType != 0 ); flags.data.bIsHeliSearchLightVisible = pVehicle->IsHeliSearchLightVisible (); BitStream.Write ( &flags ); // Write the weapon stuff if ( flags.data.bHasAWeapon ) { // Write the weapon slot SWeaponSlotSync slot; slot.data.uiSlot = pSourcePlayer->GetWeaponSlot (); BitStream.Write ( &slot ); if ( flags.data.bIsDoingGangDriveby && CWeaponNames::DoesSlotHaveAmmo ( slot.data.uiSlot ) ) { // Write the ammo states SWeaponAmmoSync ammo ( ucWeaponType, false, true ); ammo.data.usAmmoInClip = pSourcePlayer->GetWeaponAmmoInClip (); BitStream.Write ( &ammo ); // Sync aim data SWeaponAimSync aim ( 0.0f, true ); aim.data.vecOrigin = pSourcePlayer->GetSniperSourceVector (); pSourcePlayer->GetTargettingVector ( aim.data.vecTarget ); aim.data.fArm = pSourcePlayer->GetAimDirection (); BitStream.Write ( &aim ); // Sync driveby direction SDrivebyDirectionSync driveby; driveby.data.ucDirection = pSourcePlayer->GetDriveByDirection (); BitStream.Write ( &driveby ); } } // Vehicle specific data only if he's the driver if ( uiSeat == 0 ) { WriteVehicleSpecific ( pVehicle, BitStream ); } // Write vehicle_look_left and vehicle_look_right control states when // it's an aircraft. if ( flags.data.bIsAircraft ) { BitStream.WriteBit ( ControllerState.LeftShoulder2 != 0 ); BitStream.WriteBit ( ControllerState.RightShoulder2 != 0 ); } // Success return true; } } return false; }