From 52ac63ece40eb9e44725c15d79dbaf552319576d Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 17 Apr 2025 00:04:41 +0200 Subject: Core/Transports: Fixed clientside position of stoppable transports (cherry picked from commit 96026bfc58faa65aeef5cb1430aa2e442a43b115) --- src/server/game/Entities/Object/Object.cpp | 8 +++++--- src/server/game/Entities/Transport/Transport.h | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 3e58e8e5b4d..bb0f465671c 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -667,9 +667,11 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe data->FlushBits(); if (transport) { - *data << uint32(transport->GetTransportPeriod()); - *data << uint32(transport->GetTimer()); - data->WriteBit(transport->IsStopRequested()); + uint32 period = transport->GetTransportPeriod(); + + *data << uint32((((int64(transport->GetTimer()) - int64(GameTime::GetGameTimeMS())) % period) + period) % period); // TimeOffset + *data << uint32(transport->GetNextStopTimestamp().value_or(0)); + data->WriteBit(transport->GetNextStopTimestamp().has_value()); data->WriteBit(transport->IsStopped()); data->WriteBit(false); data->FlushBits(); diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h index 0c78785377d..b78f02d3be9 100644 --- a/src/server/game/Entities/Transport/Transport.h +++ b/src/server/game/Entities/Transport/Transport.h @@ -89,7 +89,7 @@ class TC_GAME_API Transport final : public GameObject, public TransportBase uint32 GetTransportPeriod() const { return m_gameObjectData->Level; } void SetPeriod(uint32 period) { SetLevel(period); } uint32 GetTimer() const { return _pathProgress; } - bool IsStopRequested() const { return _requestStopTimestamp.has_value(); } + Optional GetNextStopTimestamp() const { return _requestStopTimestamp; } bool IsStopped() const { return HasDynamicFlag(GO_DYNFLAG_LO_STOPPED); } void UpdatePosition(float x, float y, float z, float o); -- cgit v1.2.3