Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 14 additions & 16 deletions Server/Components/Vehicles/vehicle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,13 @@ bool Vehicle::updateFromDriverSync(const VehicleDriverSyncPacket& vehicleSync, I
return false;
}

if (vehicleSync.TrailerID && trailer && trailer->getID() != vehicleSync.TrailerID)
{
// The client instantly jumped from one trailer to another one. Probably a cheat, so don't
// allow it.
return false;
}

pos = vehicleSync.Position;
rot = vehicleSync.Rotation;
velocity = vehicleSync.Velocity;
Expand Down Expand Up @@ -218,16 +225,7 @@ bool Vehicle::updateFromDriverSync(const VehicleDriverSyncPacket& vehicleSync, I

if (vehicleSync.TrailerID)
{
if (trailer)
{
if (trailer->getID() != vehicleSync.TrailerID)
{
// The client instantly jumped from one trailer to another one. Probably a cheat, so don't
// allow it.
return false;
}
}
else
if (!trailer)
{
// Got a new one that we didn't know about.
trailer = static_cast<Vehicle*>(pool->get(vehicleSync.TrailerID));
Expand Down Expand Up @@ -322,19 +320,19 @@ bool Vehicle::updateFromTrailerSync(const VehicleTrailerSyncPacket& trailerSync,
return false;
}

PlayerVehicleData* playerData = queryExtension<PlayerVehicleData>(player);
if (!playerData)
{
return false;
}

pos = trailerSync.Position;
velocity = trailerSync.Velocity;
angularVelocity = trailerSync.TurnVelocity;
rot.q = glm::quat(trailerSync.Quat[0], trailerSync.Quat[1], trailerSync.Quat[2], trailerSync.Quat[3]);

updateOccupied();

PlayerVehicleData* playerData = queryExtension<PlayerVehicleData>(player);
if (!playerData)
{
return false;
}

Vehicle* vehicle = static_cast<Vehicle*>(playerData->getVehicle());

if (!vehicle || vehicle->detaching)
Expand Down
128 changes: 80 additions & 48 deletions Server/Source/player_pool.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -881,7 +881,9 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
|| (aimSync.CamMode >= 48u && aimSync.CamMode <= 50u)
|| aimSync.CamMode == 52u || aimSync.CamMode == 54u
|| aimSync.CamMode == 60u || aimSync.CamMode == 61u || aimSync.CamMode > 64u)
{
aimSync.CamMode = 4u;
}

aimSync.PlayerID = player.poolID;
player.aimSync_ = aimSync;
Expand Down Expand Up @@ -1135,13 +1137,19 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public

ScopedPoolReleaseLock lock(*self.vehiclesComponent, *vehiclePtr);
IVehicle& vehicle = *lock.entry;

Player& player = static_cast<Player&>(peer);

const bool vehicleOk = vehicle.updateFromDriverSync(vehicleSync, player);

if (!vehicleOk)
{
return false;
}

player.pos_ = vehicleSync.Position;
player.health_ = vehicleSync.PlayerHealthArmour.x;
player.armour_ = vehicleSync.PlayerHealthArmour.y;
player.armedWeapon_ = player.areWeaponsAllowed() ? vehicleSync.WeaponID : 0;
const bool vehicleOk = vehicle.updateFromDriverSync(vehicleSync, player);

uint32_t newKeys = vehicleSync.Keys;
switch (vehicleSync.AdditionalKey)
Expand Down Expand Up @@ -1171,33 +1179,29 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
}
player.setState(PlayerState_Driver);

if (vehicleOk)
vehicleSync.HasTrailer = false;
if (vehicleSync.TrailerID)
{
vehicleSync.PlayerID = player.poolID;

vehicleSync.HasTrailer = false;
if (vehicleSync.TrailerID)
IVehicle* trailer = vehicle.getTrailer();
if (trailer)
{
IVehicle* trailer = vehicle.getTrailer();
if (trailer)
{
vehicleSync.HasTrailer = true;
vehicleSync.TrailerID = trailer->getID();
}
vehicleSync.HasTrailer = true;
vehicleSync.TrailerID = trailer->getID();
}
}

TimePoint now = Time::now();
bool allowedupdate = self.playerUpdateDispatcher.stopAtFalse(
[&peer, now](PlayerUpdateEventHandler* handler)
{
return handler->onPlayerUpdate(peer, now);
});

if (allowedupdate)
TimePoint now = Time::now();
bool allowedupdate = self.playerUpdateDispatcher.stopAtFalse(
[&peer, now](PlayerUpdateEventHandler* handler)
{
player.vehicleSync_ = vehicleSync;
player.primarySyncUpdateType_ = PrimarySyncUpdateType::Driver;
}
return handler->onPlayerUpdate(peer, now);
});

if (allowedupdate)
{
vehicleSync.PlayerID = player.poolID;
player.vehicleSync_ = vehicleSync;
player.primarySyncUpdateType_ = PrimarySyncUpdateType::Driver;
}
return true;
}
Expand Down Expand Up @@ -1390,7 +1394,9 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
IVehicle& vehicle = *lock.entry;
Player& player = static_cast<Player&>(peer);

if (vehicle.isRespawning())
int vehicleModel = vehicle.getModel();
// Check if vehicle is a train carriage (TODO: Move Vehicle::isTrainCarriage to SDK/Components/Vehicles/Impl/vehicle_models.hpp)
if (vehicle.isRespawning() || (!vehicle.isStreamedInForPlayer(player) && !(vehicleModel == 569 || vehicleModel == 570)))
{
return false;
}
Expand All @@ -1402,10 +1408,10 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
return false;
}

player.pos_ = vehicle.getPosition();
player.health_ = passengerSync.HealthArmour.x;
player.armour_ = passengerSync.HealthArmour.y;
player.armedWeapon_ = player.areWeaponsAllowed() ? passengerSync.WeaponID : 0;
player.pos_ = passengerSync.Position;

uint32_t newKeys = passengerSync.Keys;
switch (passengerSync.AdditionalKey)
Expand Down Expand Up @@ -1435,23 +1441,19 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
}
player.setState(PlayerState_Passenger);

if (vehicleOk)
{
TimePoint now = Time::now();
bool allowedupdate = self.playerUpdateDispatcher.stopAtFalse(
[&peer, now](PlayerUpdateEventHandler* handler)
{
return handler->onPlayerUpdate(peer, now);
});

if (allowedupdate)
TimePoint now = Time::now();
bool allowedupdate = self.playerUpdateDispatcher.stopAtFalse(
[&peer, now](PlayerUpdateEventHandler* handler)
{
passengerSync.PlayerID = player.poolID;
player.passengerSync_ = passengerSync;
player.primarySyncUpdateType_ = PrimarySyncUpdateType::Passenger;
}
}
return handler->onPlayerUpdate(peer, now);
});

if (allowedupdate)
{
passengerSync.PlayerID = player.poolID;
player.passengerSync_ = passengerSync;
player.primarySyncUpdateType_ = PrimarySyncUpdateType::Passenger;
}
return true;
}
} playerPassengerSyncHandler;
Expand All @@ -1473,12 +1475,16 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
return false;
}

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)
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)
{
return false;
}

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)
if (glm::abs(1.0 - glm::length(unoccupiedSync.Roll)) >= 0.000001
|| glm::abs(1.0 - glm::length(unoccupiedSync.Rotation)) >= 0.000001
|| glm::abs(glm::dot(unoccupiedSync.Roll, unoccupiedSync.Rotation)) >= 0.000001)
{
return false;
}
Expand All @@ -1499,15 +1505,26 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public

IPlayerVehicleData* playerVehicleData = queryExtension<IPlayerVehicleData>(peer);

if (vehicle.getDriver())
if (vehicle.getDriver() || !vehicle.isStreamedInForPlayer(peer))
{
return false;
}
else if (!vehicle.isStreamedInForPlayer(peer))
else if (unoccupiedSync.SeatID > 0)
{
return false;
if (player.state_ != PlayerState_Passenger)
{
return false;
}
else if (playerVehicleData && playerVehicleData->getVehicle() != &vehicle)
{
return false;
}
else if (playerVehicleData && unoccupiedSync.SeatID != playerVehicleData->getSeat())
{
return false;
}
}
else if (unoccupiedSync.SeatID && (player.state_ != PlayerState_Passenger || (playerVehicleData && playerVehicleData->getVehicle() != &vehicle) || (playerVehicleData && unoccupiedSync.SeatID != playerVehicleData->getSeat())))
else if (player.state_ == PlayerState_Passenger)
{
return false;
}
Expand Down Expand Up @@ -1539,11 +1556,26 @@ struct PlayerPool final : public IPlayerPool, public NetworkEventHandler, public
return false;
}

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)
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)
{
return false;
}

float magnitude = glm::length(trailerSync.Quat);
if (std::abs(1.0f - magnitude) >= 0.000001f)
{
if (magnitude < 0.1f)
{
trailerSync.Quat = glm::vec4(0.5f);
}
else
{
trailerSync.Quat /= magnitude;
}
}

IVehicle* vehiclePtr = self.vehiclesComponent->get(trailerSync.VehicleID);
if (!vehiclePtr)
{
Expand Down
Loading