第189章 ,/.

现在,我们的『注册/登录系统』Beta2.0测试版出来了!让我们测试一下:

n个『已将XXX的[is_typed]分数设为0』

*按下按钮*

已为XXX添加了标签'registering'

请运行指令“/trigger password set <密码>“输入账户密码来注册

n个『已将XXX的[is_typed]分数设为0』

*输入密码*

已触发[password](数值已设置为)

已为XXX启用了触发器[password]

已移除XXX的标签'registering'

n个『已将XXX的[is_typed]分数设为0』

......

出BUG了,还是个很严重的BUG。

不要慌张,让我们来排查一下到底是什么问题。

仔细阅读上面的日志,你会发现:

由于红石逻辑组的特性,在过长的逻辑组中,执行顺序会难以把控,然后就出现了上面的问题。

那该怎么办?

改用『纯指令逻辑组』。

『纯指令逻辑组』,其实是目前最常见的逻辑组。它有一个更加专业的说法:模块。在本书中,它也被称之为『命令块链』。

我们其实已经见过很多次『纯指令逻辑组』了,它其实就是由一个脉冲或循环型命令方块+一大串连锁型命令方块组成的。比如下面的这串命令方块:

A→B→C→D→(插图:99-4)

(为了方便,下面我都会称这东西为『模块』)

本小章还未完,请点击下一页继续阅读后面精彩内容!

在这边,箭头代表着命令方块的朝向,A为循环型,BCD均为连锁。这些命令方块的朝向使得它们环环相扣。

循环型命令方块A是整个模块的核心,它负责整个模块的更新。如果A还是『始终活动』,那么A还具有维持整个模块运行的功能。我们从A是循环型这一点也不难看出,这个逻辑组还是个重复型逻辑组。

连锁型命令方块BCD是整个模块的通路。相比红石逻辑组通过红石元件来控制执行顺序,模块通路的执行顺序更加直观也不容易出乱子——因为它是通过命令方块的朝向来决定执行顺序。这也就是为什么在上面的模块中,执行顺序是从左到右的原因。

模块的难点在于对通路的理解,更确切地说是对『连锁型命令方块』运作机制的理解。还记得我们在第二章提到的内容吗?让我们回顾一下:

『青得一批的那个是链(又叫做连锁),作用是你叫它动一下(接入红石信号),它不会动。它只会在收到执行信号时,将该执行信号立马传递给下一个它指向的链命令方块,然后再根据当前条件判断是否要执行。听起来似乎有点复杂?举个例子:

E→F→G→H→

其中,E是未被激活的脉冲命令块,FGH三个命令方块都是已被激活且无条件限制的链命令块。当E激活时,EFGH将会同时执行指令,因为E激活时向F发出了执行信号,F收到后也向G发出了信号,G也向H发出了信号,三个链命令方块也都没有条件限制。』

现在,让我们仔细研究一下上面的EFGH为何会这样子执行。为了搞清楚为何这样子,我们就得研究一个东西:

执行信号

可以肯定的是,游戏本身并没有『执行信号』这东西,但为了方便大家理解,我就根据命令方块的性质总结出来了『执行信号』这个东西。那么这东西有什么特别的呢?

脉冲型和循环型命令方块,在被激活的同时不仅仅会尝试运行指令,还会产生执行信号并尝试将其传递给它所朝向的连锁型命令方块。

连锁型命令方块不管是无条件还是条件限制、需要红石还是始终活动、有被激活还是没被激活,只要它收到了执行信号,那么它就一定会尝试将该信号传递给它所朝向的下一个连锁型命令方块,当然它在传递的同时也会根据当前条件决定是否要运行指令。

举个简单的例子:

甲→乙→丙→丁→(插图:99-5)

甲:脉冲型,需要红石,无条件,没有写指令

乙:连锁型,没有写指令

丙:连锁型,没有写指令

丁:连锁型,需要红石,无条件,写有/setblock ~~1 ~ diamond_block

当我们同时激活甲和丁时,尽管甲乙丙都会因为没有填写指令而执行失败,但丁却因为收到了由甲产生并经过乙丙传递的执行信号,加上本身已被激活且没有条件限制,就执行了指令,在上面放置了一个钻石块。

这就是执行信号。但连锁型命令方块并不一定会在接收到执行信号后立马就执行指令,它还会看一下情况:

①如果自身未被激活

→不会运行指令,仅仅会传递执行信号

②如果自身已被激活

→1.如果没有条件限制

→→尝试运行指令,然后再传递执行信号

→→否则不会运行指令,仅仅会传递执行信号

→2.如果有条件限制

→→如果正后方的命令方块上一次执行指令成功

→→→尝试运行指令,然后再传递执行信号

→→→否则不会运行指令,仅仅会传递执行信号

举个例子:

戊→己→庚→(插图:99-6)

戊:脉冲、不受制约、需要红石,填有『setblock ~~1 ~ minecraft:diamond_block』

己:连锁、条件制约、始终活动,填有『say yes』

庚:连锁、不受制约、始终活动,填有『say no』

当我们第一次激活『戊』命令方块时,戊就会在上方放一个钻石块,己由于戊执行成功,就会发送『yes』的消息,庚由于不受制约所以肯定会发出『no』的消息,最终三个命令方块都运行了指令。

当我们第二次激活『戊』命令方块时,由于戊上方已经有钻石块了,所以指令执行失败。己由于戊执行失败,自己也不会执行。最终只有戊和庚执行并且只有庚执行成功。

如果你能看懂并理解上面的内容,那么恭喜你,你已经基本上掌握了连锁型命令方块的运作机制,模块本身最难以理解的点已被攻破。现在让我们回到注册/登录系统上,尝试以模块的形式替代原有的红石逻辑组:

◎墙A→B→C→(插图:99-7)

D→E→F→G→H→I→J→

A[脉][无][红]——execute positioned ~~~-3 run tag @a[distance=..3,tag=!registered,tag=!logged_in] add registering

这章没有结束,请点击下一页继续阅读!

B[链][无][始]——同替代前

C[链][无][始]——同替代前

D[重][无][红]