From e8f62ef69142110b0e55b40d71922b1bddf2f2bc Mon Sep 17 00:00:00 2001 From: SkyFire Date: Wed, 2 Oct 2024 19:37:03 -0500 Subject: [PATCH] Fix movement ticks Signed-off-by: SkyFire --- src/server/game/Entities/Unit/Unit.cpp | 4 ++-- src/server/game/Handlers/MovementHandler.cpp | 6 +++++- src/server/game/Server/WorldSession.cpp | 1 + src/server/game/Server/WorldSession.h | 2 ++ src/server/game/Server/WorldSocket.cpp | 7 +++++-- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 4885a6a..be4c103 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -18270,7 +18270,7 @@ void Unit::WriteMovementInfo(WorldPacket& data, Movement::ExtraMovementStatusEle bool hasMountDisplayId = GetUInt32Value(UNIT_FIELD_MOUNT_DISPLAY_ID) != 0; bool hasMovementFlags = GetUnitMovementFlags() != 0; bool hasMovementFlags2 = GetExtraUnitMovementFlags() != 0; - bool hasTimestamp = true; + bool hasTimestamp = mi.time; bool hasOrientation = !G3D::fuzzyEq(GetOrientation(), 0.0f); bool hasTransportData = GetTransGUID() != 0; bool hasSpline = IsSplineEnabled(); @@ -18402,7 +18402,7 @@ void Unit::WriteMovementInfo(WorldPacket& data, Movement::ExtraMovementStatusEle break; case MSETimestamp: if (hasTimestamp) - data << getMSTime(); + data << mi.time; break; case MSEPositionX: if (data.GetOpcode() == SMSG_MOVE_TELEPORT && hasTransportData) diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 1107c89..1b7cd89 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -409,8 +409,12 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvPacket) plrMover->SanitizeMovementInfo(&movementInfo, true); } + uint32 mstime = getMSTime(); + if (m_clientTimeDelay == 0) + m_clientTimeDelay = mstime - movementInfo.time; + /* process position-change */ - movementInfo.time = getMSTime(); + movementInfo.time = movementInfo.time + m_clientTimeDelay + MOVEMENT_PACKET_TIME_DELAY; movementInfo.guid = mover->GetGUID(); mover->m_movementInfo = movementInfo; diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 2b7e482..a9484b6 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -121,6 +121,7 @@ WorldSession::WorldSession(uint32 id, WorldSocket* sock, AccountTypes sec, uint8 m_sessionDbcLocale(sWorld->GetAvailableDbcLocale(locale)), m_sessionDbLocaleIndex(locale), m_latency(0), + m_clientTimeDelay(0), m_TutorialsChanged(false), _filterAddonMessages(false), recruiterId(recruiter), diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 0999a27..2b78ecd 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -434,6 +434,7 @@ class WorldSession : public Schedulable uint32 GetLatency() const { return m_latency; } void SetLatency(uint32 latency) { m_latency = latency; } + void ResetClientTimeDelay() { m_clientTimeDelay = 0; } uint32 getDialogStatus(Player* player, Object* questgiver, uint32 defstatus); ACE_Atomic_Op m_timeOutTime; @@ -1242,6 +1243,7 @@ class WorldSession : public Schedulable LocaleConstant m_sessionDbcLocale; LocaleConstant m_sessionDbLocaleIndex; uint32 m_latency; + uint32 m_clientTimeDelay; uint32 m_flags; TimeValue m_firstCancelModSpeedNoContorlAurasPacket; TimeValue m_lastCancelModSpeedNoContorlAurasPacket; diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 112e51d..42db89a 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -1198,8 +1198,11 @@ int WorldSocket::HandlePing (WorldPacket& recvPacket) uint32 id = m_Session->GetAccountId(); TaskMgr::Default()->ScheduleInvocation([=] { - if (WorldSession* session = sWorld->FindSession(id)) - session->HandlePingUpdate(latency); + if (WorldSession* session = sWorld->FindSession(id)) + { + session->HandlePingUpdate(latency); + session->ResetClientTimeDelay(); + } }); } else -- 2.34.1.windows.1 !highlight!