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
+28 -33
View File
@@ -415,33 +415,31 @@ 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;
mover->GetTransport()->RemovePassenger(mover);
if (Transport* transport = mover->GetMap()->GetTransport(movementInfo.transport.guid))
{ {
bool foundNewTransport = false; foundNewTransport = true;
plrMover->m_transport->RemovePassenger(plrMover); mover->SetTransport(transport);
if (Transport* transport = plrMover->GetMap()->GetTransport(movementInfo.transport.guid)) transport->AddPassenger(mover);
{ }
foundNewTransport = true;
plrMover->m_transport = transport;
transport->AddPassenger(plrMover);
}
if (!foundNewTransport) if (!foundNewTransport)
{ {
plrMover->m_transport = nullptr; mover->SetTransport(nullptr);
movementInfo.transport.Reset(); movementInfo.transport.Reset();
}
} }
} }
@@ -449,23 +447,20 @@ void WorldSession::HandleMoverRelocation(MovementInfo& movementInfo, Unit* mover
{ {
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 if (mover->IsPlayer()) else
{ {
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();
}
} }
} }