请选择 进入手机版 | 继续访问电脑版
查看: 5016|回复: 115

[命令方块] Function教程——创建,使用,递归,及1.13中的改动

  [复制链接]

38

主题

440

帖子

233

积分

Lv.5 农牧专家

UID
16359
小麦
77
金锭
1113
下界之星
0
发表于 2018-6-24 13:04:06 | 显示全部楼层 |阅读模式
本帖最后由 Msure 于 2018-6-24 15:38 编辑

感谢@Argon_gas的帖子,感觉论坛里很少有说function的,所以这篇帖子将对function进行简单的介绍。

1 什么是function?有什么用?
是一个允许玩家利用扩展名为.mcfunction的文本文档编写和运行多行命令的功能。
简单的来说,只要写一个扩展名为.mcfunction的文本文档,在里面写上一条条的命令(和命令方块命令相同),即可在游戏中执行。
利用function可以执行大量命令(省的你摆命令方块)以及在1gt内重复执行某命令n次(递归操作)
执行大量命令的情况:需要对游戏中的情况进行成百上千大量的穷举。
重复执行某命令n次:一些特殊操作。

为了让大家还有兴趣看完这枯燥无味的帖子......发两个利用function做的入门小玩意,大概能激起一部分人看完的决心......
爆炸.gif

QQ图片20180624125917.gif

2 如何食用function(1.12——1.12.2)
2.1 创建一个function
首先打开游戏存档目录,在存档目录下打开data即可找到名为functions的文件夹。打开functions文件夹,在里面再新建一个名字随便的文件夹,如我新建一个文件夹叫sure,这个sure的文件夹即为命名空间。
之后,我在sure文件夹里新建一个记事本,命名为hello,并把后缀txt改成mcfunction。注意,此时该记事本文件应该已经变成了hello.mcfunction而不是hello.txt(需要在选项里把显示后缀名打开才能更改)
创建完之后,需要用notepad++打开这个hello.function(右键,打开方式),之后在里面输入以下指令:(注意前面没有/)

  1. say hello

  2. #say hello
  3. say bye
复制代码
点击保存,一个最简单的function就创建好了。

2.2 单次执行function
接下来我们只要打开游戏,执行:
  1. /function sure:hello
复制代码
function中命令从上向下执行,空行会被直接忽视跳过,前面带有#的代表注释也会被忽略。即可看到聊天框输出:

[玩家] hello
[玩家] bye

function的执行格式为:
  1. /function <函数名称> [<if|unless> <选择器>]
复制代码
可以看到function可以用if|unless来选择执行条件。if表示满足选择器条件时执行function,unless表示不满足选择条件时执行function。
2.3 循环执行function
最简单的办法就是放到循环命令方块里了
当然一般我们可用gamerule来循环执行:
  1. /gamerule gameLoopFunction <函数名称>
复制代码
可以在一个function中写入几个function,由此循环执行多个function

3 function的递归
递归,即为自己调用自己。简单的来说,在一个function中执行这个function本身,那么在1gt内就会一直执行下去(会卡死,所以要加条件限制)
举例:
首先创建记分板times,召唤名为times的盔甲架,设定盔甲架在记分板上为0分
在命名空间sure中创建function名为hello
输入以下指令:
  1. say hello
  2. scoreboard players add @e[name=times] times 1
  3. function sure:hello if @e[score_times=2]
  4. say bye
复制代码
保存后在游戏中执行function sure:hello

来分析一下执行情况
(第一次,0分)say hello
(第一次,0分)scoreboard players add @e[name=times] times 1
(第一次,1分)function sure:hello if @e[score_times=2]   <-----满足条件,执行成功,再次执行function本身。
                       (第二次,1分)say hello
                       (第二次,1分)scoreboard players add @e[name=times] times 1
                       (第二次,2分)function sure:hello if @e[score_times=2]   <-----满足条件,执行成功,再次执行function本身。
                                              (第三次,2分)say hello
                                              (第三次,2分)scoreboard players add @e[name=times] times 1
                                              (第三次,3分)function sure:hello if @e[score_times=2]   <-----不满足条件,无法执行。
                                              (第三次,3分)say bye   <-----返回之前位置
                       (第二次,3分)say bye  <-----返回之前位置
(第一次,3分)say bye

由此可见,通过递归,在1gt内执行了三次function,并且可以通过调整分数来调整执行次数。递归中当function不满足条件时,会返回之前插入的位置继续执行下去。

4 [1.13]中的function
1.13中function被放到了数据包里,数据包除了function还有很多其他功能,这里只说function。
在地图文件目录下,打开datapacks文件,在里面再创建一个文件(只能数字.小写字母._ 命名)即为数据包名字。
在数据包里创建记事本,改名为pack.mcmeta(注意mcmeta是后缀)
还用notepad++打开,输入以下代码[sup][1][/sup]
  1. {
  2.    "pack": {
  3.       "pack_format": 1,
  4.       "description": "name"
  5.       }
  6. }
复制代码
"pack_format": 后面为任意数字,"description": 后为悬浮显示名称,点击保存。

然后再在数据包里新建一个文件夹(只能数字.小写字母._ 命名)即为命名空间。
之后在命名空间里创建functions文件夹,再在functions文件夹里创建记事本hello,改后缀名称为.mcfunction,就创建好了一个function。
执行时还按照function <命名空间>:<函数名称>即可
注意:1.13去除了/function <函数名称> [<if|unless> <选择器>]这种用法,只能/function <函数名称> 取而代之的是execute if|unless entity <选择器> run function <函数名称>

参考资料:
[1]pineapple_. 1.13数据包食用方法入门教程.

游客,如果您要查看本帖隐藏内容请回复






评分

参与人数 2 小麦 +2 金锭 +8 收起 理由
Entity404 + 1 + 3 链接挂了
Argon_gas + 1 + 5 666666

查看全部评分

0

主题

100

帖子

112

积分

Lv.4 怪物猎人

UID
5314006
小麦
86
金锭
359
下界之星
0
发表于 2018-6-24 19:19:56 | 显示全部楼层
这个隐藏内容是什么?(还有,有些地方乱码了)

0

主题

30

帖子

8

积分

Lv.1 新手木匠

UID
5040501
小麦
0
金锭
34
下界之星
0
发表于 2018-6-24 19:32:14 | 显示全部楼层
666

0

主题

217

帖子

59

积分

Lv.3 矿物能手

UID
62707
小麦
2
金锭
461
下界之星
0
发表于 2018-6-24 19:35:12 | 显示全部楼层
很好奇前面两个怎么做的
我只是来水个帖的

0

主题

217

帖子

59

积分

Lv.3 矿物能手

UID
62707
小麦
2
金锭
461
下界之星
0
发表于 2018-6-24 19:40:58 | 显示全部楼层
那如何让盔甲架往面朝着的地方tp呢?
我只是来水个帖的

0

主题

100

帖子

112

积分

Lv.4 怪物猎人

UID
5314006
小麦
86
金锭
359
下界之星
0
发表于 2018-6-24 19:44:01 | 显示全部楼层
lz,提个建议:论坛里面讲进度太少了,教进度的根本没有。你就发一个吧,我老是打错,wiki又老是上不去。

点评

emmmmmmmmmmmmmmmmmmmmmmm  发表于 2018-8-3 10:41

38

主题

440

帖子

233

积分

Lv.5 农牧专家

UID
16359
小麦
77
金锭
1113
下界之星
0
 楼主| 发表于 2018-6-24 19:54:54 来自手机 | 显示全部楼层
Entity404 发表于 2018-6-24 19:44
lz,提个建议:论坛里面讲进度太少了,教进度的根本没有。你就发一个吧,我老是打错,wiki又老是上不去。

说实话进度我也不会2333没研究过

点评

What?额……  发表于 2018-6-24 20:05

6

主题

324

帖子

1023

积分

Lv.7 下界居民

UID
3302
小麦
922
金锭
2700
下界之星
0
发表于 2018-6-25 10:10:37 | 显示全部楼层
Redstonecreeper 发表于 2018-6-24 19:40
那如何让盔甲架往面朝着的地方tp呢?

1.13了解一下

21

主题

567

帖子

156

积分

Lv.4 怪物猎人

UID
34319
小麦
-11
金锭
531
下界之星
0
发表于 2018-6-25 11:36:51 | 显示全部楼层
看不懂
头像被屏蔽

75

主题

1121

帖子

444

积分

Lv.? 禁止发言

UID
5227236
小麦
84
金锭
1116
下界之星
0
发表于 2018-6-25 13:40:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

0

主题

37

帖子

10

积分

Lv.1 新手木匠

UID
5390747
小麦
0
金锭
26
下界之星
0
发表于 2018-6-25 14:40:10 | 显示全部楼层
...

1

主题

71

帖子

19

积分

Lv.1 新手木匠

UID
4972458
小麦
0
金锭
2
下界之星
0
发表于 2018-6-25 14:46:39 来自手机 | 显示全部楼层
轻武器完全

0

主题

217

帖子

59

积分

Lv.3 矿物能手

UID
62707
小麦
2
金锭
461
下界之星
0
发表于 2018-6-25 14:52:30 | 显示全部楼层

所以到底怎么做[允悲]

点评

局部坐标不是要穷举?  发表于 2018-6-25 17:19
局部坐标了解一下。  发表于 2018-6-25 16:45
我只是来水个帖的

40

主题

1356

帖子

748

积分

Lv.6 附魔大师

UID
5000750
小麦
362
金锭
1063
下界之星
0
发表于 2018-6-25 18:43:12 | 显示全部楼层
Redstonecreeper 发表于 2018-6-25 14:52
所以到底怎么做[允悲]

局部坐标不用穷举啊.

40

主题

1356

帖子

748

积分

Lv.6 附魔大师

UID
5000750
小麦
362
金锭
1063
下界之星
0
发表于 2018-6-25 19:13:00 | 显示全部楼层
看完递归后的一个疑问:
当分数不满足时停止执行Function,然后再执行say bye?
还是说say bye与第二次的Function同时执行
以及能否把菠萝大佬的教程给个链接...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部