fix(Core/Movement): Handle player-controlled vehicles on transports (#23860)

Co-authored-by: blinkysc <blinkysc@users.noreply.github.com>
This commit is contained in:
blinkysc
2025-11-23 04:06:57 -06:00
committed by GitHub
parent e740f21680
commit 5c15bca66f
+19 -24
View File
@@ -415,59 +415,54 @@ void WorldSession::HandleMoverRelocation(MovementInfo& movementInfo, Unit* mover
if (mover->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) if (mover->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
{ {
// if we boarded a transport, add us to it // if we boarded a transport, add us to it (generalized for both players and creatures)
if (Player* plrMover = mover->ToPlayer()) if (!mover->GetTransport())
{ {
if (!plrMover->GetTransport()) if (Transport* transport = mover->GetMap()->GetTransport(movementInfo.transport.guid))
{ {
if (Transport* transport = plrMover->GetMap()->GetTransport(movementInfo.transport.guid)) mover->SetTransport(transport);
{ transport->AddPassenger(mover);
plrMover->m_transport = transport;
transport->AddPassenger(plrMover);
} }
} }
else if (plrMover->GetTransport()->GetGUID() != movementInfo.transport.guid) else if (mover->GetTransport()->GetGUID() != movementInfo.transport.guid)
{ {
// Switching transports
bool foundNewTransport = false; bool foundNewTransport = false;
plrMover->m_transport->RemovePassenger(plrMover); mover->GetTransport()->RemovePassenger(mover);
if (Transport* transport = plrMover->GetMap()->GetTransport(movementInfo.transport.guid)) if (Transport* transport = mover->GetMap()->GetTransport(movementInfo.transport.guid))
{ {
foundNewTransport = true; foundNewTransport = true;
plrMover->m_transport = transport; mover->SetTransport(transport);
transport->AddPassenger(plrMover); transport->AddPassenger(mover);
} }
if (!foundNewTransport) if (!foundNewTransport)
{ {
plrMover->m_transport = nullptr; mover->SetTransport(nullptr);
movementInfo.transport.Reset(); movementInfo.transport.Reset();
} }
} }
}
if (!mover->GetTransport() && !mover->GetVehicle()) if (!mover->GetTransport() && !mover->GetVehicle())
{ {
GameObject* go = mover->GetMap()->GetGameObject(movementInfo.transport.guid); GameObject* go = mover->GetMap()->GetGameObject(movementInfo.transport.guid);
if (!go || go->GetGoType() != GAMEOBJECT_TYPE_TRANSPORT) if (!go || go->GetGoType() != GAMEOBJECT_TYPE_TRANSPORT)
{
movementInfo.RemoveMovementFlag(MOVEMENTFLAG_ONTRANSPORT); movementInfo.RemoveMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
} }
} }
} else
else if (mover->IsPlayer())
{ {
if (Player* plrMover = mover->ToPlayer()) // if we were on a transport, leave (handles both players and creatures)
if (Transport* transport = mover->GetTransport())
{ {
if (plrMover->GetTransport()) // if we were on a transport, leave if (mover->IsPlayer())
{ sScriptMgr->AnticheatSetUnderACKmount(mover->ToPlayer()); // just for safe
sScriptMgr->AnticheatSetUnderACKmount(plrMover); // just for safe
plrMover->m_transport->RemovePassenger(plrMover); transport->RemovePassenger(mover);
plrMover->m_transport = nullptr; mover->SetTransport(nullptr);
movementInfo.transport.Reset(); movementInfo.transport.Reset();
} }
} }
}
// Some vehicles allow the passenger to turn by himself // Some vehicles allow the passenger to turn by himself
if (Vehicle* vehicle = mover->GetVehicle()) if (Vehicle* vehicle = mover->GetVehicle())