Вопрос по коду

aremamarema

Участник
Регистрация
3 Май 2023
Сообщения
42
Как сделать топ 10 по переменной в голограмме?
 

Фанни

Эксперт
Регистрация
3 Май 2023
Сообщения
118
Как сделать топ 10 по переменной в голограмме?
Вся суть топа на массивах заключается в том, что у игрока в одной переменной находятся и значение и его айди
Выглядит это так: 10.00001
Где: 10 - это значение, 00001 - это айди

Чтобы создать игроку айди, сначала мы должны создать переменную со всеми айди. Пусть это будет all_ids. При первом входе игрока мы прибавляем к all_ids 1 и устанавливаем %player%_id = all_ids. Теперь нужно разделить полученное айди на 10000 (либо на большее число) и сохранить в переменную например %player%_arrId. После этого, мы добавляем айди в конец массива, назовём его leaderboardUnsorted. Осталось добавить ник игрока в другой массив leaderboardNicks, чтобы в дальнейшем мы могли вывести его в голограмму

Все эти переменные должны быть сохранены. Надеюсь, это и так понятно

Таким образом получится, что позиция айди игрока в массиве (%player%_arrId) и ника будет равна айди игрока до деления (%player%_id)

Теперь, когда нужное значение будет меняться, например убийства, то, при каждом убийстве мы прибавляем к количеству убийств игрока %player%_arrId и заменяем его в нашем массиве (leaderboardUnsorted). В индексе мы указываем %player%_id

Половина пути пройдена. Осталось вывести топ в голограмму (или любое другое место)

Сортируем leaderboardUnsorted в leaderboardSorted по убыванию. Здесь мы должны запустить рекурсивную функцию, которая будет проходиться по массиву, получать айди игрока, получать ник игрока по его айди и делать текст для вывода в голограмму.
Это функция, которая запускает саму себя. На майнленде, дабы избежать ошибок и проблем, перед следующим запуском функции ставят блок ждать (1 тик. Больше не надо).

Также рекурсивной функции можно поставить условие только при котором рекурсия будет дальше продолжать себя запускать.
Нам это как раз и нужно. Если мы хотим, чтобы в нашем топе было 10 позиций, то перед запуском мы устанавливаем переменной аля leaderboardArrIndex = 0 и в функции прибавляем ей 1, затем проверяем, если переменная меньше 10, то мы снова запускаем функцию.

Но почему бы нам просто не использовать цикл?
Он будет медленнее рекурсии, так как минимальная задержка перед итерацией составляет 5 тиков, а в функции мы можем вообще не ставить задержек
Получить айди игрока можно разными способами, но наверное самым простым будет разделение полученного значения из массива на элементы (точка будет разделителем), получение значения с почти готовым айди (это будет второе значение. В первом значении будет количество убийств игрока) и простой парсинг числа. Как ни странно, но при парсинге числа, все нули будут пропадать и в итоге мы получим нужный нам айди.

Нам осталось лишь получить ник игрока из массива leaderboardNicks по полученному нами айди, сделать красивый текст, тоесть обьеденить все полученные значения и добавить текст в отдельный массив leaderboardString.
Уже на этапе получения значения из отсортированного массива будет видно, что значение будет равно либо 0 либо число.айди

После получения значения сделайте проверку и уже по ней делайте дальнейшие действия. Например, если значение равно 0, то мы просто добавляем чёрточку в массив, иначе мы получаем айди
После окончания рекурсии запускаем еще одну функцию, где мы поулчаем все 10 значений из leaderboardString и создаём голограмму
 
Сверху