Итак, допустим, вы делаете карту и хотите вывести какую-либо статистику (время, количество убийств и т.д.) на большой дисплей. Соглашусь с тем, что эта задача кажется сегодня достаточно непростой. Однако в версии 1.8 появилось огромное количество возможностей. Инструментарий новой версии позволяет строить нам самые разнообразные механизмы, в частности благодаря команде scoreboard players operation. Именно она станет главным средством для нашей задачи. Для начала взглянем на принцип действия механизма. В данном примере я для наглядности использовал быстрый таймер, а также намерено допускал ошибки, чтобы получить разные результаты.
Для примера я решил взять простой паркур на время, хотя жанр не имеет абсолютно никакого значения. Главное, нам требуется скорборд в качестве входных данных.
1. Для начала нужно разработать алгоритм. Как с помощью командных блоков вывести число на экран? Если бы наше число было меньше 10, то было бы намного проще. Мы бы просто перебрали все 10 цифр с помощью тестера, и подходящую цифру скопировали бы на итоговое табло командой clone. Поэтому, чтобы вывести многоразрядное число на экран, потребуется сначала извлечь все цифры данного числа. Я думаю, трех разрядов для примера нам хватит. Для наглядности приведу реализацию этого простого, наверное, многим известного алгоритма.
void ranks(int input) // input – исходное число { int rank1 = input % 10; //единицы, % - вычисление остатка от деления int rank2 = input / 10 % 10; //десятки int rank3 = input / 100; //сотни }
Теперь реализуем данный алгоритм на командных блоках. Для начала создадим необходимые скорборды: /scoreboard objectives add rank1 dummy /scoreboard objectives add rank2 dummy /scoreboard objectives add rank3 dummy /scoreboard objectives add const dummy Скорборд const потребуется нам для хранения константы 10.
2. Далее присвоим нашим скорбордам начальные значения. Значения будем присваивать несуществующему игроку с ником Time: /scoreboard players operation Time rank1 = Time time /scoreboard players operation Time rank2 = Time time /scoreboard players operation Time rank3 = Time time /scoreboard players set Time const 10 Повторюсь, что time – это и есть изначальный скорборд (входные данные), значение которого мы собираемся выводить на экран.
3. В коде программы мы могли выполнить несколько операций в одной строчке. В командных блоках, однако, такой номер не пройдет. Чтобы не запутаться, предлагаю отслеживать значения скорбордов на каждом шаге. Возьмем число, например, 123. Значения будут такие: rank1 = 123 rank2 = 123 rank3 = 123 Теперь применим нужные операции к нужным скорбордам. Действуем по алгоритму: /scoreboard players operation Time rank1 %= Time const /scoreboard players operation Time rank2 /= Time const /scoreboard players operation Time rank3 /= Time const
4. На данный момент значения скорбордов таковы: rank1 = 3 rank2 = 12 rank3 = 12 Как мы видим, единицы мы уже получили, поэтому скорборд rank1 обрабатывать больше не нужно. Да, я знаю, что rank3 мы могли поделить сразу на 100, но так пришлось бы создавать еще один скорборд со второй константой. Лучше разобьем на две операции, много проблем это не добавит. Выполняем вторые операции над rank2 и rank3: /scoreboard players operation Time rank2 %= Time const /scoreboard players operation Time rank3 /= Time const
5. Отлично! Теперь все сходится: rank1 = 3 rank2 = 2 rank3 = 1 Все, что нам осталось сделать, это тест на каждую цифру из всех трех разрядов. Для начала сделаем шаблоны цифр где-нибудь на карте. Я аккуратно поместил их за экраном.
6. Построим линию 10 чередующихся командных блоков с какими-нибудь другими блоками. К каждому блоку подключим компаратор, к которому в свою очередь примкнем снова командные блоки. В блоки на линии введем команды, проверяющие значение разряда: /scoreboard players test Time rank1 0 0 /scoreboard players test Time rank1 1 1 ... /scoreboard players test Time rank1 9 9 А в парные командные блоки введем команды, копирующие соответствующие цифры на карте в нужное место на экране: /clone -672 11 616 -669 17 616 -677 11 615 masked /clone -672 11 617 -669 17 617 -677 11 615 masked ... Как вы поняли, единицы должны копироваться в правое крайнее место на экране (что, в принципе, вполне логично). Да, возня с координатами утомляет, но, возможно, это того стоит.
7. Аналогично поступаем с остальными двумя разрядами. Не забываем, что десятки мы копируем на среднюю позицию на экране, а сотни – налево.
8. Теперь необходимо провести дополнительный сигнал, сбрасывающий выход тестовых командных блоков в случае, если игрок решит перезапустить прохождение данного отрезка карты. На этом же сигнале расположим командные блоки, удаляющие наши скорборды: /scoreboard objectives remove rank1 /scoreboard objectives remove rank2 /scoreboard objectives remove rank3 /scoreboard objectives remove const Все дело в том, что сигналы, которые издают командные блоки, постоянные. И если эти сигналы не сбросить, то при следующем прохождении значения отдельных разрядов могут получиться такими же, как в прошлый раз, и соответствующие цифры просто не отобразятся на экране, так как командные блоки, отвечающие за нее, уже будут активированы. Также не забываем очистить экран (например, командой fill), сбросить игровой счет, ну и, в зависимости от карты, телепортировть игрока на старт.
Карта из гайда:
Внимание! Гости не имеют прав для просмотра скрытого текста, зарегистрируйтесь.
Так же есть и другие алгоритмы выделения цифр из числа, в том числе из числа с любым количеством знаков. Пример реализации приведен ниже. Этот алгоритм реализовать в игре тоже возможно, но это уже совершенно другая история. Куда проще определить количество знаков заранее.
staticint[] ranks(int input) { // предполагаем, что input не равняется нулю int[] rank = new int[input.ToString().Length]; byte count = 0; while (input > 0) { rank[count] = input % 10; input /= 10; count++; } return rank; }
Ну и на этом все! Возможно, этот механизм можно сделать компактней. Но в данном случае это было бы излишним, так как моей целью было показать сам процесс строительства механизма. Надеюсь, гайд вам понравился, и как всегда, все вопросы касательно него вы можете задать в комментариях. Всем удачи!