@@ -3417,6 +3417,9 @@ void CGame::Packet_Vehicle_InOut(CVehicleInOutPacket& Packet)
3417
3417
unsigned int occupiedSeat = pPed->GetOccupiedVehicleSeat ();
3418
3418
if (pPed == pVehicle->GetOccupant (occupiedSeat))
3419
3419
{
3420
+ // Reset the occupant changed flag before calling the event
3421
+ pVehicle->m_bOccupantChanged = false ;
3422
+
3420
3423
// Call the exiting vehicle event
3421
3424
CLuaArguments Arguments;
3422
3425
Arguments.PushElement (pPed); // player / ped
@@ -3425,12 +3428,23 @@ void CGame::Packet_Vehicle_InOut(CVehicleInOutPacket& Packet)
3425
3428
Arguments.PushNumber (Packet.GetDoor ()); // door being used
3426
3429
if (pVehicle->CallEvent (" onVehicleStartExit" , Arguments) && pPed->GetOccupiedVehicle () == pVehicle)
3427
3430
{
3428
- // Mark him as exiting the vehicle
3429
- pPed->SetVehicleAction (CPed::VEHICLEACTION_EXITING);
3431
+ // Check if the occupant was changed during the event (e.g., by warpPedIntoVehicle)
3432
+ if (!pVehicle->m_bOccupantChanged )
3433
+ {
3434
+ // Mark him as exiting the vehicle
3435
+ pPed->SetVehicleAction (CPed::VEHICLEACTION_EXITING);
3430
3436
3431
- // Tell everyone he can start exiting the vehicle
3432
- CVehicleInOutPacket Reply (PedID, VehicleID, static_cast <unsigned char >(occupiedSeat), VEHICLE_REQUEST_OUT_CONFIRMED, Packet.GetDoor ());
3433
- m_pPlayerManager->BroadcastOnlyJoined (Reply);
3437
+ // Tell everyone he can start exiting the vehicle
3438
+ CVehicleInOutPacket Reply (PedID, VehicleID, static_cast <unsigned char >(occupiedSeat), VEHICLE_REQUEST_OUT_CONFIRMED, Packet.GetDoor ());
3439
+ m_pPlayerManager->BroadcastOnlyJoined (Reply);
3440
+ }
3441
+ else
3442
+ {
3443
+ // Script interfered with the exit process
3444
+ // Don't proceed with the exit, send failure response
3445
+ CVehicleInOutPacket Reply (PedID, VehicleID, 0 , VEHICLE_ATTEMPT_FAILED);
3446
+ pPlayer->Send (Reply);
3447
+ }
3434
3448
}
3435
3449
else
3436
3450
{
0 commit comments