Функция

Только для 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` |