函数(Function)是一个允许玩家利用扩展名为.mcfunction的文本文档编写和运行多行命令的功能。建议在函数文件中使用UTF-8(不带BOM)的编码以免出错。
用法
要使用函数,首先必须把文本文档放置在.minecraft/saves/世界名称/data/functions内的文件夹中。这个顶层文件夹的名字将在调用其中函数时作为其命名空间。当然,函数也可以被放置在这个顶层文件夹的子文件夹中。
例如,运行函数custom:example/test将引用位于functions/custom/example/test.mcfunction的文件。
如果命名空间在尝试调用某个函数时被忽略,将默认使用minecraft:这个命名空间。为了避免在未来的版本因为mojang对默认命名空间的改动而导致意料之外的事,最好使用自定义的命名空间。[1]
作为一个文本文件,函数可以很容易地进行修改,并且在执行大量命令时更不容易像命令方块一样造成延迟。如果对函数文件进行了修改,则可以使用/reload来重新从硬盘加载函数文件。这允许Minecraft识别对函数文件的更改,而不必退出并重新进入世界。
成功执行函数将会在聊天栏显示信息:执行了函数[函数名]中的[数量]个命令。函数内部命令的成功与否并不能直接被比较器检测(虽然你还是可以通过/stats或者/scoreboard来获取这些信息)。
函数格式
在一个.mcfunction文档里,每一条有效的命令占据一行,并且不允许在行首使用斜杠。玩家可以在函数文档中通过#来添加注释。
在函数文档中,单个命令的长度不受命令方块字符数上限32,500的限制,但是同一游戏刻运行的总命令数量受/gamerule maxCommandChainLength的限制(默认为65536)。超过此数量限制的命令将在运行时被忽略。
函数的运行
函数将在一游戏刻内运行其中的所有命令。同时,如果一个函数是被其它的函数所引用,那么它将同其父函数在同一游戏刻运行。
在一个函数运行过程中,通过命令造成的其执行者的位置变动并不会影响此函数(及其子函数)中其它命令的执行参考点,即可以视为执行参考点将被锁定到函数的下一次执行。可以使用/execute来绕过这个限制。
例如:
tp @a ~ ~5 ~ setblock ~ ~-1 ~ emerald_block execute @a ~ ~ ~ setblock ~ ~-1 ~ diamond_block
这3个命令会将所有玩家向上传送5方格、将绿宝石方块放置在玩家传送前位置的脚下,并将钻石方块放置在玩家传送后位置的脚下。
这个特性不会影响到命令中出现的实体选择器及其参数,它们将始终在被执行时将执行者的当前坐标作为选择的中心。
游戏中目前有以下几种方式运行函数:
命令
- 允许玩家运行一个函数一次。
- 函数中命令的执行者为执行此命令的实体或命令方块。
- 具有可选参数
if和unless,可仅在目标选择器选中或未选中对象时运行函数。 - 语法:
function <函数名> [if|unless] [目标选择器]
/gamerule gameLoopFunction
- 函数每一刻均运行一次。
- 函数中命令的执行者为gameLoopFunction虚拟执行者(等同于拥有2级管理员权限的服务器本身)。
- “服务器”执行命令的坐标在(0,0,0)
- 若需要执行多个函数,可在主函数内调用其它函数。
- 语法:
/gamerule gameLoopFunction <命名空间:指向函数文件的路径>
进度
达成一个进度时,可以运行一个函数作为奖励。函数中命令的执行者是达成进度的玩家。
奖励函数在进度JSON文件中通过以下方式调用:
{
"rewards": {
"function": "命名空间:指向函数文件的路径"
}
}
历史
| release | |||||
|---|---|---|---|---|---|
| 1.12 | pre1 | 函数功能加入游戏。 | |||
| pre3 | 函数中的命令不再允许以反斜杠“/”开头。 | ||||
现在仅能使用#来注释,不再允许使用先前的//。 | |||||
| pre4 | 加入了新的参数:[if|unless] [选择器]。 | ||||
| pre6 | 在命令中使用函数时,函数执行被跳过(执行条件不符)的情况现在被视为命令失败。 | ||||
漏洞
Template:Issue list
参考
| 版本 | |||||||
|---|---|---|---|---|---|---|---|
| 开发周期 |
| ||||||
| 技术 |
| ||||||
| 多人游戏 | |||||||
| 游戏订制 | |||||||