永远加载的区块

Ganxiaozhe
2019/07/15

引子

在这之前,要给大家讲个故事。一天,一个名为July的玩家在纯净服惬意的玩着生存,运气爆棚,他挖到了许多铁矿,连忙像抱着稀世珍宝一样,迫不及待地跑回了家,进入密室,将所有铁矿都放入了熔炉进行炼制。承着浪费时间就是浪费金钱的座右铭,他前往了数千米外的海边准备钓些晚餐来打发时间......

数小时过去了,他带着一桶活蹦乱跳的鱼兴冲冲回到密室准备收取炼制成果时,竟然发现熔炉里才只炼制出了2个铁锭。他震惊了,再由震惊到蒙圈,由蒙圈到愤怒,最后转为无奈而又不知解。这时,水桶里活蹦乱跳的鱼和垂头丧气的他形成了鲜明的对比。看,多么滑稽的一幕。



好了回到正题,至于为什么出现故事中的问题,当然就涉及到区块加载了。这里将区块分为两大类,一是世界出生点附近区块(worldspawnchunks),二是普通区块(chunk)。一个区块的大小是16×256×16个方块。

  • 世界出生点附近区块 - 由16×16个区块组成(16×256×16×16×16个方块)。只要玩家在主世界,这个区域内的区块会一直保持加载,不会因为玩家远离而被卸载。
  • 普通区块 - 16×256×16个方块。而当玩家在游戏世界移动时,新的区块进入加载范围从而被加载到内存中;旧的区块超出加载范围而被卸载并保存到硬盘上。当一个区块被卸载后,这一个区块的所有处理都会停止。

知道区块的加载、卸载运作机制,故事中的问题就很好解释了:玩家的家不在世界出生点附近区块范围内,当玩家远离熔炉之后,熔炉所在区块被卸载,区块内事件处理被停止。直到玩家返回,该区块才被加载。



保持区块加载

在历史上,常见的区块加载无非是利用红石或者一些机制特性来做到,比较费力。所以这里只阐述命令方块,同时这也是很简单的一个方法。即利用扩散实体来强制加载区块。

首先,我们前往世界出生点区块(worldspawnchunks)。这里为了方便我直接选择X0,Y0的位置作为世界出生点。

利用指令/setworldspawn X Y Z来设置世界出生点。以该点为中心,附近16×16区块都会在玩家在主世界时保持加载。

接下来就是制作加载区块的装置了,如图:

利用红石块、比较器、红石、中继器做的一个低频处理,也可以用漏斗或者计分板来实现。前两个命令方块分别是召唤实体(以下称为marker)、将marker扩散至需要加载的位置。后一个即为清除marker。如需加载X1000 Z1000位置的区块,指令为:

  1. summon minecraft:area_effect_cloud ~ ~1 ~ {CustomName:"chunkLoader",PersistenceRequired:true}
  2. spreadplayers 1000 1000 1 2 false @e[type=area_effect_cloud,name=chunkLoader]
  3. kill @e[type=area_effect_cloud,name=chunkLoader]




LOADING | 此框架正在加载中
QQ群:771363745