我的世界籽岷新手教程

钟逸 8 2024-04-26 10:36:18

《我的世界》1.12函数命令系统入门教程 函数命令怎么用

《我的世界》1.12版本新增了函数命令这一内容,很多玩家觉得非常复杂,也有玩家发现这个命令可以完全脱离命令方块而存在,那么下面小编就为大家带来《我的世界》1.12函数命令系统入门教程,告诉大家函数命令怎么用,希望大家喜欢。

写在前面的话

1.9的更新为我们带来了三色命令方块,让命令方块脱离了红石成为独立的体系,我们因此可以更好实现一些想法;时隔3个版本,MOJANG再次为我们带来惊人的变革。

1.12中,函数与进度系统的出现,让命令脱离命令方块——这句曾经说过的玩笑般的预言,正式成为可能。

函数系统的构成

函数系统的由来

函数(function)系统,是 MC 1.12 Pre-1版本中新增的一个功能,它将原来进度系统中返回指令的部分单独提取出来,做成了现在的函数系统。

函数系统的形式

函数系统由命名空间和函数文件组成,这些文件保存在存档目录/data/functions/下。functions目录下的文件夹,称为命名空间,各个命名空间下存放不同的函数文件。实际上,命名空间就是方便我们编写者分类并管理各种函数文件。

函数文件是以.mcfunction为后缀名的文本文件,建议采用utf-8无BOM编码以防显示错乱。简单来讲,一个函数等价于一个多行命令方块,函数文件里面每一行写一条指令,当执行这个函数时,里面的指令会按行依次执行。如果在一个函数中调用其它函数,那么在同一游戏刻,被调用的函数中所有指令先执行完,再继续当前函数中后续的指令,就像插队一样,我们在后面对比命令方块时还会说到这个。

请注意:在 1.12 Pre-3版本中存在一个严重漏洞,即命令执行体不能正确地通过execute传递到被调用的函数中去,这个漏洞有望在后续版本以及正式版修复。

以下是本文用到的一个函数系统的目录,带有"+"的表示为目录

+ functions+ say hi.mcfunction bye.mcfunction Text1.mcfunction text2.mcfunction+ system+ process _process.mcfunction _main.mcfunction player_tick.mcfunction

如何调用函数

在 1.12中,MOJANG新增了function指令和一条名为gameLoopFunction的游戏规则来辅助我们使用函数系统。function指令的格式如下:

function<命名空间:函数名>function<命名空间:函数名><选择器>

这两条都是可行的。其中,if|unless是在1.12 pre-4加入的功能,后面我会解释到这个。我们先来说说第一种形式。例如上面的目录中,要调用system这个命名空间下的_main文件,就是输入这样的指令:

function system:_main

现在,我们来看一个例子例如say命名空间下的Text1.mcfunction和text2.mcfunction,里面分别写上这些内容

Text1.mcfunction

#这是一个范例,在function文件中可以用#来注释行。请注意,不能够使用//来注释!say 1function say:text2say 2

text2.mcfunction

say 3say 4

当我在系统后台输入function say:text1时,聊天框会出现这些内容:[server] 1[server] 3[server] 4[server] 2

也就是说,执行function指令的人,会把函数里面的指令依次执行——我在系统后台输入function指令,就是系统在执行,我自己输入function指令,就是我本人在执行。大家可能注意到了,函数中支持使用#进行注释(旧版本支持//注释,当前版本已经不再支持),也就是说被注释行不会作为指令而执行,这一点有多方便相比不比我再说了。同时需要大家注意:函数中所有指令不能够以/开头。例如,你可以这样写:

say@s

但是不能这样写:

/say@s

最后有一点需要注意的是,在function指令中调用函数时,不区分大小写。例如前面say命名空间下的Text1.mcfunction,我在调用的时候写的是say:text1

然后是第二种形式,也就是带有if|unless的。我简单举两个例子,大家就知道是什么意思了。

say:tellraw.mcfunctionscoreboard objectives add timer dummy计时器scoreboard players add@s timer 1function random:title if@s[score_timer_min=1200]scoreboard players reset@s[score_timer_min=1200] timerrandom:title.mcfunctionsummon 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的说法,函数并不是命令方块的完全替代。这个说法,大家就见仁见智了。对我个人而言这个影响不大。

以上是函数系统的相关构成,以及如何调用函数。接下来我们来了解一下函数系统的模块分类。

《我的世界》精华文章推荐合成表大全前期生存图文指南怪物图鉴及属性一览敖厂长生存解说视频新手建筑指导班豪华建筑建造教程俾斯麦号建造方法 WE建筑辅助教程创建服务器方法指南加入服务器联机教程多人联机生存视频更换皮肤方法说明 MOD安装图文教程功能性MOD推荐籽岷视频MOD介绍精美材质包推荐

上一篇:蜀门手游锻造加8攻略
下一篇:手游版守望先锋叫什么
相关文章
返回顶部小火箭