From e54ed1d46fcb78a519baa05f7c749e2ec845ee9d Mon Sep 17 00:00:00 2001 From: Kelsi Date: Wed, 18 Mar 2026 08:39:35 -0700 Subject: [PATCH] fix: pass correct offset to setPlayerOnTransport on transport boarding Both CREATE_OBJECT and MOVEMENT update paths called setPlayerOnTransport(guid, vec3(0)) then immediately overwrote playerTransportOffset_ on the next line. This left a one-frame window where the composed world position used (0,0,0) as the local offset, causing the player to visually snap to the transport origin. Compute the canonical offset first and pass it directly. --- src/game/game_handler.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index 8b96c8e4..6db0e1fc 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -11293,10 +11293,10 @@ void GameHandler::applyUpdateObjectBlock(const UpdateBlock& block, bool& newItem // Track player-on-transport state if (block.guid == playerGuid) { if (block.onTransport) { - setPlayerOnTransport(block.transportGuid, glm::vec3(0.0f)); // Convert transport offset from server → canonical coordinates glm::vec3 serverOffset(block.transportX, block.transportY, block.transportZ); - playerTransportOffset_ = core::coords::serverToCanonical(serverOffset); + glm::vec3 canonicalOffset = core::coords::serverToCanonical(serverOffset); + setPlayerOnTransport(block.transportGuid, canonicalOffset); if (transportManager_ && transportManager_->getTransport(playerTransportGuid_)) { glm::vec3 composed = transportManager_->getPlayerWorldPosition(playerTransportGuid_, playerTransportOffset_); entity->setPosition(composed.x, composed.y, composed.z, oCanonical); @@ -12430,10 +12430,10 @@ void GameHandler::applyUpdateObjectBlock(const UpdateBlock& block, bool& newItem // Track player-on-transport state from MOVEMENT updates if (block.onTransport) { - setPlayerOnTransport(block.transportGuid, glm::vec3(0.0f)); // Convert transport offset from server → canonical coordinates glm::vec3 serverOffset(block.transportX, block.transportY, block.transportZ); - playerTransportOffset_ = core::coords::serverToCanonical(serverOffset); + glm::vec3 canonicalOffset = core::coords::serverToCanonical(serverOffset); + setPlayerOnTransport(block.transportGuid, canonicalOffset); if (transportManager_ && transportManager_->getTransport(playerTransportGuid_)) { glm::vec3 composed = transportManager_->getPlayerWorldPosition(playerTransportGuid_, playerTransportOffset_); entity->setPosition(composed.x, composed.y, composed.z, oCanonical);