fix(transport): guard against untracked transport placing player at map origin

When on-transport flag is set but the transport isn't tracked by
TransportManager, getPlayerWorldPosition() returns localOffset (a small
relative value) as a world position. This overwrites movementInfo with
near-zero coordinates, teleporting the player to map origin on Eastern
Kingdoms (Alterac/Hillsbrad area). Add transport existence checks in
sendMovement() and getComposedWorldPosition() before composing position.
This commit is contained in:
Kelsi 2026-04-05 16:01:14 -07:00
parent 910ba50c26
commit fe29ccad3f
3 changed files with 17 additions and 6 deletions

View file

@ -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<uint32_t>(MovementFlags::ONTRANSPORT);
movementInfo.transportGuid = owner_.playerTransportGuid_;