Функция

Материал из Minecraft Wiki
(перенаправлено с «Функции»)
Перейти к: навигация, поиск

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