diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-05-25 22:14:32 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-05-25 22:14:32 +0200 |
commit | 630b60eb0dcd3d9ce41582664ab822b049365431 (patch) | |
tree | b5d60fe41ca49846524ddbc7f9409194b76e7849 /src/server/game/Handlers | |
parent | 3031fbb63bfb2df2aa041bd9c04c5c42b0c07c05 (diff) |
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
Diffstat (limited to 'src/server/game/Handlers')
-rw-r--r-- | src/server/game/Handlers/MovementHandler.cpp | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 4fd59ea3aa7..2c8f70db994 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -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()) |