这篇算是上篇的一个补充,由于部分内容和区块加载关联不大,分析的逻辑可能不够严谨,仅供参考
除了玩家加载源外,还有几个可以加载区块的东西:
末地末影龙战斗系统
命令/结构方块
常加载区域
地图
光照更新
众所周知,在玩家击杀末影龙后末地会生成连接主岛到外岛的折跃门。折跃门的另一端将会生成在没有加载的地方,所以它需要加载区块。
在末地末影龙系统tick时(一般维度更新后的一个更新阶段),fight系统会检测它有没有记录任务(简化后的逻辑),任务中记录了两个generator还有任务本身(做什么)。它来自一个fight系统记录的任务队列。
如果没有任务,就从任务队列里取出任务并以折跃门区块为中心,主区块管理器为父级创建chunkviewsource,然后进行chunkviewsource::move,和玩家加载一样发布区块加载任务,半径为10区块,方形的。
如果有任务,就取出并判断是build还是verify折跃门对。如果折跃门坐标为中心的3*3区块都已经生成(loadState为9)便创建一个以刚刚那个chunkviewsource为区块管理器的blocksource用于和方块交互。这个过程中由于blocksource的区块管理器chunkviewsource,所以这些方块放置的过程中是影响不到这个chunkviewsource外的区块的。
另外末影龙死亡actor::tick时也会进行类似的逻辑
当setblock/fill/testforblock/execute detect/structure指令执行和结构方块放置时都有可能加载区块,半径为3区块。
对于方形常加载区块,创建chunkviewsource并且加载的范围为矩形范围每个边往外扩5区块组成的矩形
对于圆形常加载区块,chunkviewsource的范围是圆形半径+5的圆形
在地图数据更新时(维度级更新阶段),地图在被方块更改tick时会加载区块,会遍历每一个记录的实体(大概)并加载以他们为中心的8区块。
在服务器线程调度器阶段的光照更新中,每一个区块的光照更新会单独创建一个以它为中心的3*3区块的chunkviewsource并加载。