加入收藏 | 设为首页 | 会员中心 | 我要投稿 二游网_173173游戏网 (http://www.173173youxi.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 新闻中心 > 攻略战报 > 正文

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

发布时间:2017-06-09 11:09:52 所属栏目:攻略战报 来源:我的世界中文论坛
导读:副标题#e# 《我的世界》1.12版本新增了函数命令这一内容,很多玩家觉得非常复杂,也有玩家发现这个命令可以完全脱离命令方块而存在,那么下面小编就为大家带来《我的世界》1.12函数命令系统入门教程,告诉大家函数命令怎么用,希望大家喜欢。 写在前面的话

  advancement,亦简称adv,目前wiki翻译叫进度。这里就不多作介绍了。在17w17b中MOJANG允许进度返回指令作为达成进度的奖励,让不少玩家发现了新大陆。随后在17w18b中,MOJANG进一步完善进度系统,使其可以完全独立于命令方块而建立起一个命令系统;在1.12 pre1中,MOJANG又作出了修改,将进度系统中的命令部分拿出来做成了如今的函数系统。

  但是这并不意味着进度系统就不可以参与到命令系统中来,因为如今的进度系统可以返回函数作为达成进度的奖励

  相信很多人已经知道进度系统的结构了,但仍有相当一部分朋友还没有了解,在这里我们不妨来温习一下。

  自定义的进度,所有文件都保存在存档目录/data/advancements/下,在这里新建的文件夹同样都称为命名空间,命名空间下存放各种进度文件。进度文件使用 json 格式。这里展示一个用于进度命令系统的例子

  所涉及的两个文件分别是data/advancements/system/HelloTitle.json和data/functions/system/HelloTitle.mcfunction,这里进度和函数都用同样的命名空间和文件名方便记忆和管理,可以看到函数文件是 .mcfunction,而进度文件是 .json

  system:HelloTitle.json

  {
  "criteria":{
  "custom_name":{
  "trigger":"minecraft:tick"
  }
  },
  "rewards":{
  "function":"system:hellotitle"
  }
  }

  system:HelloTitle.mcfunction

  #revoke adv,用于下次再激活
  advancement revoke @s only system:hellotitle
  #命令部分
  scoreboard objectives add helloTitle stat.leaveGame
  scoreboard players tag @s[tag=HelloTitle,score_helloTitle_min=1] remove HelloTitle
  tellraw @s[tag=!HelloTitle] ["",{"text":"Hello ","color":"yellow"},{"selector":"@s"},{"text":"! Welcome to Minecraft!","color":"yellow"}]
  scoreboard players tag @s[tag=!HelloTitle] add HelloTitle
  scoreboard players reset @s[score_helloTitle_min=1] helloTitle

  这个进度会在下一个游戏刻达成,对象是全体在线玩家,达成进度后会执行HelloTitle.mcfunction中的指令。其实现的效果是,当玩家进入这个世界时,会在聊天框看见问候语(其他人看不到)

  可以看到,相比于以前命令方块高频,这里采用了进度系统的 tick 触发器和@s选择器。如果单纯用命令方块高频或者函数系统,那么只需要这样

  scoreboard objectives add helloTitle stat.leaveGame
  scoreboard players tag @a[tag=HelloTitle,score_helloTitle_min=1] remove HelloTitle
  execute @a[tag=!HelloTitle] ~ ~ ~ tellraw @s ["",{"text":"Hello ","color":"yellow"},{"selector":"@s"},{"text":"! Welcome to Minecraft!","color":"yellow"}]
  scoreboard players tag @a[tag=!HelloTitle] add HelloTitle
  scoreboard players reset @a[score_helloTitle_min=1] helloTitle

  区别就是选择器上的不一样。如果大家觉得进度系统很麻烦,可以不去使用,但是接下来我们会看到一个使用进度系统的其他触发器来调用函数的例子。例如,要让所有冒险模式玩家入水即死

  rules:DieInWater.json

  {
  "criteria":{
  "1":{
  "trigger":"enter_block",
  "condition":{
  "block":"water"
  }
  }
  },
  "rewards":{
  "function":"rules:dieinwater"
  }
  }

  rules:DieInWater.mcfunction

  #revoke
  advancement revoke @s only rules:dieinwater
  #commands
  scoreboard players tag @p[m=2,r=0] add waterKill
  execute @s[tag=waterKill] ~ ~ ~ tellraw @a [{"selector":"@s"},{"color":"white","text":" 被水淹没了"}]
  execute @s[tag=waterKill] ~ ~ ~ gamerule showDeathMessages false
  kill @s[tag=waterKill]
  execute @s[tag=waterKill] ~ ~ ~ gamerule showDeathMessages true
  scoreboard players tag @s[tag=waterKill] remove waterKill

  当玩家踏入水中时,我们要给玩家加上一个tag,然后杀掉他。至于为什么用@p而不用@s呢?因为@p不能选中死人,而@s可以,如果不想看到聊天框刷屏,就不要选择用@s。

  以上是利用进度系统的 enter_block(玩家进入方块) 这一触发器来实现落水即死功能的,如果单纯依靠函数,不依靠进度系统去实现的话,可以这样写

(编辑:二游网_173173游戏网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读