Skip to content

Commit 42b0450

Browse files
authored
Merge pull request #1113 from NexiusTailer/patch-1
One big beautiful pull request
2 parents 3420cf3 + c118bf6 commit 42b0450

File tree

2 files changed

+95
-64
lines changed

2 files changed

+95
-64
lines changed

Server/Components/Vehicles/vehicle.cpp

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,13 @@ bool Vehicle::updateFromDriverSync(const VehicleDriverSyncPacket& vehicleSync, I
164164
return false;
165165
}
166166

167+
if (vehicleSync.TrailerID && trailer && trailer->getID() != vehicleSync.TrailerID)
168+
{
169+
// The client instantly jumped from one trailer to another one. Probably a cheat, so don't
170+
// allow it.
171+
return false;
172+
}
173+
167174
pos = vehicleSync.Position;
168175
rot = vehicleSync.Rotation;
169176
velocity = vehicleSync.Velocity;
@@ -218,16 +225,7 @@ bool Vehicle::updateFromDriverSync(const VehicleDriverSyncPacket& vehicleSync, I
218225

219226
if (vehicleSync.TrailerID)
220227
{
221-
if (trailer)
222-
{
223-
if (trailer->getID() != vehicleSync.TrailerID)
224-
{
225-
// The client instantly jumped from one trailer to another one. Probably a cheat, so don't
226-
// allow it.
227-
return false;
228-
}
229-
}
230-
else
228+
if (!trailer)
231229
{
232230
// Got a new one that we didn't know about.
233231
trailer = static_cast<Vehicle*>(pool->get(vehicleSync.TrailerID));
@@ -322,19 +320,19 @@ bool Vehicle::updateFromTrailerSync(const VehicleTrailerSyncPacket& trailerSync,
322320
return false;
323321
}
324322

323+
PlayerVehicleData* playerData = queryExtension<PlayerVehicleData>(player);
324+
if (!playerData)
325+
{
326+
return false;
327+
}
328+
325329
pos = trailerSync.Position;
326330
velocity = trailerSync.Velocity;
327331
angularVelocity = trailerSync.TurnVelocity;
328332
rot.q = glm::quat(trailerSync.Quat[0], trailerSync.Quat[1], trailerSync.Quat[2], trailerSync.Quat[3]);
329333

330334
updateOccupied();
331335

332-
PlayerVehicleData* playerData = queryExtension<PlayerVehicleData>(player);
333-
if (!playerData)
334-
{
335-
return false;
336-
}
337-
338336
Vehicle* vehicle = static_cast<Vehicle*>(playerData->getVehicle());
339337

340338
if (!vehicle || vehicle->detaching)

Server/Source/player_pool.hpp

Lines changed: 81 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)