From 72e75982be2d40f4fb72f71fbfe2e634a603bdaa Mon Sep 17 00:00:00 2001 From: Anton Popovichenko Date: Mon, 12 Feb 2024 12:18:05 +0100 Subject: [PATCH] fix(Core/Taxi): Fixes crash when player logins and continues flight (#18270) * fix(Core/Taxi): Fixes crash when player logins and continue flight * Update WaypointMovementGenerator.cpp --- .../WaypointMovementGenerator.cpp | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index 6658e76a6..ff10b7ef6 100644 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -347,6 +347,27 @@ void FlightPathMovementGenerator::LoadPath(Player* player) _pointsForPathSwitch.push_back({ uint32(i_path.size() - 1), int32(ceil(cost * discount)) }); } + + // TODO: fixes crash, but can be handled in a better way once we will know how to reproduce it. + if (GetCurrentNode() >= i_path.size()) + { + std::string paths; + std::deque const& taxi = player->m_taxi.GetPath(); + for (uint32 src = 0, dst = 1; dst < taxi.size(); src = dst++) + { + uint32 path, cost; + sObjectMgr->GetTaxiPath(taxi[src], taxi[dst], path, cost); + paths += std::to_string(path) + " "; + } + + LOG_ERROR("movement.flightpath", "Failed to build correct path for player: {}. Current node: {}, max nodes: {}. Paths: {}. Player pos: {}.", player->GetGUID().ToString(), GetCurrentNode(), i_path.size(), paths, player->GetPosition().ToString()); + + // Lets choose the second last element so that a player would still have some flight. + if (int(i_path.size()) - 2 >= 0) + i_currentNode = uint32(i_path.size() - 2); + else + i_currentNode = uint32(i_path.size() - 1); + } } void FlightPathMovementGenerator::DoInitialize(Player* player)