命令函数
命令函数(Function,Wiki译名为函数),是1.12新加入的功能。用途为在被调用的gt执行命令函数文件内的全部命令,且支持无延迟调用别的命令函数。
本章节将会分为三部分:
- 命令函数文件
- 命令函数命令
- 命令函数常用逻辑
文件
命令函数是一个文本文件,编码为UTF-8无BOM,后缀为.mcfunction
。
放在/.minecraft/(存档)/data/functions/(命名空间)/(任意路径)/(名称).mcfunction
(任意路径可以为空)。
命名空间、文件夹名称、文件名称建议为小写英文字符(游戏无论大小写也一律会当作小写),字词之间以_
分隔。
例子(从functions
文件夹开始):
/test/a/b/c.mcfunction
。即命名空间为test
,路径为a/b/c.mcfunction
。/test2/a.mcfunction
。即命名空间为test2
,路径为a.mcfunction
。/a.mcfunction
。错误,必须放在某个命名空间之内。
可以通过在cmd里输入
type 文件名称
,查看输出,来分辨文件是否无BOM
如果有BOM,第一个字符会为?
或者是乱码,无Bom则为正常的字符。
函数名称
命令里经常需要使用函数名称,由命名空间及路径组成。格式为:
(命名空间):(路径,删去后缀名)
在上方的例子中,前两个命令函数的函数名称分别为:
test:a/b/c
test2:a
在命令中使用时,函数名称无视命名空间和函数名的大小写。
战利品表(Loot table)以及进度(Advancement)也是使用这个格式。
文件内容
文件内容为多条命令,每条命令占据一行(不能 以/
符号作开始),空行及注释会被忽略。
注释:以#
作开始的行,如#这是一条注释
空行会被忽略
例子:
# test:1
say test
say 1
setblock ~ ~-1 ~ stone
命令
关于执行点,请参见 命令执行
高频执行函数
gamerule gameLoopFunction <函数名称>
每gt执行一次指定命令函数(于gt完结时执行,故一些数值如HurtTime
只能检测到9)。
注意,执行坐标为(0, 0, 0),权限等级为2,即无法执行
op
这类命令。
执行单一函数一次
function <函数名称> [<if|unless> <选择器>]
- 函数名称: 需要执行的命令函数的函数名称(见上方)。
- if: 如果后方选择器选择到任何目标就执行命令函数。
- unless: 如果后方选择器选择不到目标就执行命令函数。
- 没有if/unless: 执行命令函数。
可以在一个命令函数中无延迟调用别的命令函数,命令函数里的命令的执行坐标为当前这条function
命令的执行坐标。
即使命令函数里曾经利用如
tp
命令修改执行者坐标,其他命令的执行坐标也不会改变。要确保能获得执行者最新坐标的话请使用execute
命令。
也能够调用自己(递归,recursion),然而切记添加跳出条件,否则便会出现无限循环(仍受gamerule maxCommandChainLength
执行命令数限制,然而终究是不好的)。
当目标命令函数执行完毕后会回归到本命令调用后的位置然后继续执行。执行顺序如下图所示(从左上方开始):
所以输出为
start a
start b
start b (这是recursion的部分)
end b (这是recursion的部分)
end b
end a
进度Reward
可以通过进度(Advancement)的reward对目标玩家执行一次命令函数。这会在进度章节说明。
限制命令执行数量
可以通过命令限制1次命令函数执行的总命令数量。
gamerule maxCommandChainLength <数量>
或许你们能够用这个来干掉别人的反作弊吧...你们能够用这个来关掉失控了的系统。
除了这个以外我也没想到啥用途了。
逻辑
其实也没啥逻辑可言...就模块化而已,玩多了就熟了。
部分人生经验:
- 类似功能的弄成一个命名空间
- 一组达成一个功能的命令就放在一个命令函数里。经常需要调用的也可以放在一个命令函数里。
- 尽量不要在主要高频的命令函数里写太多命令,最好是调用别的命令函数,这样会更容易维护。
- 部分需要特定时候才执行的命令可以把那部分的命令放在单一命令函数,使用
if|unless
,以实体的tag/分数作控制。 - 如果一个命令函数会被经常调用,但中间某部分命令会被替换:把前后的命令放进新的函数。
- 递归(调用自己)切记要以
if|unless
进行调用。 - 部分事件可以考虑使用进度(Advancement),详情见之后的事件章节。
这部分是给会编程的玩家看的。
命令函数是没有回传(Return)的,所以你不能提早完结命令函数。你只能把后面的放进别的命令函数放进别的命令函数里,看情况进行调用。
例子
本教程里需要使用命令函数的部分会在命令开始标识这是一个函数文件,比如:
# test:test1
say 这是一条命令
这个就是放在data/functions/test/test1.mcfunction
里的函数内容了。