写在前面
本教程面向对MC指令有一定了解的玩家,不建议零基础玩家根据此教程学习mc数据包。本教程跳过了数据包的创建与安装等入门级别的部分,关于这部分,详情请见Minecraftwiki:数据包/制作数据包页面
什么是函数
函数是一系列顺次执行的指令,允许玩家利用扩展名为.mcfunction
的文本文档编写和运行多行命令的功能。
函数的用法与格式
创建一个函数文档,你需要在[世界名称]/datapacks/[数据包名称]/data/[命名空间]/functions
的上层文件夹中创建[函数名].mcfunction
的文本文档。其中,[函数名]
的组成可以包括数字、小写字母、连字符、下划线,否则,mc将无法读取该函数文档。
函数文档内,每一行都是一个待执行的指令。注意指令前面不可以带上/
,mc还允许使用#
引出一段注释。在函数文档中,单个命令的长度不受命令方块字符数上限32,500的限制,但是同一游戏刻运行的总命令数量受/gamerule maxCommandChainLength
的限制(默认为65536)。超过此数量限制的命令将在运行时被忽略。以下是一段实例。
#传送执行者到头顶上方5格
teleport @s ~ ~5 ~
setblock ~ ~-1 ~ minecraft:emerald_block
execute at @s run setblock ~ ~-1 ~ minecraft:diamond_block
若函数中的任一一行指令有语法上的错误,函数文件都不会被mc读取。
函数的运行
任一一条有效的函数文件都可以在游戏中以[命名空间]:[函数名称]
的格式被引用。例如:datapacks/[数据包名称]/data/custom/functions/example/test.mcfunction
的函数文件,可以在游戏中以custom:example/test
的格式被引用。若[命名空间]
为mc默认命名空间minecraft
,那么引用时[命名空间]
可以被省略。因此,为了避免mc在未来版本对命名空间规则作出重大调整,应尽量使用自定义命名空间。
玩家可以使用/function
来执行数据包中的一个函数文件。语法为/function <函数名>
,其中,<函数名>应为一个函数文件在游戏中被引用的格式。在上面的例子中,玩家执行这一函数文件,应执行指令/function custom:example/test
。(拓展:想要检查一个函数文件中是否出现语法错误,可以在mc中先执行指令/reload
,然后打出/function
,之后确认mc是否自动补全了该函数文件的引用名。若没有出现,则该函数文件内出现了语法错误。)
若函数执行成功,游戏内会返回信息:执行了函数[函数名]中的[数量]条命令。
在玩家重新进入世界时,mc会自动更新数据包内容。如果对函数文件或其位置进行了修改,则可以使用/reload
来重新从硬盘加载整个数据包。这允许mc识别对函数文件的更改,而不必退出并重新进入世界。
命令环境规则
函数将在一游戏刻内运行其中的所有命令。同时,如果一个函数是被其他的函数所引用,那么它将同其父函数在同一游戏刻运行。函数会使用一切被称为函数的命令环境,这包括命令执行者、位置、坐标等。无论命令的顺序如何,对函数内发生的命令环境的更改都不会影响同一函数内(及其子函数内)其他命令使用的命令环境,直到下一次迭代为止。/execute
命令是一个例外,它将更新命令环境。
例如:一名名叫BoiledDemon的玩家执行函数example:1
,其内容为:
tp @s ~ ~1 ~
function example:2
其中example:2
的内容为
tp @s ~ 1 execute as cantian666 at @s run function example:3
其中example:3
的内容为
kill MetroCrt
在example:1
中,example:1
是example:2
的父函数,于是,两个函数的执行者都为BoiledDemon,执行位置都位于BoiledDemon所在的位置,执行对象都为@s
,即执行者自己BoiledDemon。
在example:2
中,example:2
是example:3
的父函数,但在example:2
中,example:3
以/execute
的形式被引用,于是,example:3
的内容的执行者由execute
决定。
由上可知,在BoiledDemon执行完函数example:1
后,他自己会向上移动2格,名为cantian666的玩家会杀死名为MetroCrt的玩家。
-··本篇完··-
下期指路→【教程】Minecraft数据包初步#2—标签