Всем привет! Сегодня я хочу показать вам механизм, предназначенный для испытаний, связанных с ограничением времени на прохождение каких-либо отрезков карты. Суть его заключается в том, что он отсчитывает время в обратную сторону, а по достижении нуля перемещает вас обратно, если вы не успеете добраться до финиша. Я являюсь создателем двух карт под названием Speed, и там как раз возникла необходимость в данном механизме. Итак, я предлагаю вам гайд по созданию механизма, ограничивающего время перемещения из точки A в точку B.
Создание механизма требует некоторый опыт работы с редстоуном и системой счета игровых событий (scoreboard), хотя я попытался как можно более подробно и понятно описать весь цикл разработки.
Давайте разберем его создание на самом простом примере. Предположим, у нас есть полоса препятствий, и мы хотим сделать из нее полосу препятствий на время. Давайте полюбуемся на созданную мной на скорую руку трассу (скриншот ниже). Регистрировать старт и финиширование уровня мы будем с помощью натяжного датчика.
Ну а теперь, непосредственно, сам механизм. Чтобы было проще разобраться, я его условно поделил на три части: инициализация, работа и завершение.
Этап 1. Инициализация
Инициализация механизма сопровождается чередой событий. Для каждого поставим командный блок. То, чем будем заполнять командные блоки: - Создадим scoreboard с названием “time”: /scoreboard objectives add time dummy Time. Он будет отвечать за оставшееся время. - Создадим scoreboard с названием “finished”: /scoreboard objectives add finished dummy. Он будет отвечать за обработку события в случае успешного финиширования уровня. - Дадим эффект скорости: /effect @a 1 1000 5. В своем примере я выбрал пятый уровень скорости длительностью в 1000 секунд. Продолжительность эффекта особого значения не имеет. Главное, чтобы хватило времени на прохождение отрезка карты. В принципе, использование эффекта скорости необязательно. - Выведем scoreboard “time” на экран: /scoreboard objectives setdisplay sidebar time, чтобы мы видели время. - Присвоим значение нашего времени: /scoreboard players set @a time 15. Количество секунд подбирается и подгоняется экспериментальным путем. По желанию можно вставить абсолютно любые дополнительные команды (время суток, эффекты зелий, точку спавна и т.д.). Сразу же подключим наш механизм. Результаты на скриншоте ниже.
Обратите внимание: командные блоки с выводом и установкой времени отделены повторителем, чтобы избежать конфликтов. В ином случае команды с выводом времени или присваиванием значения могут не сработать.
Далее подключим простейший из триггеров (RS NOR) так, как показано на скриншоте. Именно он будет хранить состояние механизма (вкл/выкл).
Этап 2. Работа
На этом этапе будет происходить непосредственно работа механизма: вычитывание времени, проверка на достижение нуля, а также проверка на завершение уровня. Создадим таймер. Введем в командный блок команду: /scoreboard players remove @a time 1. Эта команда будет убавлять по одной секунде за такт.
Как видите, таймер должен быть деактивирован по умолчанию.
Теперь создадим условие завершения работы механизма: достижение нуля. Вводим команду в командный блок: testfor @p[score_time=0]. Также добавим командный блок с командой: testfor @p[score_finished_min=1], которая будет проверять возникновение события успешного финиширования. Scoreboard “finished” здесь играет роль логической (булевой) переменной. 0 – если финиширования не было и 1 – если финиширование произошло.
Обратите внимание на наличие генераторов коротких импульсов. Они нужны обязательно! К ним мы вернемся чуть позже.
Этап 3. Завершение
И, наконец, последний этап, в котором мы производим отключение механизма с предварительным удалением scoreboard’ов и очищением эффектов. Итак, поставим три командных блока и введем в них команды: - /scoreboard objectives remove time (удаление scoreboard’а “time”); - /scoreboard objectives remove finished (удаление scoreboard’а “finished”); - /effect @a 1 0 (отключение эффекта скорости). От генератора коротких импульсов, идущего от проверки на финиширование, ведем редстоун к этим блокам, а от них к триггеру. Этот сигнал и будет отключать механизм.
В принципе, механизм уже работает, однако нужно сделать так, чтобы игрока телепортировало на старт в случае, если он не успеет. Для этого запомним координаты старта (см. на скриншоте) и вставим их в командный блок. В моем случае это команда “/tp @a -224 9 -1702”. Далее проведем сигнал от второго генератора коротких импульсов к предыдущему сигналу, как показано на одном из скриншотов ниже.
Теперь поясню, зачем нужны генераторы коротких импульсов. Дело в том, что от командных блоков исходит постоянный сигнал. При активированном командном блоке сигнал будет блокировать триггер, и вы не сможете начать уровень.
Осталось совсем немного! К финишному натяжному механизму подключим два командных блока с командами: - /scoreboard players set @a finished 1. Эта команда и является генератором события успешного завершения уровня. После ее выполнения механизм завершит свою работу. - /scoreboard objectives remove time. Удаление scoreboard’а “time”. Это нужно для того, чтобы не было задержки между пересечением финишной черты и завершением работы, так как для его выполнения потребуется время длиной в целый такт.
Механизм готов! Наверное, вам может это показаться очень сложным, но его достаточно построить всего один раз, а дальше можно просто копировать с помощью mcedit или прочих редакторов и менять необходимые параметры. Однако для его использования нужно понимать его устройство, для этого я и написал эту статью. Как вы понимаете, использовать лимитирование времени можно в каких угодно обстоятельствах. Например, тот же самый скоростной бег: Speed Speed: Heart of Desert
Благодарю вас за внимание! Если у вас есть вопросы, то задавайте, и я обязательно постараюсь на них ответить. Если гайд вам понравился, опять же, дайте знать, и я выпущу вторую часть про способы прерывания работы механизма. Удачи!