Core/GameObjects: Transport (type 11) improvements

* Fully synchronize serverside animation progress with client
* Implemented updating passenger positions on elevators
* Removed visibility hack for elevators that always forced CreateObject packet to be sent to client
This commit is contained in:
Shauren
2022-05-25 22:14:32 +02:00
parent 3031fbb63b
commit 630b60eb0d
33 changed files with 707 additions and 310 deletions

View File

@@ -357,28 +357,30 @@ void WorldSession::HandleMovementOpcode(OpcodeClient opcode, MovementInfo& movem
{
if (!plrMover->GetTransport())
{
if (Transport* transport = plrMover->GetMap()->GetTransport(movementInfo.transport.guid))
transport->AddPassenger(plrMover);
if (GameObject* go = plrMover->GetMap()->GetGameObject(movementInfo.transport.guid))
if (TransportBase* transport = go->ToTransportBase())
transport->AddPassenger(plrMover);
}
else if (plrMover->GetTransport()->GetGUID() != movementInfo.transport.guid)
else if (plrMover->GetTransport()->GetTransportGUID() != movementInfo.transport.guid)
{
plrMover->GetTransport()->RemovePassenger(plrMover);
if (Transport* transport = plrMover->GetMap()->GetTransport(movementInfo.transport.guid))
transport->AddPassenger(plrMover);
if (GameObject* go = plrMover->GetMap()->GetGameObject(movementInfo.transport.guid))
{
if (TransportBase* transport = go->ToTransportBase())
transport->AddPassenger(plrMover);
else
movementInfo.ResetTransport();
}
else
movementInfo.ResetTransport();
}
}
if (!mover->GetTransport() && !mover->GetVehicle())
{
GameObject* go = mover->GetMap()->GetGameObject(movementInfo.transport.guid);
if (!go || go->GetGoType() != GAMEOBJECT_TYPE_TRANSPORT)
movementInfo.transport.Reset();
}
movementInfo.transport.Reset();
}
else if (plrMover && plrMover->GetTransport()) // if we were on a transport, leave
plrMover->m_transport->RemovePassenger(plrMover);
plrMover->GetTransport()->RemovePassenger(plrMover);
// fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map).
if (opcode == CMSG_MOVE_FALL_LAND && plrMover && !plrMover->IsInFlight())