From 3f510fcdc7722cdfcb2e09ea43990b56aa43162b Mon Sep 17 00:00:00 2001 From: Zangomangu <59518113+Zangomangu@users.noreply.github.com> Date: Tue, 1 Aug 2023 19:22:52 +0200 Subject: [PATCH] Fix a desync state after aborted carjacking (PR #3112) --- .../mods/deathmatch/logic/CPacketHandler.cpp | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/Client/mods/deathmatch/logic/CPacketHandler.cpp b/Client/mods/deathmatch/logic/CPacketHandler.cpp index 951ce7c276..21ca9dff8a 100644 --- a/Client/mods/deathmatch/logic/CPacketHandler.cpp +++ b/Client/mods/deathmatch/logic/CPacketHandler.cpp @@ -1777,9 +1777,32 @@ void CPacketHandler::Packet_Vehicle_InOut(NetBitStreamInterface& bitStream) CClientPed* pJacked = pVehicle->GetOccupant(ucSeat); // If it's the local player or syncing ped getting jacked, reset some stuff - if (pJacked && (pJacked->IsLocalPlayer() || pJacked->IsSyncing())) - { - pJacked->ResetVehicleInOut(); + if (pJacked) { + if (pJacked->IsLocalPlayer() || pJacked->IsSyncing()) { + pJacked->ResetVehicleInOut(); + } + else { + // Desynced? Outside but supposed to be in + // For local player or synced peds this is taken care of in CClientPed::UpdateVehicleInOut() + if (pJacked->GetOccupiedVehicle() && !pJacked->GetRealOccupiedVehicle()) { + // Warp him back in + pJacked->WarpIntoVehicle(pJacked->GetOccupiedVehicle(), pJacked->GetOccupiedVehicleSeat()); + + // For bikes and cars where jacked through passenger door, warp the passenger back in if desynced + if (ucSeat == 0) { + CClientPed* pPassenger = pJacked->GetOccupiedVehicle()->GetOccupant(1); + // Is the passenger a remote player or ped and is he physically outside but supposed to be in + if (pPassenger && + !pPassenger->IsLocalPlayer() && + !pPassenger->IsSyncing() && + pPassenger->GetOccupiedVehicle() && + !pPassenger->GetRealOccupiedVehicle()) + { + pPassenger->WarpIntoVehicle(pPassenger->GetOccupiedVehicle(), pPassenger->GetOccupiedVehicleSeat()); + } + } + } + } } }