本帖最后由 贰逼 于 2017-7-16 13:15 编辑

函数文件中无法使用conditional这样一个快捷功能,这也造成了很多命令在1.11-升级为1.12时的困难。
当然也希望官方能够在将来制作函数文件使用conditional的功能,但在此之前,至少在目前版本,转入conditional指令的方法只有通过stats

这也许有些“返祖”,因为conditional早在1.8即可实现:1.8模块:stats与条件语句
由于函数文件的快捷性,极大提高了命令书写效率,对于一个拥有conditional命令的模块,我们只需首尾合计添加几个命令

例如:

游戏中这样一个conditional模块,可以实现条件检测(命令方块是否指向上方)

若条件不符则无输出




函数test:test也有如此功能,我们来看一下所有命令:
  1. #第一部分:创建一个过程实体,一个过程变量,初始化stats关联到这个实体(stats设为SuccessCount,检测命令是否执行成功)
  2. summon area_effect_cloud ~ ~ ~ {Duration:1,Tags:[general_Condition]}
  3. scoreboard objectives add general_Cond dummy
  4. scoreboard players set @e[tag=general_Condition] general_Cond 0
  5. stats entity @e[tag=general_Condition] set SuccessCount @e[tag=general_Condition] general_Cond

  6. #第二部分:主要的命令部分,第一条是被检测的命令,第二条是conditional命令
  7. execute @e[tag=general_Condition] ~ ~ ~ testforblock 0 56 0 minecraft:command_block facing=up
  8. execute @e[tag=general_Condition,score_general_Cond_min=1] ~ ~ ~ say 1
  9. #注意,每次使用后都要将过程变量初始化(设为0,不能reset,这样下一次无法执行stats统计)
  10. scoreboard players set @e[tag=general_Condition] general_Cond 0

  11. #第三部分:将过程变量删除
  12. scoreboard objectives remove general_Cond
复制代码
其中过程实体,过程变量意思是它们随着函数的执行开始产生,执行结束销毁

尽管看起来比condtional命令方块麻烦,但实际上函数文件比游戏内命令方块书写效率更高,而且利用stats实际上只是在首尾添加几个命令,所以应该说简化了过程。更重要的是利用stats,我们除了可以检测分数为1,还可以检测分数为0,做到unconditional
  1. execute @e[tag=general_Condition,score_general_Cond=0] ~ ~ ~
复制代码
除了SuccessCount,stats还有AffectedBlocks,AffectedEntities,AffectedItems,QueryResult,用于检测各类命令执行

检测命令执行成功的condtional通用格式:
  1. A
  2. cond:B
  3. C
  4. cond:D
  5. cond:E
复制代码
转为:
  1. summon area_effect_cloud ~ ~ ~ {Duration:1,Tags:[general_Condition]}
  2. scoreboard objectives add general_Cond dummy
  3. scoreboard players set @e[tag=general_Condition] general_Cond 0
  4. stats entity @e[tag=general_Condition] set SuccessCount @e[tag=general_Condition] general_Cond

  5. execute @e[tag=general_Condition] ~ ~ ~ A
  6. execute @e[tag=general_Condition,score_general_Cond_min=1] ~ ~ ~ B
  7. scoreboard players set @e[tag=general_Condition] general_Cond 0

  8. execute @e[tag=general_Condition] ~ ~ ~ C
  9. execute @e[tag=general_Condition,score_general_Cond_min=1] ~ ~ ~ D
  10. execute @e[tag=general_Condition,score_general_Cond_min=1] ~ ~ ~ E
  11. scoreboard players set @e[tag=general_Condition] general_Cond 0

  12. scoreboard objectives remove general_Cond
复制代码
关于多次嵌套conditional,stats第一次相对执行获取C执行情况,第二次相对执行就能够获取D的执行情况,无需任何其他计分板。
[groupid=546]Command Block Logic[/groupid]