源码解读我的世界红石更新时序。那下面则是用源码解读我的世界中的红石更新时序问题哦~那有不知道的玩家不妨进来看看哦~希望对大家有所帮助。
游戏园我的世界官方群:325049520 或 256070479 欢迎各路喜爱我的世界的小伙伴们加入讨论!
玩服务器的小伙伴们可以加入:141931866 群一起联机玩游戏哦!
如果你是腐竹的话可以给我们投稿你的服务器哦~投稿地址:点我进入
如果你有心仪的作品或者心得分享的话,欢迎来游戏园投稿,大家可以点击>>>投稿<<<进行投稿哦~ 有奖品哦~
所用mc版本为1.8.8,java版本1.8.0_45 64bit,纯净原版无插件。
一、游戏主循环中的红石部分
主循环是mc最重要的一部分代码了,在这一次次的循环中,mc对红石都进行了哪些操作呢?
这是1tick中,对红石电路部分有关的操作,顺序由上到下:
1.Next Tick Entry(以下简称NTE)
很多人想来都不陌生了,mc红石电路中的延时即由此实现。有些电路元件如中继器、比较器、红石火把等,受到更新时会把自己加入这个列表,实现在x tick之后的再次更新。有方块加入时,这个列表会进行排序,规则是延迟先结束的在前,然后优先级低的在前,都相同就按入列的先后排序。这样可以保证在同一tick内,优先级高的元件先被更新。关于各种元件的优先级,后面再讨论。
2.Piston Update(简称PU)
主循环中,被更新到的活塞,包括粘性和非粘性,不会加入NTE,只是将自己加入这个列表中,在NTE结束后统一进行更新。这个列表没有排序,所以更新顺序就是入列的顺序。
3.Tile Entity Update
活塞推动时,所有移动的方块和活塞臂,会成为一个个TileEntity进行移动,移动完成后恢复为方块。在此过程中,方块原有位置被设置为36号方块。移动的更新即在此处进行。
4.Network
无论是单人还是服务器,玩家的操作都要由客户端上传到服务端,如玩家拉下拉杆,此操作形成的更新即在此处进行。
二、先定义几个术语
主要让后面的说明变得更简单一点,同时也更严谨233
1.被方块更新
红石元件被其他方块更新时,如中继器被充能,活塞被充能等。
2.NTE更新
即中继器、火把等元件通过NTE进行的延时更新。
3.更新方块
更新单个方块,不涉及其他方块。
4.更新周围方块
更新一个方块周围的6个方块,顺序为西东下上北南。
三、当红石元件受到更新时,都进行了哪些操作?
1.Redstone Wire
红石线是电路中最基础的部分了。当受到更新时,游戏会重新计算红石线能量大小,若与原来能量相等,则不去更新其他方块。若不相等,红石线会遍历自身和周围6个方块,总共7个方块,即图中间紫色玻璃和橙色玻璃。
被遍历到的方块会更新周围的6个方块,如图右侧的橙色玻璃和白色玻璃。一个红石所更新的所有方块如下图所示。
注意这个遍历的顺序是根据java中的Set类确定,遍历顺序无法预测。对于同一个坐标,遍历顺序始终相同。遍历顺序随红石线坐标的改变而改变。遍历顺序与mc版本无关,与java版本有关。如图,左右两个结构完全相同,但是活塞伸出的顺序却不同,证明红石更新方块顺序不是固定的。
2.Redstone Repeater
中继器也是十分常用的电路元件。当被其他方块更新时,中继器会检查自身状态是否需要改变。若需要,中继器会检查NTE中是否已经有此方块,如果没有,则在NTE中加入这个方块。这个过程不涉及其他方块的更新。
当受到NTE更新时,若自己未亮起,或者已亮起但未被充能,就会立即改变自身状态,并依次更新自身方块和前方方块的周围方块。若自身状态由未亮起变为亮起,且自身未被充能,就会再次将自身加入NTE列表中。
3.Redstone Comparator
比较器类似于中继器,只是当受到NTE更新时,若自己未亮起且未被充能,就不会再亮起,也不会再更新周围方块。
此外,当Tile Entity Update,有容器内的物品改变时,若比较器挨着容器或者与容器间隔一个实体方块(与中继器朝向无关),也会受到更新而加入NTE列表,如图。
4.Redstone Torch
当被其他方块更新时,检测自身状态是否需要改变,若需要,则检查NTE中是否已经有此方块,如果没有,则在NTE中加入这个方块。此过程不涉及其他方块的更新。
受到NTE更新时,若自身为点亮状态,则立即熄灭,并更新周围6个方块的周围方块,更新范围与红石线相同。若为熄灭状态且未被充能,则立即点亮,同样更新方块。
5.Piston / Sticky Piston
当被其他方块更新时,检测自身状态是否需要改变,若需要,检查PU列表中是否有此方块,若没有,则加入此方块。此过程不涉及其他方块的更新。
受到PU更新时,检测自身状态是否需要改变,若需要,则立即进行推出/收回动作,注意此处若更新到其他活塞,同样会被加入到PU列表中,并在同一tick中进行推出/收回动作。这就是活塞0t的原理了,如果活塞在1gt内被更新两次,且两次充能状态不相同,就会有一次0t的推出/收回。若一个活塞动作过程中没有再次更新,则在3gt后从36号方块恢复。
6.Lever
拉杆不会被其他电路更新。当拉杆被拉下/拉起时,会立即更新自身状态,并依次更新自身方块和自身所附着方块的周围方块。
7.Button Wood / Stone
按钮基本与拉杆相同,但是被按下时会将自己加入NTE,以在一定时间后弹起。