我的世界1.12版函数命令系统教学详解 函数命令系统教程( 二 )


say @s
但是不能这样写:
/say @s
最后有一点需要注意的是,在function指令中调用函数时,不区分大小写 。例如前面say命名空间下的Text1.mcfunction,我在调用的时候写的是say:text1
然后是第二种形式,也就是带有if|unless的 。我简单举两个例子,大家就知道是什么意思了 。
say:tellraw.mcfunction
scoreboard objectives add timer dummy 计时器
scoreboard players add @s timer 1
function random:title if @s[score_timer_min=1200]
scoreboard players reset @s[score_timer_min=1200] timer
random:title.mcfunction
summon area_effect_cloud ~ ~ ~ {Tags:["rnd_title","rnd_title1"]}
summon area_effect_cloud ~ ~ ~ {Tags:["rnd_title","rnd_title2"]}
summon area_effect_cloud ~ ~ ~ {Tags:["rnd_title","rnd_title3"]}
summon area_effect_cloud ~ ~ ~ {Tags:["rnd_title","rnd_title4"]}
summon area_effect_cloud ~ ~ ~ {Tags:["rnd_title","rnd_title5"]}
entitydata @r[r=0,type=area_effect_cloud,tag=rnd_title] {CustomName:"rnd_title"}
execute @e[name=rnd_title,tag=rnd_title1] ~ ~ ~ tellraw @a[r=0,c=1] ["1"]
execute @e[name=rnd_title,tag=rnd_title2] ~ ~ ~ tellraw @a[r=0,c=1] ["2"]
execute @e[name=rnd_title,tag=rnd_title3] ~ ~ ~ tellraw @a[r=0,c=1] ["3"]
execute @e[name=rnd_title,tag=rnd_title4] ~ ~ ~ tellraw @a[r=0,c=1] ["4"]
execute @e[name=rnd_title,tag=rnd_title5] ~ ~ ~ tellraw @a[r=0,c=1] ["5"]
将say:tellraw放到主进程中
execute @a ~ ~ ~ function say:tellraw
则每位玩家每分钟将会看到1~5中随机一个数字出现在聊天框 。也就是说,只有计时器分数满1200的人会执行后面的随机部分 。那么很显然,带有if的意思就是,如果能找到后面的选择器,就执行这个函数,否则不执行 。相当于testfor 。
那么unless的意思也就很明显了:在找不到后面的选择器的时候,执行这个函数,相当于testfor+非门 。
gameLoopFunction
讲完调用,就该讲讲高频了 。玩命令方块的人都知道高频是实现许多功能的前提 。在函数系统中,MOJANG 为我们提供了一条名为gameLoopFunction的游戏规则来实现高频 。它的格式是
gamerule gameLoopFunction <命名空间:函数>
也就是说,你可以指定一个函数来高频执行,这个高频是20Hz的,也就是每一个游戏刻都会执行一遍 。新建的存档如果没有执行过这条指令,而是用gamerule gameLoopFunction来查询的话,得到的返回值是-
为了方便,我们将这个规则简称为glf 。在旧版本中,glf指定的函数,由系统(server)作为执行体;而在新的版本中,MOJANG 引入了虚拟执行体,例如将 say:text2 指定为glf时,每一个游戏刻得到的结果是这样的
[say:text2] 3
[say:text2] 4
也就是说,系统不再作为执行体,而是由虚拟的执行体代为执行 。
关于 glf 多说两句 。使用 glf 去高频执行一个函数,和使用 RCB(循环型命令方块,紫色那种)去执行,是不一样的 。区别主要在于其更新顺序先后 。一般而言不会造成严重影响,但是在某些情况会不一样 。比如,使用 CB 能检测到生物的{HurtTime:10s}这个 NBT,而使用 glf 执行函数只能检测到的是{HurtTime:9s},检测不到10,这是因为关于函数的更新,都放在了生物更新之后,而 CB 的更新则是在生物更新之前 。详情可以看这里 。按照 Searge 的说法,函数并不是命令方块的完全替代 。这个说法,大家就见仁见智了 。对我个人而言这个影响不大 。
以上是函数系统的相关构成,以及如何调用函数 。接下来我们来了解一下函数系统的模块分类 。
函数系统的模块调用

推荐阅读