本帖最后由 贰逼 于 2015-7-26 10:14 编辑

获取执行值
下一页为 stats用法
本章将引进新的概念:执行值。

执行值便是一个指令除了输出外执行的结果,通常返回执行的次数输出值或者条件真假
获取执行值就能够随机应变,根据判断来调整下一步输出;执行值也可以用作debug;执行值也可以变相获取游戏参数

在指令中,返回值的指令是stats。使用这条指令可以对指令影响的实体、方块、物品进行值的返回
结合条件语句进行下一步输出;或者产生对应参数


获取执行值将会涉及到

stats用法
  • 所有执行类型
  • 相对执行概念
  • 计分板调用
  • 实体储存
stats与条件语句
  • 一般执行
  • !非
  • 且&&
  • 或||
  • 结合表达式
stats与时钟

全索引链接
上一篇(循环嵌套)--下一篇(stats与条件语句)

§6.1 stats用法
下一页为 所有执行类别
stats指令的原理就是将实体或者方块中添加两个关联计分板的NBT,这个NBT是什么后面会讲到。

除了通过entitydata修改这两个NBT外,其实可以直接使用快捷的指令/stats更改,让对实体、方块的操作关联计分板
对于实体:
  1. /stats entity <相对执行的对象> <set/add> <stat类型> <计分板对象/假名> <计分板>
复制代码

对方快:
  1. /stats block <相对执行方块的坐标> <set/add> <stat类型> <计分板对象/假名> <计分板>
复制代码

        6.1.1 所有执行类别
下一页为 相对执行概念
  • SuccessCountObjective:计分板名称
  • SuccessCountName:计分板赋值实体选择器
表示上次执行的命令是否成功
返回值为真或假。(真为1,假为0)

  • AffectedBlocksObjective:计分板名称
  • AffectedBlocksName:计分板赋值实体选择器
表示上次执行成功的命令修改的方块数量
返回值为整数。

  • AffectedEntitiesObjective:计分板名称
  • AffectedEntitiesName:计分板赋值实体选择器
表示被上次执行成功命令修改的实体数量
返回值为整数。

  • AffectedItemsObjective: 计分板名称
  • AffectedItemsName:计分板赋值实体选择器
表示被上次执行成功命令修改的物品数量。(主要是物品栏,非实体物品)
返回值为整数。

  • QueryResultObjective: 计分板名称
  • QueryResultName: 计分板赋值实体选择器
表示上次命令的查询结果
返回值为整数。


        6.1.2 所有执行类别
下一页为 计分板调用/实体储存
既然说到了stats后有两个参数:blockentity
block可以对接指令方块获取执行值毋庸置疑,那么实体如何对接
使用相对执行

以下面为例:
我需要相对物品替换周围九格内白色羊毛为橙色羊毛,获取白色羊毛的数量。
显然可以利用方块完成,相对fill获取fill的值。但是此处不必绕一次,直接利用实体的相对操作完成
使用以下指令:



按照顺序执行:
  1. /scoreboard players set 1 a 0
复制代码

*记住凡是stats的计分板对象必须设定初始值,否则无法获取执行值(此处的对象是假名'1')
  1. /stats entity @e[type=Item] set AffectedBlocks 1 a
复制代码

*给物品添加stats标签(影响方块),返回值对象为计分板a中的'1'假名
  1. /execute @e[type=Item] ~ ~ ~ fill ~1 ~ ~1 ~-1 ~ ~-1 minecraft:wool 1 replace minecraft:wool 0
复制代码

*相对实体操作方块

效果:



在周围九格放置两个白色羊毛


激活后,羊毛被替换,获取了2的执行值


如果放上4个激活,同样替换后返回4。


本节展示stats除了对接指令方块直接获取参数,也可以找实体作为中介,来相对实体执行,其结果一样。


        6.1.3 计分板调用/实体储存
由于execute和scoreboard进一步调用计分板的指令使用实体选择器,所以选择假名兼容性有些差(当然可以通过scoreboard players test再次连接stats达到检测,但是太慢了)

此外,实体还有要求:
1.必须能够设定初始值的;
2.必须在指令执行时存在的;
3.多种执行不冲突
否则执行值赋值失败。

我们将上一节的例子中计分板对象转为实体,并在有执行值时输出say 1:



按照顺序执行:
  1. /scoreboard players set @e[name=f] a 0
复制代码

*给实体f设定初始值
  1. /stats entity @e[name=f] set AffectedBlocks @e[name=f] a
复制代码

*给实体f添加stats标签,获取影响方块的次数
  1. /execute @e[name=f] ~ ~ ~ fill ~1 ~ ~1 ~-1 ~ ~-1 minecraft:wool 1 replace minecraft:wool 0
复制代码

*相对实体f操作方块
  1. /execute @e[name=f,score_a_min=1] ~ ~ ~ say 1
复制代码

*判断输出

(相对上一节多了一条条件语句,作为计分板调用的演示)
效果:



替换白色羊毛为橙色羊毛,且执行返回的值是周围9格白色羊毛的次数,由于符合条件(也就是有执行值),输出1。


反之,虽然设定了初始值,但是影响的方块为0,不符合条件(无执行值),无输出。

在stats中,通常使用实体储存来作为计分板调用的工具,希望能尽快掌握。

附加部分

练习:
  • 用stats判断一条指令:/testfor @e[type=EnderDragon]是否输出,返回值储存在名为ed积分版内;
  • 制作一个计分板显示游戏时间的小模块,可参考资料。

[groupid=546]Command Block Logic[/groupid]