fix(Core/Movement): Handle player-controlled vehicles on transports (#23860)
Co-authored-by: blinkysc <blinkysc@users.noreply.github.com>
This commit is contained in:
@@ -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();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user