Функция

Функции позволяют игрокам запускать списки команд, используя текстовые файлы с расширением .mcfunction. При их написании рекомендуется использовать кодировку UTF-8 (без последовательностей), чтобы предотвратить возможные проблемы. На этой странице объясняется использование функций в Java Edition.

Использование

Для использования, текстовый файл должен сначала быть помещён в папку по пути [НАЗВАНИЕ_МИРА]/datapacks/[НАЗВАНИЕ_НАБОРА_ДАННЫХ]/data/[ПРОСТРАНСТВО_ИМЁН]/functions/[ПУТЬ_К_ФУНКЦИИ]. Пространство имён и путь к функции будут использованы при обращении к ней в игре.

Например, запуск функции custom:example/test обратится к файлу, находящемуся по пути data/custom/functions/example/test.mcfunction. Пространство имён, используемое по умолчанию - minecraft:. Использование собственного пространства имён рекомендуется, чтобы предотвратить неожиданное поведение в случае будущих изменений в основном пространстве имён.

Функции, будучи текстовыми файлами, просты в изменении и создают меньшую нагрузку, чем командные блоки, при использовании в больших количествах. Если вы изменили или создали новую функцию, то команда /reload загрузит её с диска в течение игры. Это позволяет игре применять изменения, сделанные в файлах функции без выхода и перезапуска мира.

При успешном выполнении /function, в чате появится сообщение: Выполнено [количество] команд функции '[путь к файлу функции]'. Встроенные функции не будут отображены в этом сообщении. Успешность выполнения команд нельзя проверить с помощью компаратора (хотя этого можно добиться с помощью команды /execute store).

Как и командный блок, функции могут выполнять любые команды с уровнем доступа не выше оператора. Они не могут выполнять функции, запрещённые для командных блоков.

Синтаксис функции

Тестирование системы функций. Три сообщения /tellraw и одна команда /give были использованы в этой простой функции.

В файле .mcfunction допускается одна команда в каждой строке, без обычно предшествующего слэша (/). Игроки могут добавлять комментарии в файлы с функциями, добавляя перед ними знак #.

Отдельные команды в функции могут превышать ограничение в 32.500 знаков для командных блоков, но общее количество команд внутри одной функции должно быть не более значения /gamerule maxCommandChainLength, которое по умолчанию равно 65.536. Последующие команды будут проигнорированы.

Запуск функции

Функции запустят все свои команды в течение одного такта, а функции, запущенные изнутри других функций, выполнятся в тот же тик, что и вызывающая функция. Функции будут использовать то окружение, в котором они были вызваны (Оно определяет исполнителя команды, его местонахождение, угол поворота и др.)

Изменения окружения, происходящие изнутри функции не отразятся на других командах внутри неё (или внутри дочерних функций) до следующего запуска, несмотря на порядок команд. Единственным исключением является команда /execute: она обновит окружение дочерних функций.

Например:

execute as @a at @s run function foo:bar 

foo:bar

teleport @s ~ ~5 ~ setblock ~ ~-1 ~ emerald_block execute at @s run setblock ~ ~-1 ~ diamond_block 

При вызове игроком, эта функция телепортирует его на 5 блоков вверх, поставит изумрудный блок под его изначальной позицией до телепортации и поставит алмазный блок под его новой позицией после телепортации. Это поведение не влияет на селекторы.

Рекомендуется использовать селектор @s для наиболее часто используемой сущности в функции и /execute as при вызове этой функции для изменения этой целевой сущности. Это может упростить функцию и улучшить производительность в общем, благодаря отсутствию перебора сущностей всего мира.

Существует несколько способов запуска функций в игре:

Команды

/function

Достижения

Достижения могут вызывать функции в качестве награды при их получении. Команды в таких функциях выполняются относительно игрока, получившего достижение.

Функции-награды вызываются в JSON коде файла достижения в следующем формате:

{ "rewards": { "function": "пространство_имён:путь/к/файлу/функции" } } 

Теги

Функции могут быть сгруппированы с использованием тегов в наборах данных. Эти теги могут затем быть использованы для запуска всех функций с определённым тегом с помощью /function #(пространство_имён):(тег).

Функции с тегом minecraft:tick автоматически выполняются каждый тик в его начале. Функции с тегом minecraft:load запустятся после перезагрузки набора данных.

История версий

Официальный выпуск Java Edition
1.12pre1Функции добавлены в игру.
pre3Больше не разрешено начинать писать команды с /.
Теперь комментарии могут начинаться только с #; использовать // больше не разрешено.
pre4Добавлены аргументы [if|unless] [селектор] для команды /function.
pre6Запуск функции (например, в командном блоке), условие которой не выполняется, теперь считается сбоем.
1.1317w43aПользовательские функции перемещены в датапаки.
17w45aФункции теперь полностью анализируются и кэшируются при загрузке.
17w49bДобавлена функция minecraft:tick
В данной статье используются материалы из статьи «Функция» с вики-сайта Minecraft Wiki, расположенного на Фэндоме, и они распространяются согласно лицензии Creative Commons Attribution-Share Alike. Авторы статьи.