第二十八章 区块与区段
在上一章中,我们提到了“区块刻”。区块刻是个啥我们暂时不用了解,但区块我们还是要很详细的了解一下。
首先让我们认识一下区块(Chunk)。
当你在Minecraft世界行走时,你或许会发现你的视野边缘是由一个个正方形的区域组成的。这些正方形区域就是正在加载的区块。
Minecraft的世界是由一个个区块组成的,每个区块的长宽是16格,高是256格。在还未正式发布的Minecraft1.18版本中,区块的高度甚至达到了384格。
所以说,一个区块包含着65536块方块。而一个世界最多可以生成14062500000000个区块(约为14亿),每种区块都有7.46×10(的244,700次方)种可能的区块种类。怎么样,是不是很震撼?照这样计算,一个世界就有9216000000000000000(921.6京[1京=10000万亿])块方块。
但是上面这些只是真区块。什么是真区块呢?听说过Minecraft的边境之地吧,当你到达Minecraft的很远的地方时,那里的区块会出现Bug,也就是加载错误(32位溢出)。在Java版中,这个BUG早就已经在Beta1.8版本移除(但没有完全移除,64位溢出导致的边境之地仍然存在),并添加了世界边界拦着你。当你以任何方式越过世界边界后来到外面,会得到一些负面效果,扣血死亡,就好像绝地求生里一样。其实Java版的Minecraft还真的有点像绝地求生,你还可以使用特定的指令修改边界,来达到绝地求生的效果。是不是很神奇?
在基岩版,并没有边界,所以你仍然可以看到那个神奇的区块。但可惜,基岩版的边境之地即将于1.17.2版本移除,目前的1.17.2测试版中边境之地已经木掉了。
所以,真区块就是正常没有bug的区块。而那些bug的区块,则被叫做“假区块”。
一个区块被分成数个长宽高均为16格的区段。实际上,虽然区块这个词更常见,但是在Minecraft中,大多数游戏的运算都是以区段而不是以区块为单位的。
随机刻就是一个很好的例子。区块刻运算过程中,有一个刻叫随机刻。随机刻我们在讲/gamerule指令时已经见过了,但是我们还不知道它的运作方式。
那么它是怎么运作的呢?
一个区段有16×16×16=4096个方块。每一随机刻中,将会随机抽取randomTickSbr /eed规则设定的数量的方块,即默认Java是抽取3个方块,基岩是抽取1个方块。
大多数方块被抽到后并不会有什么影响,但以下方块会收到影响:
耕地上的农作物——有水可能生长,无水可能掉落
蘑菇——光照低则有可能传播,光照高则有可能掉落
藤蔓(wàn)——可能传播
火[仅基岩版]——可能熄灭或传播
冰和雪——可能融化
树叶——在附近没有树干的情况下可能枯萎
耕地——湿润程度会更新
可以生长的植物和滴水石锥——可能生长
草方块和菌丝——可能传播或变为泥土
树苗——可能长成树
岩浆——可能让附近的方块上着火
红石矿石——会熄灭
下界传送门方块——可能生成一只猪灵(Minecraft1.16版本及以上)或僵尸猪人(低于Minecraft1.16)
海龟蛋——破裂或孵化
营火——会冒出烟雾粒子
铜质方块——可能生锈
处于滴水石锥下方的炼药锅——如果滴水石锥上方有熔岩或水,炼药锅可能会被填充
一个Minecraft存档包含超级多的区块,所以游戏游玩时肯定不会将这些区块全部加载,而是选取部分区块进行加载。
在Java版,每个区块要加载都需要一个加载标签。每个加载标签都具有三个属性:
加载等级、标签类型和存活时间(可选属性)
加载等级,即规定了该区块的加载级别有多高。加载等级越小,能加载的内容就越多。如果加载等级有多个,那么将会生效的将会是数值最小的那个。
加载等级的范围是22到44,分为四个类型:
强加载:≤31——所有游戏内容都会运算
弱加载:32——除区块刻、实体以外其他游戏内容都会运算
加载边界:33——只有少部分内容会正常运行(红石、命令方块不会运行)
不可访问:34——只有世界生成会在这些区块中运行
加载等级会向相邻8个区块传播,每成功传播一次加载等级会加一级。
标签类型,用于确定该加载标签的来源。目前来说,标签类型有以下几种来源:
\\玩家\\
加载范围:正方形,边长为渲染距离(单人)或view-distance(多人)×2+1
加载等级:31
比如,当渲染距离为12时,游戏就会加载以玩家为中心的25×25个强加载区块,外边围着一圈弱加载区块和加载边界。
\\强制\\
使用/forceload指令赋予
等级:31
\\出生点\\
等级:22
强加载范围:19×19
\\传送门\\
使用下界传送门时,游戏会给予即将到达的另一个维度区块赋予等级30的加载标签。
强加载范围:3×3
\\末影龙\\
等级:24
强加载范围:15×15
\\瞬移\\
实体(注意不是玩家)瞬移后(包括使用/tbr /、/sbr /readbr /layers和末地传送门,刷沙机就是利用了这个原理)在瞬移后的区块创建的为时5游戏刻的加载标签。
等级:33(使用/tbr /是32)
\\临时\\
其他游戏代码告诉游戏该区块需要加载时临时建立的标签,仅持续1游戏刻。
等级:至少为33,视游戏代码而定。
在基岩版,玩家加载的范围和Java版不一样,呈现一个圆形。使用/tickingarea,也可以像/forceload一样一直让区块保持加载。
现在,你知道了区块是个什么东西了吧?
(唉,你看,这个矿洞会生成史莱姆唉!)