Функции
Только для 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
).
Как и командный блок, функции могут выполнять любые команды с уровнем доступа не выше оператора. Они не могут выполнять функции, запрещённые для командных блоков.
Синтаксис функции
В файле .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
- Позволяет игрокам запускать одну или несколько функций одновременно
- Использует окружение того, что вызвало данную команду
- Изначальное окружение может быть изменено с помощью команды
/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 |