diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index 0c47c46f..91105558 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -6587,7 +6587,11 @@ void GameHandler::mailMarkAsRead(uint32_t mailId) { glm::vec3 GameHandler::getComposedWorldPosition() { if (playerTransportGuid_ != 0 && transportManager_) { - return transportManager_->getPlayerWorldPosition(playerTransportGuid_, playerTransportOffset_); + auto* tr = transportManager_->getTransport(playerTransportGuid_); + if (tr) { + return transportManager_->getPlayerWorldPosition(playerTransportGuid_, playerTransportOffset_); + } + // Transport not tracked — fall through to normal position } // Not on transport, return normal movement position return glm::vec3(movementInfo.x, movementInfo.y, movementInfo.z); diff --git a/src/game/movement_handler.cpp b/src/game/movement_handler.cpp index c06a45a2..28caef66 100644 --- a/src/game/movement_handler.cpp +++ b/src/game/movement_handler.cpp @@ -516,10 +516,15 @@ void MovementHandler::sendMovement(Opcode opcode) { // Add transport data if player is on a server-recognized transport if (includeTransportInWire) { if (owner_.transportManager_) { - glm::vec3 composed = owner_.transportManager_->getPlayerWorldPosition(owner_.playerTransportGuid_, owner_.playerTransportOffset_); - movementInfo.x = composed.x; - movementInfo.y = composed.y; - movementInfo.z = composed.z; + auto* tr = owner_.transportManager_->getTransport(owner_.playerTransportGuid_); + if (tr) { + glm::vec3 composed = owner_.transportManager_->getPlayerWorldPosition(owner_.playerTransportGuid_, owner_.playerTransportOffset_); + movementInfo.x = composed.x; + movementInfo.y = composed.y; + movementInfo.z = composed.z; + } + // If transport not found, keep current movementInfo position — + // the localOffset fallback would place us near map origin (0,0,0). } movementInfo.flags |= static_cast(MovementFlags::ONTRANSPORT); movementInfo.transportGuid = owner_.playerTransportGuid_; diff --git a/src/game/transport_manager.cpp b/src/game/transport_manager.cpp index 113dfad5..47f12735 100644 --- a/src/game/transport_manager.cpp +++ b/src/game/transport_manager.cpp @@ -141,7 +141,9 @@ ActiveTransport* TransportManager::getTransport(uint64_t guid) { glm::vec3 TransportManager::getPlayerWorldPosition(uint64_t transportGuid, const glm::vec3& localOffset) { auto* transport = getTransport(transportGuid); if (!transport) { - return localOffset; // Fallback + LOG_WARNING("getPlayerWorldPosition: transport 0x", std::hex, transportGuid, std::dec, + " not found — returning localOffset as-is (callers should guard)"); + return localOffset; } if (transport->isM2) {