Что бы быстрее разобраться в коде позволил себе немного порефакторить. Надеюсь сможешь сам разобраться, одна из основных ошибок помечена комментарием. Так же стоит обратить внимание, что не все тупиковые ситуации обработаны.
function getPlayers(a = 5, skip = 0) {
return PlayersInQueue.splice(skip, a);
}
function getTeam(FindPlayersToTeamCount = 20, skip = 0, team = [], availableLines = [1, 2, 3, 4, 5]) {
let tempTeam = getPlayers(FindPlayersToTeamCount, skip);
for (let i = 0; i < tempTeam.length; i++) {
let player = tempTeam[i];
let mainLine = player[0];
let secondLine = player[1];
let isAutoFill = player[2] === 1;
if (team.length === 5) break;
if (mainLine === 6 || isAutoFill) {
// любая линия или сработал autofill
player[0] = availableLines.shift();
team.push(player);
} else {
// ищем основную или второстепенную свободную линию
let mainLineId = availableLines.indexOf(mainLine);
let secondLineId = availableLines.indexOf(secondLine);
if (mainLineId < 0 && secondLineId < 0) continue;
player[0] = availableLines.splice(mainLineId > -1 ? mainLineId : secondLineId, 1)[0];
team.push(player);
}
}
tempTeam = tempTeam.filter((p) => !team.some((p2) => p[3] == p2[3]));
PlayersInQueue = tempTeam.concat(PlayersInQueue);
if (team.length === 5) {
return team;
}
// Если мы не смогли собрать команду нам нужно запустить поиск заново, но только для тех линий которые остались (в этом скорее всего и была ошибка по мимо остальных недочетов)
getTeam(20, tempTeam.length, team, availableLines);
}
UPD: ещё одна из ошибок
FindTeam.splice(FindTeam.indexOf(TeamStorage[i][0]));
у вас тут удаляется не одна линия, а все после преданного индекса