| Только для Java Edition и Bedrock Edition |
Функции позволяют игрокам запускать списки команд, используя текстовые файлы с расширением .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 при вызове этой функции для изменения этой целевой сущности. Это может упростить функцию и улучшить производительность в общем, благодаря отсутствию перебора сущностей всего мира.
Существует несколько способов запуска функций в игре:
/execute/function <пространство_имён:путь/к/файлу/функции>Достижения могут вызывать функции в качестве награды при их получении. Команды в таких функциях выполняются относительно игрока, получившего достижение.
Функции-награды вызываются в JSON коде файла достижения в следующем формате:
{ "rewards": { "function": "пространство_имён:путь/к/файлу/функции" } } Функции могут быть сгруппированы с использованием тегов в наборах данных. Эти теги могут затем быть использованы для запуска всех функций с определённым тегом с помощью /function #(пространство_имён):(тег).
Функции с тегом minecraft:tick автоматически выполняются каждый тик в его начале. Функции с тегом minecraft:load запустятся после перезагрузки набора данных.
| Официальный выпуск Java Edition | |||||
|---|---|---|---|---|---|
| 1.12 | pre1 | Функции добавлены в игру. | |||
| pre3 | Больше не разрешено начинать писать команды с /. | ||||
Теперь комментарии могут начинаться только с #; использовать // больше не разрешено. | |||||
| pre4 | Добавлены аргументы [if|unless] [селектор] для команды /function. | ||||
| pre6 | Запуск функции (например, в командном блоке), условие которой не выполняется, теперь считается сбоем. | ||||
| 1.13 | 17w43a | Пользовательские функции перемещены в датапаки. | |||
| 17w45a | Функции теперь полностью анализируются и кэшируются при загрузке. | ||||
| 17w49b | Добавлена функция minecraft:tick | ||||