本帖最后由 贰逼 于 2017-4-22 00:27 编辑
研究并不全面,只是包含部分目前能想到的内容。
更新的具体内容
总之就是在命令链里面现在可以通过指令来对链里的cb进行操作。
简单来说就是:
对方块操作的优先级大于了下一gt的加载。
举个例子,之前icb→ccb(command:往链后面再放置一个ccb),
输出的结果就是ccb确实执行了,但是后面通过这条指令生成的ccb没有执行;
而现在,放置的这个新的ccb也能成功被cb链调用。
你可以这样理解,
就是链中执行的对方块的指令立即生效(不包括未加载的方块)。但是更重要的是,
现在我们可以随意的操作cb链的线路,控制方式,以及对cb链进行无限复制。
衍生出一些关于逻辑指令的cb链摆法:
多输出的并联结构:
打个比方,cb链就是一个管道,通过前面cb的检测来改变这个管道的通向,信号就顺着这个管道流向出口(输出)
具体实现的方法就是制作一个"闸门"
▲一个简单的例子(并非最优方案,只是为了演示):检测玩家分数,并对应相应输出。
a=1 → /say 1
a=2 → /say 2
a=3 → /say 3
图解已经很详细了,信号从右边进入,然后开始检测玩家分数,一一对应地去改变最中心的cb的指向,指向的就是对应的输出。
而这个最中心的方块,就是换向器,也就是前面说的"闸门"。
我将这个"闸门"里面设定了一条固定的指令,大家可以发现每次都可以输出,目的是为了说明这个"闸门"不管线路指向何方都会有输出,所以我们把它算进了主模块中。在实际运用中,如果不需要额外的主模块指令,你也可以选择将"闸门"的指令留空。
- //检测模块
- /execute @p[score_a=1,score_a_min=1] ~ ~ ~ /setblock 20 4 19 minecraft:chain_command_block facing=east replace {auto:1b,Command:"say 你拥有分数"}
- /execute @p[score_a=2,score_a_min=2] ~ ~ ~ /setblock 20 4 19 minecraft:chain_command_block facing=north replace {auto:1b,Command:"say 你拥有分数"}
- /execute @p[score_a=3,score_a_min=3] ~ ~ ~ /setblock 20 4 19 minecraft:chain_command_block facing=west replace {auto:1b,Command:"say 你拥有分数"}
- //闸门
- say 你拥有分数
- //输出模块
- /say 你的分数是1
- /say 你的分数是2
- /say 你的分数是3
复制代码 |
串联结构中的非:
这个非的意思就是如果前面的cb的检测条件满足了,非的指令不会执行。
- //检测条件
- /execute @p[score_a_min=0] ~ ~ ~ blockdata 11 4 21 {auto:0b}
- //被设为非的指令
- say 你分数小于零
- //重置非
- /blockdata 11 4 21 {auto:1b}
- //串联输出
- /say 你按下了按钮
复制代码
结合上面的指令和输出情况,简单分析一下过程:
当玩家分数≥0,就将设为非的指令调成"红石激活"模式,那么当信号流动至此处便不会激活。接着重置为"保持开启"模式;
当玩家分数<0,检测不成功,因此不会进行任何操作,那么当信号流动至此处便会激活;
不管玩家分数如何,串联的命令都会输出。
|
用icb链充当rcb链(使一个icb的链也能被保持高频状态)
这是一个rcb的链,在0.4s(1个红石中继器满延迟)内执行8次
这是一个icb的链,在0.4s内执行7次
是什么让一个icb的单次执行的链也能高频执行?
在icb链的末端接上两个指令:
- /blockdata X Y Z {auto:0b}
- /blockdata X Y Z {auto:1b}
复制代码 其中XYZ表示该icb链起始的icb坐标
当链中信号到达这两个命令方块,相当于链被自身刷新,于是能再次执行,以此类推,保持高频状态。
而要阻断这个链的高频刷新,只能破坏这个链(在这里的处理方式是重新setblock一个起始的icb)
至于为什么只输出7次,其实这个高频的速度和rcb一样,都是1gt一次,但是因为最后一次被强行破坏了起始的icb,所以没有输出。 |
对一个链无限复制(获取玩家的最大渲染距离、服务器的最大加载距离)
除了setblock外,其实fill和clone这类指令都优先于下一gt执行了。
在上述的模块中,当你按下按钮,icb会在末端复制一次ccb链,但由于信号又会到达ccb链末端,ccb末端的指令又是在末端复制一次ccb链,从而使这3个ccb链被无限复制下去(其实被你的渲染距离局限,因为clone只会在加载区块中进行)。而这一切都在1gt内完成。
将say 1、say 2分别改成了:
- /scoreboard players add @p a 1
- /summon minecraft:area_effect_cloud ~ ~ ~ {Duration:1000000,Tags:[a]}
复制代码 于是在1gt内,ccb链每被复制一次,a计分板分数就+1,每个ccb链都有一个 位置标记用的tag=a的实体marker。
再按下按钮之后,得到的值是复制次数。
进一步操作这个值,我们加上了一个处理模块:
- //清除ccb链
- /execute @e[tag=a] ~ ~ ~ fill ~ ~ ~1 ~ ~ ~-1 air 0 replace chain_command_block
- //计算渲染距离
- /scoreboard players set 6 a 6
- /scoreboard players operation @p a *= 6 a
- //输出与重置
- /tellraw @p ["",{"text":"你的最大加载距离是"},{"score":{"name":"@p","objective":"a"}}]
- /scoreboard players reset * a
复制代码 复制次数*3(ccb链包含3个ccb)*2(渲染是双向的)=渲染距离
只是粗略的估算(因为ccb链是否被完整复制我们不知道,只是笼统的乘以3),但与真实值只有个位数的误差。 |
[groupid=546]Command Block Logic[/groupid]