本站文本内容除另有声明外,均在知识共享 署名-非商业性使用-相同方式共享 3.0 协议下提供。(详情…本站文本内容除另有声明外,均在知识共享 署名-非商业性使用-相同方式共享 3.0 协议下提供。(详情…中文Minecraft Wiki是完全公开的。请勇于扩充与修正内容!中文Minecraft Wiki是完全公开的。请勇于扩充与修正内容!Minecraft中文Wiki微博正在更新!或许有兴趣去看看Minecraft中文Wiki微博正在更新!或许有兴趣去看看想与其他用户进行编辑上的沟通?社区专页正是为此创建的。想与其他用户进行编辑上的沟通?社区专页正是为此创建的。翻译或创建页面之前,不妨看看译名标准化Wiki条例页面。翻译或创建页面之前,不妨看看译名标准化Wiki条例页面。需要管理员的协助?在管理员告示板留言也许可以帮到您。需要管理员的协助?在管理员告示板留言也许可以帮到您。

Hello there! We are conducting a survey to better understand the user experience in making a first edit. If you have ever made an edit on Gamepedia, please fill out the survey. Thank you!

函数

来自Minecraft Wiki
跳转至: 导航搜索
Information icon.svg
此特性为Java版基岩版独有。

函数(Function)是一个允许玩家利用扩展名为.mcfunction的文本文档编写和运行多行命令的功能。

用法[编辑 | 编辑源代码]

要使用函数,首先必须把文本文档放置在[世界名称]/datapacks/[数据包名称]/data/[命名空间]/functions内的顶层文件夹中。在单人游戏,这个世界文件夹可以在.minecraft/saves中找到。对于多人游戏,函数必须放置在每一个需要使用这个函数的世界文件夹中。这个顶层文件夹的名字将在调用其中函数时作为其命名空间。当然,函数也可以被放置在这个顶层文件夹的子文件夹中。

例如,运行函数custom:example/test将引用位于datapacks/数据包名称/data/custom/functions/example/test.mcfunction的文件。如果命名空间在尝试调用某个函数时被忽略,将默认使用minecraft:这个命名空间。为了避免在未来的版本因为mojang对默认命名空间的改动而导致意料之外的事,最好使用自定义的命名空间。[1]

作为一个文本文件,函数可以很容易地进行修改,并且在执行大量命令时更不容易像命令方块一样造成延迟。如果对函数文件进行了修改,则可以使用/reload来重新从硬盘加载函数文件。这允许Minecraft识别对函数文件的更改,而不必退出并重新进入世界。

成功执行函数将会在聊天栏显示信息:执行了函数[函数名]中的[数量]条命令。函数内部命令的成功与否并不能直接被比较器检测(虽然你还是可以通过/stats或者/scoreboard来获取这些信息)。

函数格式[编辑 | 编辑源代码]

测试函数系统。这个简单的函数使用了发送了3次/tellraw消息,执行了1次/give命令。

在一个.mcfunction文档里,每一条有效的命令占据一行,并且不允许在行首使用斜杠。玩家可以在函数文档中通过#来添加注释。

在函数文档中,单个命令的长度不受命令方块字符数上限32,500的限制,但是同一游戏刻运行的总命令数量受/gamerule maxCommandChainLength的限制(默认为65536)。超过此数量限制的命令将在运行时被忽略。

函数的运行[编辑 | 编辑源代码]

函数将在一游戏刻内运行其中的所有命令。同时,如果一个函数是被其他的函数所引用,那么它将同其父函数在同一游戏刻运行。函数会使用一切被称为函数的命令环境,这包括命令执行者、位置、坐标等。

无论命令的顺序如何,对函数内发生的命令环境的更改都不会影响同一函数内(及其子函数内)其他命令使用的命令环境,直到下一次迭代为止。 /execute命令是一个例外,它将更新命令环境。

例如:

execute as @a at @s run function foo:bar

其中foo:bar的内容是:

teleport @s ~ ~5 ~
setblock ~ ~-1 ~ minecraft:emerald_block
execute at @s run setblock ~ ~-1 ~ minecraft:diamond_block


这3个命令会将所有玩家向上传送5方格、将绿宝石方块放置在玩家传送前位置的脚下,并将钻石方块放置在玩家传送后位置的脚下。这个特性不会影响到命令中出现的目标选择器参数。

游戏中目前有以下几种方式运行函数:

命令[编辑 | 编辑源代码]

/function
  • 允许玩家运行一个函数一次。
  • 函数中命令的执行者为执行此命令的实体或命令方块。
  • 语法:function <函数名>

进度[编辑 | 编辑源代码]

达成一个进度时,可以运行一个函数作为奖励。函数中命令的执行者是达成进度的玩家。

奖励函数在进度JSON文件中通过以下方式调用:

{
    "rewards": {
        "function": "命名空间:指向函数文件的路径"
    }
}

标签[编辑 | 编辑源代码]

函数可以通过数据包中的标签组合到一起。这些标签被调用时就会运行所有有/function #(命名空间):tag的函数。

minecraft:tick标签的函数会自动在每一个游戏刻的开始运行。有minecraft:load标签的函数会在加载数据包之后运行。

历史[编辑 | 编辑源代码]

Java版
1.12 pre1 函数功能加入游戏。
pre3 函数中的命令不再允许以反斜杠“/”开头。
现在仅能使用#来注释,不再允许使用先前的//
pre4 加入了新的参数:[if|unless] [选择器]
pre6 在命令中使用函数时,函数执行被跳过(执行条件不符)的情况现在被视为命令失败。
1.13 17w43a 自定义函数被移动至数据包中。
17w45a 函数在加载时就会被完全解析与缓存。
17w49b 函数现在可以有标签了。
标签minecraft:tick的函数现在会在每一个游戏刻的开始时运行。
基岩版
1.8 beta 1.8.0.10 函数功能加入游戏。

漏洞[编辑 | 编辑源代码]

关于“函数”的漏洞由漏洞追踪器维护,请在那里使用英文汇报漏洞。

参考[编辑 | 编辑源代码]