Вводить одни и те же десять команд снова и снова быстро надоедает. Функция - это текстовый файл с командами, которые выполняются все сразу одним вызовом /function. А ещё функции могут запускаться сами на каждом игровом тике: так многие аддоны делают так, чтобы что-то происходило постоянно.
Если вы раньше не работали с командами, сначала прочитайте Основы команд.
Быстрый способ: GodCraft
В GodCraft есть объект Функция, который сам пишет файлы и список тиков.
- Откройте Мастерскую и добавьте в свой аддон Функцию.
- Пишите по одной команде на строку. Подсказки предлагают команды и аргументы прямо по ходу.
- Выберите, как она запускается: каждый тик, один раз при загрузке мира или только через
/function. - Экспортируйте. Файл
.mcfunction,tick.json, манифесты и UUID будут записаны за вас.
Вручную
Шаг 1: создайте файл функции
Функции живут в пакете поведения (BP), в папке functions. Файл заканчивается на .mcfunction и представляет собой обычный текст: его можно писать в любом текстовом редакторе.
# Gives whoever runs this function a starter kit
give @s minecraft:stone_sword
give @s minecraft:bread 8
give @s minecraft:torch 16
effect @s minecraft:speed 60 0
say Your starter kit is ready!Правила простые:
- Одна команда на строку. Команду нельзя разбить на две строки.
- Без слеша. Пишите
give, а не/give. - Строки, начинающиеся с
#, - это комментарии. Игра их пропускает. Объясняйте в них, что делает функция. - Пустые строки допустимы и помогают читать длинные файлы.
Папка с вашим именем
Если положить файлы в папку вроде functions/myname/, они не будут конфликтовать с другими аддонами, в которых тоже может быть функция starter_kit.
Шаг 2: запустите её
Загрузите мир с включённым пакетом поведения и разрешёнными читами, затем введите:
/function myname/starter_kitИмя - это путь внутри папки functions, с / между папками и без окончания .mcfunction. Смотрите /function.
Внутри функции @s и ~ ~ ~ означают того, кто выполнил /function, и место, где он стоит. Поэтому, когда вы запускаете стартовый набор, предметы получаете вы.
Вложенные папки
Раскладывайте функции по любому количеству папок:
BP/functions/
tick.json
myname/
starter_kit.mcfunction
tick.mcfunction
arena/
start.mcfunction
reset.mcfunctionВложенную функцию запускают так: /function myname/arena/start.
Функции могут вызывать другие функции. Это удобно, чтобы разбить большую задачу на маленькие части:
# Clean up, then teleport everyone in
function myname/arena/reset
tp @a 0 80 0
title @a title Fight!Не вызывайте саму себя
Функция, которая вызывает саму себя, напрямую или через другую функцию, создаёт бесконечный цикл. Игра обрывает его после слишком большого числа команд, и результат будет совсем не тем, что вы ждали.
Шаг 3: запуск каждый тик через tick.json
Minecraft обновляет мир 20 раз в секунду. Каждое обновление называется тиком. Чтобы запускать функцию каждый тик, укажите её в tick.json прямо в папке functions:
{
"values": [
"myname/tick"
]
}Каждая запись в values - это путь к функции, записанный так же, как в /function. Теперь напишите функцию тика:
# Players standing on a gold block get Speed
execute as @a at @s if block ~ ~-1 ~ minecraft:gold_block run effect @s minecraft:speed 1 1 trueОна проверяет каждого игрока 20 раз в секунду. Любой, кто стоит на золотом блоке, получает короткое ускорение, которое обновляется, пока он там стоит. true в конце прячет частицы эффекта.
Кто такой @s в функции тика?
Функции тика запускает сама игра, а не игрок, поэтому @s ни на кого не указывает. Используйте /execute с as @a или as @e[...], чтобы выполнять команды для каждого игрока или моба, как в примере выше.
Делайте функции тика лёгкими. То, что выполняется 20 раз в секунду для каждого игрока, быстро накапливается. Сужайте селекторы аргументами вроде type, r или tag.
Перезагрузка изменений
После правки файла функции перезапускать игру не нужно. Выполните /reload, чтобы загрузить новые версии функций и скриптов. Если в функции есть сломанная команда, может не загрузиться весь файл, так что проверяйте журнал контента на ошибки. Смотрите Когда что-то сломалось.
Командные блоки
Командные блоки выполняют команду, когда получают сигнал, прямо в вашем мире. Они отлично подходят для карт, мини-игр и тестов. Для аддонов лучше функции, потому что они путешествуют вместе с пакетом, а не живут в одном мире.
Как получить
В творческом инвентаре командных блоков нет. Используйте:
/give @s minecraft:command_blockПоставьте его, затем нажмите на него или кликните правой кнопкой, чтобы открыть настройки. Введите команду в поле, без слеша.
Три типа
| Тип | Цвет | Что делает |
|---|---|---|
| Импульсный | Оранжевый | Срабатывает один раз при каждой подаче сигнала |
| Цепной | Зелёный | Срабатывает сразу после блока, который на него указывает |
| Повторяющийся | Фиолетовый | Срабатывает каждый тик, пока на него подан сигнал |
Главные настройки
- Тип блока: Импульсный, Цепной или Повторяющийся.
- Условие: Безусловный срабатывает всегда. Условный срабатывает, только если блок позади него выполнился успешно.
- Редстоун: Нужен редстоун ждёт сигнала от кнопки, рычага или редстоуна. Всегда активен работает без него.
- Задержка в тиках: ждёт столько тиков перед запуском.
Пример: кнопка телепорта
- Поставьте Импульсный командный блок с режимом Нужен редстоун и командой:
tp @p 0 100 0 - Прикрепите к нему каменную кнопку.
- Нажмите кнопку: ближайший игрок перенесётся на
0 100 0.
Пример: цепочка
На боках командных блоков есть стрелка, которая показывает, куда они направлены. Цепной блок, поставленный туда, куда указывает стрелка, сработает следующим.
- Повторяющийся, Всегда активен:
testfor @a[r=5] - Перед ним Цепной блок, Условный, Всегда активен:
effect @a[r=5] minecraft:regeneration 2 0 true
Теперь любой игрок в радиусе 5 блоков лечится, но только пока кто-то рядом. /testfor выполняется успешно, если кого-то находит, а условный цепной блок срабатывает только при успехе.
Функция или командный блок?
Командный блок может запустить и целую функцию: напишите в нём function myname/arena/start. Тогда логика живёт в вашем аддоне, а блок служит просто кнопкой.
Что дальше
- Изучите селекторы и координаты, которые нужны любой команде, в разделе Основы команд.
- Освойте /execute, команду, на которой построено большинство функций.
- Сделайте свой блок, на котором можно стоять вместо золотого, по гайду Ваш первый блок.