BE区块系列机制解析(八)——区块数据替换区块升级部分
Naytia_帕芙洛
2026年02月07日 15:53
收录于文集
共12篇

这一部分要单独拿出来重点说的原因是区块从旧版本升到新版本的过程中可能触发漏洞


当区块数据加载完成后,游戏会进行区块升级。区块升级是将旧版本的区块升级到新版本的过程。如果区块的loadformat(版本)和当前游戏版本不一致,便会进行区块升级的流程。

在正式进入流程前,很重要的一点是游戏会创建一个blocksource专门管理区块升级过程中产生的方块交互。这个blocksource基于任务结构传入的chunkviewsource,也就是它的管理范围是3*3区块(而且需要是在生成map里的)

一、主世界(OverworldDimension::upgradeLevelChunk)

如果区块的loadformat小于24,便会进入对洞穴与山崖更新的处理。

当世界是超平坦时,游戏会直接创建空气子区块放到区块的子区块列表的负数部分。

然后游戏会遍历该区块最低y值的16*16方块,如果都是基岩就把负数的子区块都变成空气(?)如果不到256个基岩,就进入负数区块生成的流程

首先遍历负数子区块,序列化那里的方块实体。然后删除区块计划刻和随机计划刻列表里y坐标大于0的tick,再对剩下的所有tick进行重新建堆。然后游戏会把刚刚序列化的方块实体再加载出来,同时对他们做消除错误方块实体的处理。然后遍历区块最低的子区块,把所有基岩都换成深板岩。这个过程直接走的levelchunk::setblock且没有blocksource也就是不和其它方块交互

之后如果刚刚替换之前的最下层有基岩,就遍历最下面的16*16把所有方块替换成空气。这个过程走levelchunk::setblock且没有blocksource,但是在放置完了后还执行了一个blocksource::updateNeighborsAt,所以会给四周造成nc更新,不过局限于该方块管理器管理的范围内。

接下来游戏会进行方块的修复。游戏会遍历区块内的所有区块方块坐标(ChunkBlockPos)对每个位置进行如下的检测:

如果是床方块且没有方块实体(1.2版本之前)就新建方块实体并且placecallback(别的系列专栏有说)

然后如果版本在1.16.100,而且方块是木栅栏门,便会检测栅栏门有没有和其它墙方块相接,如果有就更新状态并放置方块,通过Blocksource::setblock

如果版本大于1.16.100(更新更多种类的墙)且方块是石墙或者边界方块便像上下遍历所有相接的墙方块更新连接状态。它会遍历四周,对每个方向的方块计算出一个理想中的连接状态与现在的状态对比,如果不同就更改,通过blocksource::setblock。

如果方块是藤曼,会做和墙类似的处理。

对于区块边界的方块,只有相邻的区块版本也大于1.16.100才进行刚刚那些1.16.100的修复。

对于洞穴与山崖更新后的传送门方块,游戏会修改它们的传送记录。

然后游戏会移除所有1.11以前的村庄Hsa(VillageDeprecated,newVillageDeprecated )

之后游戏会遍历所有实体,对猫、村民等实体进行升级

二、地狱

和主世界没区别

三、末地

会给这个区块创建群系,除此之外和主世界没区别