@@ -881,7 +881,9 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
881881 || (aimSync.CamMode >= 48u && aimSync.CamMode <= 50u )
882882 || aimSync.CamMode == 52u || aimSync.CamMode == 54u
883883 || aimSync.CamMode == 60u || aimSync.CamMode == 61u || aimSync.CamMode > 64u )
884+ {
884885 aimSync.CamMode = 4u ;
886+ }
885887
886888 aimSync.PlayerID = player.poolID ;
887889 player.aimSync_ = aimSync;
@@ -1135,13 +1137,19 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
11351137
11361138 ScopedPoolReleaseLock lock (*self.vehiclesComponent , *vehiclePtr);
11371139 IVehicle& vehicle = *lock.entry ;
1138-
11391140 Player& player = static_cast <Player&>(peer);
1141+
1142+ const bool vehicleOk = vehicle.updateFromDriverSync (vehicleSync, player);
1143+
1144+ if (!vehicleOk)
1145+ {
1146+ return false ;
1147+ }
1148+
11401149 player.pos_ = vehicleSync.Position ;
11411150 player.health_ = vehicleSync.PlayerHealthArmour .x ;
11421151 player.armour_ = vehicleSync.PlayerHealthArmour .y ;
11431152 player.armedWeapon_ = player.areWeaponsAllowed () ? vehicleSync.WeaponID : 0 ;
1144- const bool vehicleOk = vehicle.updateFromDriverSync (vehicleSync, player);
11451153
11461154 uint32_t newKeys = vehicleSync.Keys ;
11471155 switch (vehicleSync.AdditionalKey )
@@ -1171,33 +1179,29 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
11711179 }
11721180 player.setState (PlayerState_Driver);
11731181
1174- if (vehicleOk)
1182+ vehicleSync.HasTrailer = false ;
1183+ if (vehicleSync.TrailerID )
11751184 {
1176- vehicleSync.PlayerID = player.poolID ;
1177-
1178- vehicleSync.HasTrailer = false ;
1179- if (vehicleSync.TrailerID )
1185+ IVehicle* trailer = vehicle.getTrailer ();
1186+ if (trailer)
11801187 {
1181- IVehicle* trailer = vehicle.getTrailer ();
1182- if (trailer)
1183- {
1184- vehicleSync.HasTrailer = true ;
1185- vehicleSync.TrailerID = trailer->getID ();
1186- }
1188+ vehicleSync.HasTrailer = true ;
1189+ vehicleSync.TrailerID = trailer->getID ();
11871190 }
1191+ }
11881192
1189- TimePoint now = Time::now ();
1190- bool allowedupdate = self.playerUpdateDispatcher .stopAtFalse (
1191- [&peer, now](PlayerUpdateEventHandler* handler)
1192- {
1193- return handler->onPlayerUpdate (peer, now);
1194- });
1195-
1196- if (allowedupdate)
1193+ TimePoint now = Time::now ();
1194+ bool allowedupdate = self.playerUpdateDispatcher .stopAtFalse (
1195+ [&peer, now](PlayerUpdateEventHandler* handler)
11971196 {
1198- player.vehicleSync_ = vehicleSync;
1199- player.primarySyncUpdateType_ = PrimarySyncUpdateType::Driver;
1200- }
1197+ return handler->onPlayerUpdate (peer, now);
1198+ });
1199+
1200+ if (allowedupdate)
1201+ {
1202+ vehicleSync.PlayerID = player.poolID ;
1203+ player.vehicleSync_ = vehicleSync;
1204+ player.primarySyncUpdateType_ = PrimarySyncUpdateType::Driver;
12011205 }
12021206 return true ;
12031207 }
@@ -1390,7 +1394,9 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
13901394 IVehicle& vehicle = *lock.entry ;
13911395 Player& player = static_cast <Player&>(peer);
13921396
1393- if (vehicle.isRespawning ())
1397+ int vehicleModel = vehicle.getModel ();
1398+ // Check if vehicle is a train carriage (TODO: Move Vehicle::isTrainCarriage to SDK/Components/Vehicles/Impl/vehicle_models.hpp)
1399+ if (vehicle.isRespawning () || (!vehicle.isStreamedInForPlayer (player) && !(vehicleModel == 569 || vehicleModel == 570 )))
13941400 {
13951401 return false ;
13961402 }
@@ -1402,10 +1408,10 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
14021408 return false ;
14031409 }
14041410
1411+ player.pos_ = vehicle.getPosition ();
14051412 player.health_ = passengerSync.HealthArmour .x ;
14061413 player.armour_ = passengerSync.HealthArmour .y ;
14071414 player.armedWeapon_ = player.areWeaponsAllowed () ? passengerSync.WeaponID : 0 ;
1408- player.pos_ = passengerSync.Position ;
14091415
14101416 uint32_t newKeys = passengerSync.Keys ;
14111417 switch (passengerSync.AdditionalKey )
@@ -1435,23 +1441,19 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
14351441 }
14361442 player.setState (PlayerState_Passenger);
14371443
1438- if (vehicleOk)
1439- {
1440- TimePoint now = Time::now ();
1441- bool allowedupdate = self.playerUpdateDispatcher .stopAtFalse (
1442- [&peer, now](PlayerUpdateEventHandler* handler)
1443- {
1444- return handler->onPlayerUpdate (peer, now);
1445- });
1446-
1447- if (allowedupdate)
1444+ TimePoint now = Time::now ();
1445+ bool allowedupdate = self.playerUpdateDispatcher .stopAtFalse (
1446+ [&peer, now](PlayerUpdateEventHandler* handler)
14481447 {
1449- passengerSync.PlayerID = player.poolID ;
1450- player.passengerSync_ = passengerSync;
1451- player.primarySyncUpdateType_ = PrimarySyncUpdateType::Passenger;
1452- }
1453- }
1448+ return handler->onPlayerUpdate (peer, now);
1449+ });
14541450
1451+ if (allowedupdate)
1452+ {
1453+ passengerSync.PlayerID = player.poolID ;
1454+ player.passengerSync_ = passengerSync;
1455+ player.primarySyncUpdateType_ = PrimarySyncUpdateType::Passenger;
1456+ }
14551457 return true ;
14561458 }
14571459 } playerPassengerSyncHandler;
@@ -1473,12 +1475,16 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
14731475 return false ;
14741476 }
14751477
1476- if (unoccupiedSync.AngularVelocity .x < -1 .0f || unoccupiedSync.AngularVelocity .x > 1 .0f || unoccupiedSync.AngularVelocity .y < -1 .0f || unoccupiedSync.AngularVelocity .y > 1 .0f || unoccupiedSync.AngularVelocity .z < -1 .0f || unoccupiedSync.AngularVelocity .z > 1 .0f )
1478+ if (unoccupiedSync.AngularVelocity .x < -1 .0f || unoccupiedSync.AngularVelocity .x > 1 .0f
1479+ || unoccupiedSync.AngularVelocity .y < -1 .0f || unoccupiedSync.AngularVelocity .y > 1 .0f
1480+ || unoccupiedSync.AngularVelocity .z < -1 .0f || unoccupiedSync.AngularVelocity .z > 1 .0f )
14771481 {
14781482 return false ;
14791483 }
14801484
1481- if (glm::abs (1.0 - glm::length (unoccupiedSync.Roll )) >= 0.000001 || glm::abs (1.0 - glm::length (unoccupiedSync.Rotation )) >= 0.000001 || glm::abs (unoccupiedSync.Roll .x * unoccupiedSync.Rotation .x + unoccupiedSync.Roll .y * unoccupiedSync.Rotation .y + unoccupiedSync.Roll .z * unoccupiedSync.Rotation .z ) >= 0.000001 )
1485+ if (glm::abs (1.0 - glm::length (unoccupiedSync.Roll )) >= 0.000001
1486+ || glm::abs (1.0 - glm::length (unoccupiedSync.Rotation )) >= 0.000001
1487+ || glm::abs (glm::dot (unoccupiedSync.Roll , unoccupiedSync.Rotation )) >= 0.000001 )
14821488 {
14831489 return false ;
14841490 }
@@ -1499,15 +1505,26 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
14991505
15001506 IPlayerVehicleData* playerVehicleData = queryExtension<IPlayerVehicleData>(peer);
15011507
1502- if (vehicle.getDriver ())
1508+ if (vehicle.getDriver () || !vehicle. isStreamedInForPlayer (peer) )
15031509 {
15041510 return false ;
15051511 }
1506- else if (!vehicle. isStreamedInForPlayer (peer) )
1512+ else if (unoccupiedSync. SeatID > 0 )
15071513 {
1508- return false ;
1514+ if (player.state_ != PlayerState_Passenger)
1515+ {
1516+ return false ;
1517+ }
1518+ else if (playerVehicleData && playerVehicleData->getVehicle () != &vehicle)
1519+ {
1520+ return false ;
1521+ }
1522+ else if (playerVehicleData && unoccupiedSync.SeatID != playerVehicleData->getSeat ())
1523+ {
1524+ return false ;
1525+ }
15091526 }
1510- else if (unoccupiedSync. SeatID && ( player.state_ != PlayerState_Passenger || (playerVehicleData && playerVehicleData-> getVehicle () != &vehicle) || (playerVehicleData && unoccupiedSync. SeatID != playerVehicleData-> getSeat ())) )
1527+ else if (player.state_ == PlayerState_Passenger )
15111528 {
15121529 return false ;
15131530 }
@@ -1539,7 +1556,9 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
15391556 return false ;
15401557 }
15411558
1542- if (trailerSync.TurnVelocity .x < -1 .0f || trailerSync.TurnVelocity .x > 1 .0f || trailerSync.TurnVelocity .y < -1 .0f || trailerSync.TurnVelocity .y > 1 .0f || trailerSync.TurnVelocity .z < -1 .0f || trailerSync.TurnVelocity .z > 1 .0f )
1559+ if (trailerSync.TurnVelocity .x < -1 .0f || trailerSync.TurnVelocity .x > 1 .0f
1560+ || trailerSync.TurnVelocity .y < -1 .0f || trailerSync.TurnVelocity .y > 1 .0f
1561+ || trailerSync.TurnVelocity .z < -1 .0f || trailerSync.TurnVelocity .z > 1 .0f )
15431562 {
15441563 return false ;
15451564 }
@@ -1566,6 +1585,20 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
15661585 return false ;
15671586 }
15681587
1588+ // Normalise quaternions
1589+ float magnitude = glm::length (trailerSync.Quat );
1590+ if (std::abs (1 .0f - magnitude) >= 0 .000001f )
1591+ {
1592+ if (magnitude < 0 .1f )
1593+ {
1594+ trailerSync.Quat = glm::vec4 (0 .5f );
1595+ }
1596+ else
1597+ {
1598+ trailerSync.Quat /= magnitude;
1599+ }
1600+ }
1601+
15691602 if (vehicle.updateFromTrailerSync (trailerSync, peer))
15701603 {
15711604 trailerSync.PlayerID = player.poolID ;
0 commit comments