diff --git a/src/Mgr/Travel/TravelNode.cpp b/src/Mgr/Travel/TravelNode.cpp index f56e1e9e7..0cdc4dc63 100644 --- a/src/Mgr/Travel/TravelNode.cpp +++ b/src/Mgr/Travel/TravelNode.cpp @@ -1679,7 +1679,7 @@ TravelNodeRoute TravelNodeMap::FindRouteNearestNodes(WorldPosition startPos, Wor return TravelNodeRoute(); } -TravelPath TravelNodeMap::GetFullPath(WorldPosition botPos, uint32 botZoneId, +TravelPath TravelNodeMap::GetFullPath(WorldPosition botPos, [[maybe_unused]] uint32 botZoneId, WorldPosition destination, Unit* bot) { TravelPath path; @@ -1709,33 +1709,28 @@ TravelPath TravelNodeMap::GetFullPath(WorldPosition botPos, uint32 botZoneId, std::shared_lock guard(m_nMapMtx); - // K-nearest start + end node candidates (cmangos parity: K=5). - // Iterate combinations — first pair with a graph route wins. The - // single-nearest may have no route while the 2nd/3rd does. + // K-nearest start + end node candidates (K=5). Map-wide scan to + // mirror reference `getNodes(pos, -1)` — restricting to bot's zone + // misses nodes that sit just across a zone boundary (e.g. a cave + // whose interior node is in a different zone than its entrance). constexpr uint32 K = 5; - auto pickKNearest = [&](WorldPosition pos, uint32 zoneId) -> std::vector + auto pickKNearest = [&](WorldPosition pos) -> std::vector { - std::vector const& zoneNodes = GetNodesInZone(zoneId); - std::vector candidates(zoneNodes.begin(), zoneNodes.end()); - if (candidates.empty()) - { - // Fallback to per-map scan - for (TravelNode* n : nodes) - if (n && n->getPosition()->GetMapId() == pos.GetMapId()) - candidates.push_back(n); - } + std::vector candidates; + for (TravelNode* n : nodes) + if (n && n->getPosition()->GetMapId() == pos.GetMapId()) + candidates.push_back(n); if (candidates.empty()) return {}; - uint32 n = std::min(K, candidates.size()); + uint32 const n = std::min(K, (uint32)candidates.size()); std::partial_sort(candidates.begin(), candidates.begin() + n, candidates.end(), [pos](TravelNode* i, TravelNode* j) { return i->fDist(pos) < j->fDist(pos); }); candidates.resize(n); return candidates; }; - uint32 destZone = sMapMgr->GetZoneId(PHASEMASK_NORMAL, destination); - std::vector startCandidates = pickKNearest(botPos, botZoneId); - std::vector endCandidates = pickKNearest(destination, destZone); + std::vector startCandidates = pickKNearest(botPos); + std::vector endCandidates = pickKNearest(destination); if (startCandidates.empty() || endCandidates.empty()) return path; // empty