MCBE 区块系列机制解析应用篇——流传多年的区块刷物到底是什么原理

作者:Naytia_帕芙洛 · 2026年01月30日 10:02 cv45119486 · 区块机制

区块刷物流传了无数个版本,可以说这方面的机制一直没有改变过。令我意外的是这么多年这么多人用区块刷物品居然没有一人在意过它的原理,不然区块刷物品方法的优化也不应该由我来完成。

阅读本文前请先阅读区块保存理论篇


一、区块刷物

首先要科普一些关于方块实体的基本知识:

关于方块实体的基础知识可以参考我以前发的内容,以及@樱银音_的专栏。

方块实体每gt会进行tick,也就是周期性执行一些更新,这是方块实体的核心作用之一。方块实体们之间虽然会执行不同的逻辑,但也会共同执行一部分内容。

当方块实体内部的数据被改变时,游戏需要一个得知它被改变的渠道,为区块保存的检测做准备。由于方块实体的种类太多了,能改变数据的地方太多了,mojang选择不让方块实体改变数据时直接改变方块实体的dirtytickscounter,而是给它加一个标记:isChanged。

当方块实体tick时,游戏会检测它是否被标记了isChanged,如果是就执行一个onChanged的逻辑,这个逻辑对于每种方块实体都是不一样的。但同时它们都还会去执行LevelChunk::onBlockEntityChanged。这个逻辑的用处在于通知区块有方块实体更新了,它会更新区块方块实体的dirtytickscounter,这样它就会被保存了。

结合上个文章的内容,很容易可以发现这之间的一个漏洞:区块有任意一个dirtytickscounter更新后便满足了保存条件,然而方块实体的数据改变并不直接更新dirtytickscounter。从改变方块实体数据到它下一次tick之间如果有一次保存流程它便不会被保存,然而其它区块被保存了,这便导致其它区块保存了箱子里被取出的物品,但箱子区块并没有保存箱子物品被取出的结果。

利用这个原理我们可以发现区块刷物品其实只需要在取出物品后不要更新箱子区块便可以完成。同时这个特性也不止于刷物品。比如当活塞推出后,让活塞推出的方块和活塞臂都在另一个区块不更新本区块dirtytickscounter,然后立马卸载活塞。重进后发现活塞回到了推出之前的状态,然而mb可以保留下来


二、崩溃回溯复制

很容易发现区块的保存并不是统一的,包括世界中的其它数据和区块的保存也不是统一的。由于随机保存区块的机制存在,很有可能出现有些区块保存了有些区块没保存的情况。即使是统一保存的区块,由于在不同的任务里,很有可能一个保存完了另一个还得要很久才保存。所以在一个区块保存了另一个区块没保存的时间窗口将游戏崩溃便得到了一个区块被保存另一个区块没保存的效果。所以这个特性可以复制任何区块储存的数据,以及制作浮空方块等

原专栏链接 » « 返回区块机制栏目 « 返回文章列表