@@ -881,7 +881,9 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
881
881
|| (aimSync.CamMode >= 48u && aimSync.CamMode <= 50u )
882
882
|| aimSync.CamMode == 52u || aimSync.CamMode == 54u
883
883
|| aimSync.CamMode == 60u || aimSync.CamMode == 61u || aimSync.CamMode > 64u )
884
+ {
884
885
aimSync.CamMode = 4u ;
886
+ }
885
887
886
888
aimSync.PlayerID = player.poolID ;
887
889
player.aimSync_ = aimSync;
@@ -1135,13 +1137,19 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
1135
1137
1136
1138
ScopedPoolReleaseLock lock (*self.vehiclesComponent , *vehiclePtr);
1137
1139
IVehicle& vehicle = *lock.entry ;
1138
-
1139
1140
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
+
1140
1149
player.pos_ = vehicleSync.Position ;
1141
1150
player.health_ = vehicleSync.PlayerHealthArmour .x ;
1142
1151
player.armour_ = vehicleSync.PlayerHealthArmour .y ;
1143
1152
player.armedWeapon_ = player.areWeaponsAllowed () ? vehicleSync.WeaponID : 0 ;
1144
- const bool vehicleOk = vehicle.updateFromDriverSync (vehicleSync, player);
1145
1153
1146
1154
uint32_t newKeys = vehicleSync.Keys ;
1147
1155
switch (vehicleSync.AdditionalKey )
@@ -1171,33 +1179,29 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
1171
1179
}
1172
1180
player.setState (PlayerState_Driver);
1173
1181
1174
- if (vehicleOk)
1182
+ vehicleSync.HasTrailer = false ;
1183
+ if (vehicleSync.TrailerID )
1175
1184
{
1176
- vehicleSync.PlayerID = player.poolID ;
1177
-
1178
- vehicleSync.HasTrailer = false ;
1179
- if (vehicleSync.TrailerID )
1185
+ IVehicle* trailer = vehicle.getTrailer ();
1186
+ if (trailer)
1180
1187
{
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 ();
1187
1190
}
1191
+ }
1188
1192
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)
1197
1196
{
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;
1201
1205
}
1202
1206
return true ;
1203
1207
}
@@ -1390,7 +1394,9 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
1390
1394
IVehicle& vehicle = *lock.entry ;
1391
1395
Player& player = static_cast <Player&>(peer);
1392
1396
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 )))
1394
1400
{
1395
1401
return false ;
1396
1402
}
@@ -1402,10 +1408,10 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
1402
1408
return false ;
1403
1409
}
1404
1410
1411
+ player.pos_ = vehicle.getPosition ();
1405
1412
player.health_ = passengerSync.HealthArmour .x ;
1406
1413
player.armour_ = passengerSync.HealthArmour .y ;
1407
1414
player.armedWeapon_ = player.areWeaponsAllowed () ? passengerSync.WeaponID : 0 ;
1408
- player.pos_ = passengerSync.Position ;
1409
1415
1410
1416
uint32_t newKeys = passengerSync.Keys ;
1411
1417
switch (passengerSync.AdditionalKey )
@@ -1435,23 +1441,19 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
1435
1441
}
1436
1442
player.setState (PlayerState_Passenger);
1437
1443
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)
1448
1447
{
1449
- passengerSync.PlayerID = player.poolID ;
1450
- player.passengerSync_ = passengerSync;
1451
- player.primarySyncUpdateType_ = PrimarySyncUpdateType::Passenger;
1452
- }
1453
- }
1448
+ return handler->onPlayerUpdate (peer, now);
1449
+ });
1454
1450
1451
+ if (allowedupdate)
1452
+ {
1453
+ passengerSync.PlayerID = player.poolID ;
1454
+ player.passengerSync_ = passengerSync;
1455
+ player.primarySyncUpdateType_ = PrimarySyncUpdateType::Passenger;
1456
+ }
1455
1457
return true ;
1456
1458
}
1457
1459
} playerPassengerSyncHandler;
@@ -1473,12 +1475,16 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
1473
1475
return false ;
1474
1476
}
1475
1477
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 )
1477
1481
{
1478
1482
return false ;
1479
1483
}
1480
1484
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 )
1482
1488
{
1483
1489
return false ;
1484
1490
}
@@ -1499,15 +1505,26 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
1499
1505
1500
1506
IPlayerVehicleData* playerVehicleData = queryExtension<IPlayerVehicleData>(peer);
1501
1507
1502
- if (vehicle.getDriver ())
1508
+ if (vehicle.getDriver () || !vehicle. isStreamedInForPlayer (peer) )
1503
1509
{
1504
1510
return false ;
1505
1511
}
1506
- else if (!vehicle. isStreamedInForPlayer (peer) )
1512
+ else if (unoccupiedSync. SeatID > 0 )
1507
1513
{
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
+ }
1509
1526
}
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 )
1511
1528
{
1512
1529
return false ;
1513
1530
}
@@ -1539,7 +1556,9 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
1539
1556
return false ;
1540
1557
}
1541
1558
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 )
1543
1562
{
1544
1563
return false ;
1545
1564
}
@@ -1566,6 +1585,20 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
1566
1585
return false ;
1567
1586
}
1568
1587
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
+
1569
1602
if (vehicle.updateFromTrailerSync (trailerSync, peer))
1570
1603
{
1571
1604
trailerSync.PlayerID = player.poolID ;
0 commit comments