void CNetGame::Packet_VehicleSync(Packet* p) { CPlayer* pPlayer = this->playerPool->GetPlayer((_PlayerID)p->playerIndex); RakNet::BitStream bsVehicleSync((char*)p->data, p->length, false); if(this->gameState != 1) return; uint8_t bytePacketID=0; IN_VEHICLE_SYNC icSync; bsVehicleSync.Read(bytePacketID); #ifdef _BIG_ENDIAN_SYSTEM bsVehicleSync.Read(icSync.vehicleID); bsVehicleSync.Read(icSync.leftRightKeysOnVehicle); bsVehicleSync.Read(icSync.updownKeysOnVehicle); bsVehicleSync.Read(icSync.keysOnVehicle); bsVehicleSync.Read(icSync.rotation.W), bsVehicleSync.Read(icSync.rotation.X), bsVehicleSync.Read(icSync.rotation.Y), bsVehicleSync.Read(icSync.rotation.Z); bsVehicleSync.Read(icSync.position.X), bsVehicleSync.Read(icSync.position.Y), bsVehicleSync.Read(icSync.position.Z); bsVehicleSync.Read(icSync.velocity.X), bsVehicleSync.Read(icSync.velocity.Y), bsVehicleSync.Read(icSync.velocity.Z); bsVehicleSync.Read(icSync.health); bsVehicleSync.Read(icSync.playerHealth); bsVehicleSync.Read(icSync.playerArmor); bsVehicleSync.Read(icSync.playerWeapon); bsVehicleSync.Read(icSync.sirenType); bsVehicleSync.Read(icSync.gearState); bsVehicleSync.Read(icSync.trailerID); bsVehicleSync.Read(icSync.hydraReactorAngle[0]), bsVehicleSync.Read(icSync.hydraReactorAngle[1]); icSync.trainSpeed = ((icSync.hydraReactorAngle[0] << 16) | ((icSync.hydraReactorAngle[1]) & 0xFFFF)); #else bsVehicleSync.Read((char*)&icSync,sizeof(IN_VEHICLE_SYNC)); #endif if(pPlayer) { if(icSync.vehicleID == INVALID_VEHICLE_ID) { this->KickPlayer((_PlayerID)p->playerIndex); return; } if( icSync.velocity.X < 100.0f && icSync.velocity.X > -100.0f && icSync.velocity.Y < 100.0f && icSync.velocity.Y > -100.0f && icSync.velocity.Z < 100.0f && icSync.velocity.Z > -100.0f ) { pPlayer->ProcessOnVehicleSyncData(&icSync); if( this->gamemodeManager && this->filterscriptsManager ) { if( this->gamemodeManager->OnPlayerUpdate( ( cell )p->playerIndex ) == 0 || this->filterscriptsManager->OnPlayerUpdate( ( cell )p->playerIndex ) == 0 ) pPlayer->setSyncingType( SYNCING_TYPE_NONE ); } } } }
void CNetGame::Packet_VehicleSync(Packet *p) { CPlayer * pPlayer = GetPlayerPool()->GetAt((BYTE)p->playerIndex); RakNet::BitStream bsVehicleSync(p->data, p->length, false); if(GetGameState() != GAMESTATE_RUNNING) return; BYTE bytePacketID=0; INCAR_SYNC_DATA icSync; bsVehicleSync.Read(bytePacketID); bsVehicleSync.Read((PCHAR)&icSync,sizeof(INCAR_SYNC_DATA)); if(pPlayer) { if(icSync.VehicleID == 0xFFFF) { // Syncing a manually added/bad vehicle KickPlayer((BYTE)p->playerIndex); return; } pPlayer->StoreInCarFullSyncData(&icSync); } }
void Packet_VehicleSync(Packet *p) { //Log("Packet_VehicleSync: %d %d", pRakServer->GetIndexFromPlayerID(p->playerId), p->length); RakNet::BitStream bsVehicleSync((unsigned char *)p->data, p->length, false); PLAYERID playerId = pRakServer->GetIndexFromPlayerID(p->playerId); // clear last data memset(&playerInfo[playerId].incarData, 0, sizeof(INCAR_SYNC_DATA)); bsVehicleSync.IgnoreBits(8); bsVehicleSync.Read((PCHAR)&playerInfo[playerId].incarData, sizeof(INCAR_SYNC_DATA)); playerPool[playerId].currentVehicleID = playerInfo[playerId].incarData.VehicleID; // BROADCAST DATA RakNet::BitStream bsInVehicleBC; bsInVehicleBC.Write((BYTE)ID_VEHICLE_SYNC); bsInVehicleBC.Write(playerId); bsInVehicleBC.Write(playerInfo[playerId].incarData.VehicleID); bsInVehicleBC.Write(playerInfo[playerId].incarData.lrAnalog); bsInVehicleBC.Write(playerInfo[playerId].incarData.udAnalog); bsInVehicleBC.Write(playerInfo[playerId].incarData.wKeys); bsInVehicleBC.WriteNormQuat( playerInfo[playerId].incarData.fQuaternion[0], playerInfo[playerId].incarData.fQuaternion[1], playerInfo[playerId].incarData.fQuaternion[2], playerInfo[playerId].incarData.fQuaternion[3]); bsInVehicleBC.Write(playerInfo[playerId].incarData.vecPos[0]); bsInVehicleBC.Write(playerInfo[playerId].incarData.vecPos[1]); bsInVehicleBC.Write(playerInfo[playerId].incarData.vecPos[2]); bsInVehicleBC.WriteVector(playerInfo[playerId].incarData.vecMoveSpeed[0], playerInfo[playerId].incarData.vecMoveSpeed[1], playerInfo[playerId].incarData.vecMoveSpeed[2]); WORD wTempVehicleHealh = (WORD)playerInfo[playerId].incarData.fCarHealth; bsInVehicleBC.Write(wTempVehicleHealh); BYTE byteSyncHealthArmour=0; BYTE byteHealth = playerInfo[playerId].incarData.bytePlayerHealth; BYTE byteArmour = playerInfo[playerId].incarData.bytePlayerArmour; if( byteHealth > 0 && byteHealth < 100 ) { byteSyncHealthArmour = ((BYTE)(byteHealth / 7)) << 4; } else if(byteHealth >= 100) { byteSyncHealthArmour = 0xF << 4; } if( byteArmour > 0 && byteArmour < 100 ) { byteSyncHealthArmour |= (BYTE)(byteArmour / 7); } else if(byteArmour >= 100) { byteSyncHealthArmour |= 0xF; } bsInVehicleBC.Write(byteSyncHealthArmour); bsInVehicleBC.Write(playerInfo[playerId].incarData.byteCurrentWeapon); if(playerInfo[playerId].incarData.byteSirenOn) bsInVehicleBC.Write(true); else bsInVehicleBC.Write(false); if(playerInfo[playerId].incarData.byteLandingGearState) bsInVehicleBC.Write(true); else bsInVehicleBC.Write(false); // HYDRA THRUST ANGLE AND TRAILER ID bsInVehicleBC.Write(false); bsInVehicleBC.Write(false); DWORD dwTrailerID_or_ThrustAngle = 0; bsInVehicleBC.Write(dwTrailerID_or_ThrustAngle); // TRAIN SPECIAL bsInVehicleBC.Write(false); /*WORD wSpeed; bsSync.ReadCompressed(bTrain); if(bTrain) { bsSync.Read(wSpeed); playerInfo[playerId].incarData.fTrainSpeed = (float)wSpeed; }*/ UpdatePosition(playerId, playerInfo[playerId].incarData.vecPos[0], playerInfo[playerId].incarData.vecPos[1], playerInfo[playerId].incarData.vecPos[2]); pRakServer->Send(&bsInVehicleBC, HIGH_PRIORITY, UNRELIABLE_SEQUENCED, 0, p->playerId, TRUE); }