1/3
2/3
3/3
Minecraft生存自动感应门方案详解
Joker_小狼
2019年02月25日 00:16
收录于文集
共1篇

  嘿,小伙伴们大家好!这是小狼。之前展示过一个自动感应门,本来打算做视频来讲解,但是事实证明我低估了这个视频的工作量,所以就一直处于咕咕咕的状态,考虑一下决定还是以文章的形式放出来。

  首先演示功能请看这里的av14620321,我们走过去之后,门就会自动开,这个装置是可以在生存模式中搭建的。

///////长懒不看版///////

  这个装置的主要思路是这样的,用潜影贝探测玩家的存在,潜影贝触发机关,信号经过处理后,通向活塞门,如何隐藏潜影贝呢?这里我们用的是幽灵方块做的地板,幽灵方块的触发装置用的是区块加载检测器,区块加载检测器基于的是碰撞箱检测器。

装置整体架构

/////////正文////////

一、其它可能的方案

  这样一种感应的效果呢。一般来说,容易想到其他的做法。比如说最容易想到的是用命令方块语句,但是,它不能在生存中使用,然后是被大家普遍喜爱的是红石矿,地毯来盖住红石矿,红石矿被人踩的时候会发光,同时产生一个方块更新,这个更新的可以被方块更新检测器或者是观察者来感应到,那么这个特性可以被利用,但是这个装置必须使用地毯,而有经验的老手一看到地毯就能猜到下面肯定藏东西了,所以并不是无痕的。

基于红石矿的感应方案

  另外一种考虑的是使用冰霜行者,玩家穿着冰霜行者附魔的鞋子,走进门就可以自动开,这个原理呢是使用冰霜行者冻结附近的水,而这个变化呢可以被一些方式检测到,比如说用水浮起生物,生物触发绊线或者压力板。这个缺点显而易见,就是一般来说,我不会很喜欢一直穿着冰霜行者附魔的鞋子,这样的当我想下水的时候会很不方便。

冰霜行者方案:无人

冰霜行者方案:有人经过

  还有一种以前曾经被使用得很广泛的方法是使用雪人,在以前的版本当中,玩家出现在雪人附近的时候,雪人会有概率跳原地跳。那么我们可以放很多很多雪人,总有那么几只在跳,我们检测他跳起来的这个事件,来触发我们的机关,但是在1.9之后,生物的AI被更新了,雪人原地跳这个事件也就不存在了,这个方法也就失效了。还有一种比较冷门的方法是使用经验球(av20848388),玩家会吸引附近的经验球而经验球会触发压力板,所以我们可以探测经验球的动态。

  但是经验球一段时间之后会自我消失,所以我们需要用发射器发射附魔之瓶,但是附魔瓶又需要手动补充。所以综合来说,性能最好的是使用现在这种——潜影贝家幽灵方块加区块加载检测器的组合方式。

二、感应部分

1.潜影贝的运送

  我们首先说一下感应部分,感应的核心思想是利用潜影贝看到玩家之后能够改变自己的状态。有的同学可能会说:那这个潜影贝不也是必须要在创造模式下还能得到吗?那这个并不是这样的,我们首先要知道,潜影贝是可以上船的,我们在潜影贝旁边放一个船,把它推向潜影贝,潜影贝就能自己上船,然后我们可以坐在船上,拉着潜影贝到处跑,为了防止操作的时候被潜影贝攻击,我建议大家全程喝隐身药水。接下来我们就可以,开船拉着潜影贝回到主岛了,注意如果要开着船上台阶的话,还得利用一下活塞才行。如果有附近折跃门的话可以利用一下,如果没有的话我这里强烈推荐大家使用,李芒果大大所设计的末地铺路机(av7531115)。

这个机器,如果不停下来,道路就会不断延伸。所以说,不……(此处应有某表情包)

  路打好之后,基本上可以以每15分钟一个的速度运输潜影贝,注意把船打掉的时候,潜影贝有时会出现在下面一格,小心潜影贝因为窒息而受到伤害,所以才把船打掉之后,注意把这一个方块给破坏掉。

  接下来就是说一下潜影贝应该如何转向:如果潜影贝在侧向位置有方块的时候呢,我们把它底部附着的这个方块打掉,他就会转而附着在这个侧向的方块上,那注意这个方法侧向必须是一个不透明的方块。我们如何对潜影贝进行微移呢?我们用活塞从侧面推潜影贝就可以了。我们必须用活塞把潜影贝推入末地传送门,这样才能传送到主世界。注意一下,船加上潜影贝可以一起进入折跃门,但是不能进入传送门,因为传送门只能传送单个实体。到了主世界之后,我们在附近找一找传送过去的潜影贝,一般来说在附近。找到之后,我们继续用船把它装起来,运送到我们需要的地方。

2.安全地使用潜影贝

  之所以能利用潜影贝探知玩家的存在,是因为潜影贝有两种模式,你平时空闲的模式,另一种是遇看见了玩家准备并发起攻击的模式,在空闲的模式中呢,潜影贝的高度是在1格和1又3/8格子之间来回变化,而在攻击的模式中的潜影贝的高度是在1格和2格之间变化。这就是我们能够利用潜影贝来检测玩家的基础特性。

潜影贝的状态转换

  有的小伙伴可能会说:那可不可以直接用绊线去检测潜影贝的子弹呢?这个是不行的,因为潜影贝的子弹并不能触发绊线。

  那我们接下来就有两个问题:1、怎么处理潜影贝发射的子弹让它不打到玩家?2、怎么把潜影贝的体态变化反应到红石信号上?

  我们先说第一个问题。第一种思路呢,是使用活塞把子弹推掉(av12571734)。

  这个思路相对来说比较容易想到,但是实际执行起来的话,会遇到一系列的问题。比如说如何判断子弹是否达到了想要的区域。比如有的时候,当活塞把通道关闭的时候子弹会在后面停住等着,当活塞打开的时候,子弹就会飞出去,错失时机。

  所以我们倾向于使用另一种更加好用的方法,就是使用盔甲架来挡住潜影贝的子弹。盔甲架这个实体有几个优点:

  第一,它本身是一个实体,而不是方块,也就意味着它不会挡住潜影贝的视线,他也不会影响到潜影贝子弹的飞行路径规划,潜影贝的子弹不会去刻意的绕过他。

  第二,他跟矿车不一样,不存在那种恢复速度有限的隐藏血条,所以说不会被连续的子弹给打掉。

  第三,他不受药水效果的影响,也就是说不会中漂浮效果。所以说我们甚至可以用盔甲架把潜影贝给完全围起来,这样不会影响到潜影贝和他子弹的行为,又可以完全挡住子弹。当然,我们需要根据实际情况去设置放置盔甲架的位置。

被盔甲架封印了攻击的潜影贝

3.潜影贝的朝向

  那么第二个问题,怎么把潜影贝的体态变化反映到红石信号上呢?关于这个问题我们必须分类讨论一下,因为潜影贝必须附着在一个不透明方块上,而潜影贝的视线是透过不了这个方块的,所以说无论如何,潜影贝的视线不可能是四面八方都能看到的,我们会根据需要去选择这个潜影贝附着的方式,是附着在上面、下面、还是侧面?我们需要根据潜影贝的视线覆盖范围来进行分类讨论。

a.检测侧面

  首先我们来说一下最简单的情况,如果潜影贝需要检测侧面出现的玩家的话,应该怎么弄呢?我们采取的是这样的方案,让潜影贝变得像这样附着在一个方块的下面,在潜影贝的在下面一格放一个拌线,拌线连着拌线钩,这样的话呢,就可以来检测了。由于拌线只检测这一格空间内的下半部分是否有实体,所以说潜影贝的闲置时期稍微伸长出来的一点距离,是不会触发拌线的,只有等潜影贝完全伸展开的时候,拌线才会被触发。这种方式下,我们就可以在侧面放盔甲架。

感知侧面的潜影贝装置

b.检测下方

  那么第二种情况就是,我们希望潜隐贝能够检测正下方的玩家,这种情况我们应该怎么弄呢?我们套用刚才的套路,还是用拌线来检测,但是这样我们又发现了一个问题:我们不容易在下面放盔甲架,因为盔甲架必须要放在一个方块上,而方块本身会遮挡潜影贝的视线。但是我们仍然可以用骚操作达成这一目的,就是弄成这种形式,盔甲架稍微偏一点,边沿搭在一个方块上,盔甲架的下半部分又跟潜影贝的本体重合,这样潜影贝的子弹一出现就会被吸收掉。

可以感知正下方的潜影贝装置

  我们怎么弄出这样一个装置呢?核心操作是:用打开侧放的潜影盒,潜影盒的盖子推动盔甲架,可以把盔甲架推到这个巧妙地位置上。注意先推盔甲架到位,然后再用活塞推潜匿贝到位。

  很容易注意到,这个装置其实也是可以检侧面的玩家的,体积上也比刚才那个装置要小得多,所以用它来做侧面检测也是可以的。缺点就是搭起来比较麻烦。

  注意这种方式在未来可能失效,因为在1.13之后,潜影贝子弹的碰撞箱被改小了,盔甲架没有办法同时做到:既能搭在旁边方块边缘上,同时又能够挡住潜影贝产生子弹的点位。但是只影响这一个设计,其他的挡法都是正常可以用的。

c.检测上方

  第三种情况就是,我们希望能够检测到潜影贝正上方的玩家。这个时候我们就不能让潜影贝附着在方块的下表面了。但是如果简单的让潜影贝附着在侧面或者上面再用绊线检测的话,我们发现这是不成立的,因为潜影贝在空闲的时候也会时常伸出3/8格,这就足以触发旁边的绊线了。

直接在上方放绊线会导致常态下误触发

  解决思路就是在竖着的潜影贝上面放矿车,然后用绊线去检测矿车。我们知道矿车的高度是小于5/8格的,所以说我们把矿车放到潜影贝的上面,然后在更上面一格放拌线,就可以通过看潜影贝和矿车——这个整体的高度有没有达到两格,来判断潜影贝有没有发现玩家进入攻击模式。在空闲模式的时候,矿车是碰不到拌线的,但是当攻击模式的时候,矿车就能够周期性的碰到拌线。

矿车+潜影贝(常态)

矿车+潜影贝(发现玩家)

  解决了探测问题,接下来我们考虑一下挡子弹的问题。现在这个装置是不能直接用的,因为子弹开始向任何方向发射都是可能的。子弹向上飞的话会碰到矿车,矿车的血量被潜影贝连续两下就会打掉。所以潜影贝的正上方必须是盔甲架。那矿车放在哪呢?矿车可以只有一半搭在潜影贝上,在其另一半所在方格空间上面放绊线。同样,潜影贝的其它方向也要用盔甲架挡住。

潜影贝正上方为盔甲架,矿车的一角搭在潜影贝上

 

三、感应部分输出信号处理

  接下来说一下输出信号的后续处理问题,大家很容易注意到,即使是攻击模式的潜影贝,也不是一直持续触发绊线的,而是周期性地对绊线进行触发。但是我们希望的是玩家在的时候输出信号能够一直亮起。所以我们需要对脉冲进行延长,把攻击模式时产生的各个脉冲连起来连成片。所以我们使用一种基于比较器的脉冲延长设计,像这样通过这个比较器循环,让信号撤去的时候缓慢地衰减,然后再用中继器把它输出的信号强度恢复。就可以做到在潜影贝的攻击模式下输出的信号能够连续不断开了。

脉冲延长器

  到这里为止,探测部分的信号源就算完成了,如果这个信号源是接的铁门或者不包含递归的简单活塞门。这种信号源是完全没有问题的。但是对于一个复杂的活塞系统来说就不一定了——比如说像个方块替换装置。这样的设计大多需要信号源在它开或者关的过程中保持不变。如果然后在没有完全打开的时候把信号撤掉。这个装置就会永久性的崩掉。

方块替换装置,快速拉拉杆会坏掉

  我们这里讲一下什么叫做正脉冲和负脉冲。如果原本红石是不亮的,然后亮了一会儿再灭。这叫做正脉冲。反过来,如果原本是亮的,灭了一段时间,我们称之为这叫负脉冲。所以我们不但要避免短时间的正脉冲,也同时要避免这样短时间的负脉冲。这个需求并不能简单的用中继器脉冲延长实现,因为如果你延长了正脉冲的话就可能出现新的短负脉冲。反过来也是一样。所以我们必须用一个新的思路去实现信号的处理。

不能用简单的延长信号思路去解决短脉冲问题

我这里只用了一个这样的设计来对信号进一步处理,我这里画了一幅状态转化图来对这个设计的功能进行说明。

信号稳定模块的状态机

  圆圈表示状态,圆圈里的字表示输出的信号,箭头表示状态转化的条件。可以看到,每次输出信号转化之后,会维持一段时间,这段时间内完全无视输入信号,即使这段时间输入信号疯狂闪烁,对装置来说也和一直保持不变一样。等计时结束,装置才会去看输入信号是什么,如果输入信号和此时的输出不一样,就进行转化并开始新的计时,如果此时输入和输出一致,就等待输入信号变化再转化。这样一来,我们只要调整计时的时间比活塞门的运动时间长,就能完美处理信号了。

  我们看一下这个装置的构造,首先这是一个很经典的时钟,我们可以通过调节漏斗里的物品来控制时钟的周期。一个漏斗向另一个被红石快锁住的漏斗里传送东西,当这个漏斗里的东西传送完的时候,比较其熄灭,粘性活塞收回,把红石块拉到过来,开始另一个循环。这就是一个最普通的时钟。如果我们把粘性活塞换成普通活塞的话,普通活塞收回的时候不会把红石快拉过来,而另一个活塞推红石块的动作却缺乏更新来启动。只有等到更新之后才能走另外半个周期,所以说,这样的时钟就是属于每半个周期需要一次更新才能继续运行的。

经典的长周期时钟设计

  然后我们把比较器下面的方块换成观察者,观察者像这样朝向上,因为观察者能够更新两格远的方块,所以说当观察者被激活的时候,活塞也会被更新。然后我们就在下面铺一条充能铁轨,这样当时钟完成了半个周期之后,只要激活一下充能铁轨,这个时钟就能开始另外半个周期。

每半周期需要更新的时钟

  我们在这两个方块上,插两个红石火把,这样每当半个周期完成之后,火把都会点亮一下激活铁轨。半个周期之后,这边的红石火把亮一下,再过半个周期之后,另外一侧的红石火把亮一下,这样又是正常的时钟了。

更新通路外露 的时钟(实体)

更新通路外露的时钟(图例)

  然后我们新搭一层,注意有些地方要用不能被充能的方块,比如说像半砖萤石之类的才可以,否则的话会激活旁边的铁轨。这个是干什么用的呢?我们来解释一下,新加盖的这一层会给原本的电路产生什么影响。

外部可阻遏更新的时钟(实体)

外部可阻遏更新的时钟(图例)

  当输入信号为高的时候,红石线A强制亮起,弱充能方块B,也就是说,输入信号为高的时候,会强制让左边的红石火把C熄灭;当输入信号为低的时候,我们看这里有个红石火把D,也就是说红石线E会亮起,弱充能后面的铁块F,也就是说输入信号为低的时候,会强制让右边的火把G熄灭。

  我们刚刚说两个半周期之间的转化,是要通过红石火把闪烁一下的,也就是说,我们通过这种方式,强行锁定一个本应该闪烁的红石火把熄灭,就能够让时钟卡在这里。一直等到信号变化了为止。

  这样就完成了我们所需要的功能。只需要把红石块的位置作为输出信号导出来就行了。

  现在这个设计是,两格厚,高度为5宽度为8的(输入中继器不算装置的一部分)。我们也可以把它变成三格厚的高度4宽度6的形式。虽然厚度变厚了使得它不那么容易藏在墙里,但是在上下左右空间不够用的时候是有用的:

外部可阻遏更新的时钟(另一种设计)

  可以看出,二者实际上是等效的。这个设计我们以加厚一格的代价,减了一格高度和两格宽度。总的体积也减了一点。

  这样一个设计不光是在我这个视频中作为一个小部件使用,在实际的应用中作为一个通用的模块也很适合加在各种活塞门输入信号上。

四、幽灵方块

1.什么是幽灵方块

  接下来的一个问题就是我们如何隐藏潜影贝,毕竟基于美观考虑,我们不希望玩家看到潜影贝。在讲这个问题之前,我觉得有必要讲一下幽灵方块和CBUD有关的知识。

  那首先我们来讲幽灵方块。

  这是一个目前在1.13之前比较通用的幽灵方块产生器。

幽灵方块产生器(实体)

幽灵方块产生器(图例)

  他每次收到信号的时候,都会产生幽灵方块。幽灵方块实际上并不是真实存在的方块,虽然玩家可以在上面走,对于玩家来说,他是有碰撞箱的。但是如果说是对于实体来说,这个方块是不存在的。也就是说,生物的视线可以透过幽灵方块。我们用幽灵方块来隐藏生物是完全可行的。注意一下,很多人在这个地方容易混淆,实际上幽灵方块和36号方块是两种东西,36号方块指的是被活塞推动中的方块,是专指运动中的方块,和幽灵方块完全不是一个概念。

  那幽灵方块实质上是养什么样的东西呢?我们在玩多人游戏的时候,经常会由于网络延迟产生一些本地和服务器上不一样的情况,比如说我们搭了一个方块,但是由于网络延时,我们发现这个方块又没有了。那这其实本质上就是由于网络延时所产生的临时的幽灵方块。

  玩多人游戏的时候,我们玩家的而这部分minecraft程序被称为客户端,而在服务器上的那部分被称之为服务端。一般来说,客户端主要计算一些,跟玩家的行为直接相关的事情,以及各种东西的图像显示。而服务端主要计算各种方块的功能,以及各种实体的运动等等。这二者之间需要进行信息通讯,保证他们是一致的。在玩多人游戏的时候,这种信息通讯需要经过网络,偶尔会受到网络延迟的影响。各种mc的外挂,大多也是通过伪造客户端发送的数据,对服务端进行欺骗。

  但是玩单人游戏的时候,客户端和服务端仍然是分开的,只是他们在同一台机器上而已,但是它们依然是分开计算的,之间的信息通讯依然存在。只是说这个信息通讯不用经过网络了,但是信息通讯这个行为依然是有的。

  那幽灵方块的本质是什么的?幽灵方块的本质就是客户端和服务端,他们的数据变得不一样了。比如说,服务端认为某个地方应该是一块空气,但是客户端认为某个地方是一块石头,那么表现出来,这里就是一块石头的幽灵方块。由于各种实体全部都是在服务端上进行运算的,所以说,这种情况下,各种生物、实体都会无视幽灵石头把它当作空气。而玩家的行为,和mc的图像显示都是在客户端进行的,所以说在显示图像上,这里是一块石头,玩家移动的时候也是把它当作石头来处理的,比如说我们能够站在上面。

  但是幽灵方块是不稳定的,一旦客户端和服务端交换的数据,客户端就会立刻反应过来自己的数据是错误的,就会纠正过来。比方说,我们用右键点击这块幽灵石头,因为客户端是不管方块的功能的,所以说他会发一个请求去询问服务端:“这个方块有没有什么可以被右键触发功能呀?”服务端回话说:“这是空气里明明是个空气啊。”客户端就会意识到自己的错误而改过来。

  这种信息的交互会在以下几个情况下会产生:这个方块的位置被重新加载了,常见的,比如说玩家重新进入游戏,或者说离开到很远的地方再走回来;还有玩家对方块进行鼠标点击的交互,这包括左键和右键;以及服务端推算出了一些方块的变化告诉客户端,比方说水硫动,原来是空气的地方变成了水,服务端就会把这个变化告诉客户端,或者说活塞伸出,原来不是活塞臂的位置变成了活塞臂。但是注意一个很有趣的现象,就是被活塞推动的方块移动,这个现象会在客户端和服务端分别计算,并不会进行数据交互。比如说我们产生并推动了一串幽灵方块,在服务端,这些方块并不存在,然后这些方块推动了粘液块,粘液块带动了其他方块,这些事情在服务端都是没有发生的。比如被幽灵粘液块带走的方块,实际上方块并没有被粘走,但是在客户端看不到这个方块了,如果我们的生存模式走过去,我们会发现依然会受到窒息伤害,因为玩家受到伤害是在服务端计算的,虽然服务端并完全搞不懂你是怎么走进去的,但是它看到你的头埋在不透明方块里面,就认为会受到窒息伤害。

  那么很显然,我们可以得出结论,幽灵方块之所以产生,就是因为客户端和服务端对于世界的理解出现了分歧。我们只要能制造出这种分歧,就有机会产生幽灵方块。在开发者的设计目的中,客户端和服务端对世界的理解本来不应该出现分歧,所以说幽灵方块产生器本质上是一种bug。

2.幽灵方块产生器原理

幽灵方块产生器

  那我们来分析一下现在这个幽灵方块产生器的工作原理吧,这个产生器是一个被使用频率非常高的设计。注意因为1.13开发者把粘性活塞的代码重新写了,所以这个产生器只能在1.13之前的版本中使用。关于适用于新版本的幽灵方块产生器,截至我现在做这个教程的时间为止,国内外的玩家还在努力的寻找中。

  在讲解这个机器的原理之前呢,我们首先说一下活塞运动的步骤,一个活塞,被信号激活之后第一步是检测前方应该被自己推的方块,看看他们中有没有不能够被推动的,比如说黑曜石这些方块是不能被推动的,如果检测认为可以推动,才开始执行推动的步骤。所以说这是前后两个过程,检测过程和运动过程。

  好,那我们继续讲这个结构的原理。要理解这个产生的原理,我们先从一个最简单的结构开始。

  当拉杆拉下的时候,左边这个粘性活塞会收回,右边的会伸出。如果仅仅精确的游戏刻的话,两路的延迟是一样的,但是由于中继器熄灭的优先级高于中继器亮起,所以微观上左侧会比右侧早更新一点点。两个活塞均在同一个计划刻被更新,等到活塞刻的时候作出响应。但是到了活塞刻的时候,右边的活塞检查自己即将推动的方块,发现活塞臂是自己推不动的,所以并不会运动。而之后虽然左边的活塞已经收回去了,但是右边的活塞已经进入了BUD态缺乏更新。

  注意一下:活塞的检测和活塞的运动,是两个不同的事件。在没有新加入这个更新的活塞之前,事件的发生顺序是:左边的检测,右边的检测,左边的运动,右边的运动。由于在右边检测的时候认为无法运动,所以右边的运动就不会发生。

  那好,我们在右边下面再加一个活塞,来对右边上方的粘性活塞进行更新,然而有趣的是这个更新其实也是在这个活塞刻完成的。

  那么这几个事件之间的顺序就很值得玩味了,按照服务端的理解,由于先更新先激活原则,左边的这个活塞是被中继器熄灭所更新的,而右边这个底下的活塞是被中继器起更新的。之前我们说了,中继器熄灭优先级高于中继器亮起,所以,左边的活塞运动先发生,而右边下面的活塞运动后发生。然后右边下面活塞运动更新的右边上面的活塞,于是导致右边上面活塞开始检测是否能够推。所以说,综上所述,在服务端认为,右边上面活塞的第二次检测是晚于左边活塞开始缩回的。也就是说在服务端,右边的活塞最终会伸出。

  然而在客户端并不是这样,由于程序员的疏忽,客户端并不认为右边活塞的第二次检测要晚于左边的活塞,具体客户端是使用了什么样的一套物理规则目前还不清楚(大多数研究者也不关心这个事情,因为一般来说大家还是更关心服务端的物理规则)。但是不管怎样,我们可以确定的是,在客户端并不认为右边的活塞会伸出。

  如果我们慢放一下这个装着伸出的过程,就可以发现,我们并没有看到这个方块“被推向左边的动画过程”,这个方块是被“闪现”到左边的。这个闪现实际上是因为服务端告诉了客户端信息,更新这两个活塞活塞臂位置的信息。事情才变得同步了。

  这时候我们在这个装置的基础上加入第四个活塞,中间这个活塞推动一个粘液块。

完整版幽灵方块产生器

  容易分析出来这个粘液块推动的时机,正好处于客户端和服务端对世界的理解出现分歧的时候。在服务端,认为这个粘液块被推动的时候,上面的方块已经正在被向左推了,而客户端认为上面的那个方块并不在运动。

  所以说,在客户端这一侧的理解中,上面这个方块应该被粘向前方,而服务端并不认同这种说法。于是前方就产生了一个幽灵方块。

  我们之前说到,幽灵方块被清空的原因,如果我们不想让幽灵方块被清空的话,就要避免这些原因。玩家交互方面,只要玩家不手贱乱点,是没有关系的。服务端的方块变化,可以通过设计来避免。重新进游戏是没有办法避免的,玩家跑远之后再回来导致区块重载也是没有办法避免的。还有一个原因,是和区块有关的(我们可以用f3+g显示和隐藏区块边界来查看)。如果一个区块内同时发生了大量方块更新,比如说大量的活塞同时运动,那么这一整个区块的数据服务端都会重新发送一遍给客户端,也就意味着这一整个区块内的幽灵方块都会被清掉。所以我们必须尽量让幽灵方块和会同时发生大量方块更新的结构(比如复杂的活塞门)处在不同的区块内。

  产生幽灵方块之后,我们只要只用活塞对他们移动就好了,比方直接被活塞推动、被移动的粘液块带动都是可以的。这些变化,这些移动都只是在客户端。在服务端,这些东西都是还在原处的。注意活塞本身不能够是幽灵方块,因为活塞的功能是在服务端实现的,幽灵方块活塞没有任何推拉东西的能力。其他的红石原件也是一样。

五、区块加载检测器

  讲完了幽灵方块,我们接下来讲一下区块加载检测器。

  什么是区块加载检测器呢?区块加载检测就是一个装置,每当这个装置所在的区块被重新加载的时候,就会输出一个脉冲,我们把有这样功能的装置称之为区块加载检测器。

  目前来说比较好用的方案是CBUD区块加载检测器。

  这可以看我的视频,23:40处开始。

  如果我们只是把CBUD作为区块加载选择器来使用的话,那么这个路径不需要特别大,反而应该是越小越好,这样一方面能节省体积,另一方面能防止被一些不想要的更新触发。当区块被重新加载的时候,这个装置就会输出一个脉冲。比如重新进入游戏。我们发现这个条件正好跟幽灵方块清空条件吻合,所以二者配合起来可以实现一些有趣的事情。还有注意用命名牌给僵尸命一个名,防止僵尸被刷掉。

  在更老的版本中,区块还有一些其他的设计。比较著名的,包括了使用酿造台的设计和使用漏斗矿车的设计。

  使用酿造台版本原理是这样的:在1.8之前的版本中,正在酿造的酿造台被重新加载之后,会产生一次方块附加值更新。我们及时使用漏斗,把里面东西取出来,可以保证酿造一直不完成。当然这个特性作为bug在1.8版本被修复了。

  使用漏斗矿车的原理是这样的:一般来说,漏斗矿车可以从上方的容器中取出物品,如果漏斗矿车,经过亮起的激活铁轨之后就会被锁定,不会吸收物品。直到再经过熄灭的激活铁轨才会解锁。但是,有一个bug是:当区块被重新加载之后,被锁定的漏斗矿车会恢复吸收物品的能力。后来这个bug在1.9版本也被修复了。

  所以现在大家普遍使用基于CBUD的区块加载检测器。

六、潜影贝的隐藏

  那么现在回到我们最初的问题,如何去隐藏潜影贝,让潜影贝看见玩家但是玩家看不见潜影贝,这个我们也要结合实际情况考虑。

  我们先说最简单的一种情况,就是潜影贝和玩家只有一墙之隔。大家看,这里有一个潜影贝感应装置,可以通过这个墙上的洞来看的玩家,我们希望把这个洞给藏起来。

1.画

这种情况最简单的方法是使用一幅画来隐藏,用画来堵墙上的洞,因为画室没有把它附着在空气方块上,所以我们必须要用告示牌来替代空气方块,然后再把画挂上去。这种做法是最省事的,但是这并不是真正意义上无痕,因为稍微玩过解密地图的有经验的老玩家,都知道画后面一般来说都藏了东西。

2.周期信号驱动的幽灵方块产生器

  那么另一种方法呢,就是使用幽灵方块来隐藏,我们之前说到,幽灵方块在客户端和服务端是不一样的,玩家眼中这个方块存在,但是处于服务端的潜影贝眼中,这个方块是不存在的,我们在这里放着一个幽灵方块呈现,然后用一个活塞把产生的幽灵方块推上去,这里使用了一个小技巧,就是使用粘液块来驱动多列方块。

  那么一种想法就是建一个时钟。使用时钟信号不断的驱动这个装置。通过活塞本身的推动极限来阻止继续往上推。这样即使我把幽灵方块刷新掉了也没有关系,会很快地回来的。

  hjkv大大的版本就采用了这种设计

  但将会带来一个问题:这种情况下的话,活塞会一直在运动,这样的话会带来非常大的噪声。所以我们希望只有当幽灵方块消失的时候,这个装置运动一段时间把幽灵方块弄出来,然后就停止运动。所以我们就可以用区块加载检测器来驱动这个装置。

3. 区块加载检测器驱动的幽灵方块产生器

  这里右侧有个区块加载检测器,我们用它输出的上边沿触发计时器,作为一个长脉冲输出。这个计时器的定时通过漏斗里面的物品数量控制。然后输出信号取反用来卡死周期电路,如果输出信号为低的话,这个时钟是被锁死不运动的。所以说,当我们的玩家退出游戏,重新进入的时候,这个也会输出一段时间的信号,让这里产生幽灵方块。运行完毕之后就会停止发出噪音。不过注意,要让区块加载检测器和这个幽灵方块处于同一个区块之内。

4.各种朝向

  那么下一种复杂一些的情况,就是如果墙面的另一侧没有办法放置传感装置,比如说那一侧已经有一些其它东西占据了空间。我们该怎么办呢?

  我们可以考虑把潜影贝感应装置放到地下,像这样,在地面上开一个洞然后用幽灵方块把洞给藏起来。

藏在地板下

  一个思路是这样的,我们在刚刚的思路上,再加上横推幽灵方块的活塞,注意这种状态下,我们往往需要很多幽灵方块,所以使用粘液块的方案的话不一定推得动,因为活塞最多一次只能同时带动12个方块,多了的话就带不动。所以我们就得考虑同时使用多个幽灵方块发生器。每一列都单独对应一个发生器。

  但是问题是:这个活塞的位置和地平线平齐的,也就是说不加隐藏的话是会被玩家看到,我们可以像这样把它布置在墙的那边,或者说用东西,来把活塞给遮住。这都是可行的解决方案。但是如果使用地毯的话就不是无痕了(而且既然你要使用地毯,为什么不用红石矿感应呢)。如果你要使用方块的话,那就不是平地了。藏在墙那边是一个好主意,但是实际中你并不能保证旁边有一面墙来给你藏东西。所以这方案都很有用,但是通用性是受限制的。

  把检测器藏在天花板的上面和藏在地板下面,思路类似,也是一样的道理。

  那么接下来就是最终版本——最前面视频里展示的版本,完全的平地无痕隐藏。我们仍然是在上一个的思路上进行的改造,我们用了一个方块切换的机械结构,需要的时候会把这一排方块替换成活塞,等工作完之后再替换回去。

活塞替换结构

  当然,这个驱动也是由区块加载检测器来驱动的。

  我们看一下,这个CBUD在区块被加载的时候产生一个脉冲,那么这个脉冲,通过方块更新,来启动了这个计时器。时钟产生一个定长的脉冲,来控制幽灵方块产生装置的运行时间。方块的替换结构,由这个脉冲的上升沿和下降沿驱动。

  这样的话,现在整个这一套装置全部都在地平线以下,这就是我们的最终版本。

  通过幽灵方块来隐藏潜影贝感应装置,潜影贝感应装置的输出信号经过处理输给活塞门。就完成了我们整个这个东西。这个活塞门的设计就又是一个故事了,我这里就不单独讲了,因为这个活塞门毕竟不是我设计的,我这里把这个3×3内吸活塞门的视频链接贴一下,感谢大佬们精巧的机械设计。(av12011254)

  嗯,然后整个这个装置的搭建过程我就不贴了,而且我觉得这个电路有可能还可以再优化做小体积的。我把存档链接贴在视频这里:

https://pan.baidu.com/s/1C-7qX-a8f_kiFGRPS5teZA

  需要自取

七、后续思考

  这个装置它的意义在哪里?首先这个装置它本身的话虽然是有一定意义的,在生存里可搭建,但是呢,事实上来说,这个东西性价比并不高,因为它的体积实在是太大了,而且弄起来比较麻烦,一般就是大大后期才会做的一个东西。但是我现在之所以做这个视频,作为一个教程做了这么长,就是说它中间有一些小的模块以及思想,是可以被在其他地方复用的。

  比如说我们之前提到的一些受环境限制的一些实现方法,在实际中,如果环境合适的话,我们可以使用那些更简洁一点的方法。我们现在这个复杂的版本是一个通用的版本。

  那你有哪一些模块是可以复用的呢?比如说我们的这个活塞门输入信号的处理装置,因为活塞门本身它是一个使用频率比较高的东西,那么这个模块作为一个前置的信号处理装置,它的应用场景其实是比较多的。

  然后CBUD和幽灵方块产生器,这两个本来就是已经被很多人所知的通用配件,它们的应用应该不需要再累述。我这里要强调的一点就是,把这两个东西配合在一起,所产生的使用价值。因为区块加载检测器的这个触发条件和幽灵方块的刷新条件是一致的,所以我们用这二者配合,可以把幽灵方块组合一些我们想要的样子。

  那么常见的幽灵方块,有两种思路。一种是看上去它是有方块的,实际上在服务端它是一个空气。那么这种应用,比如说我们可以用它来隐藏生物,比如像下图这样造一个攻击塔,我们像这样,控制让活塞只推有限的次数,刚刚好把生物给藏起来。还比如隐藏水、隐藏潜影箱等等,这些会被推碎的方块。我们可以造出假象,让客户端认为他被摧毁了,但是服务端不这么认为。

攻击塔

  反过来看,另一种思路呢,如果看起来是空气,但是在服务端是有方块的。这样也是有一些应用方向的。比如说我们用它来做刷怪塔的墙壁,实质上有方块阻挡,怪物无法出来,也无法发现玩家。但是玩家可以隔着方块攻击。注意这样的方块不要用会导致窒息的。

  这样的应用我个人觉得应该还可以开发出来很多有趣的装置,也希望作为一个抛砖引玉的视频,希望能够给各位设计者们提供一个思路。