From b07e545baea581adb5f05bbc5717e8da63c35595 Mon Sep 17 00:00:00 2001 From: p-tkachuk Date: Sat, 8 Feb 2025 05:53:57 +0100 Subject: [PATCH] fix(Core/Transport): Fix for passengers dropped in the middle of nowhere (#21296) --- .../game/Entities/Transport/Transport.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index c76c79865..1ab462f70 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -582,7 +582,22 @@ void MotionTransport::DelayedTeleportTransport() float destX, destY, destZ, destO; obj->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO); TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, o); - if (!obj->ToPlayer()->TeleportTo(newMapId, destX, destY, destZ, destO, TELE_TO_NOT_LEAVE_TRANSPORT)) + + Player* player = obj->ToPlayer(); + // Vehicle passengers are dropped in the middle of nowhere, so lets try to eject them, add to the transport and teleport + // this needs to be revisited to properly restore vehicles with passengers after transport teleportation + if (player->IsVehicle()) + if (Vehicle* vehicleKit = player->GetVehicleKit()) + for (SeatMap::iterator itr = vehicleKit->Seats.begin(); itr != vehicleKit->Seats.end(); ++itr) + if (Player* passenger = ObjectAccessor::GetPlayer(*player, itr->second.Passenger.Guid)) + { + passenger->ExitVehicle(); + AddPassenger(passenger, true); + if (!passenger->TeleportTo(newMapId, destX, destY, destZ, destO, TELE_TO_NOT_LEAVE_TRANSPORT)) + _passengers.erase(passenger); + } + + if (!player->TeleportTo(newMapId, destX, destY, destZ, destO, TELE_TO_NOT_LEAVE_TRANSPORT)) _passengers.erase(obj); } break;