Minecraft Wiki

除另有声明,转载时均必须注明出处若簡繁轉換出錯,請以遊戲內為準请勇于扩充与修正内容有兴趣逛逛我们的微博沟通交流,欢迎到社区专页需要协助,请在告示板留言

了解更多

Minecraft Wiki
注册
Advertisement
Information icon
此特性为Java版独有。

区块文件格式为在Minecraft Beta 1.3中为存储区块所引入的一种文件格式。其中每32×32个区块就会成为一组存储进一个独立的区域文件。可以这么认为,区域为整个文件系统的一部分,其中头文件用于确定每一个文件的位置、扇区则为所分配的大小。整个系统基于MCRegion[1],这是一个由Scaevolus编写的Mod。(他的Optifine项目也同样很有名。)MCRegion格式几乎未发生变化,除了向其中添加随时间戳更新的区块列表。Jahkob宣称这一全新的格式相比于之前的系统而言速度提高到7倍。[2]

在Minecraft 1.2中,区域文件被Anvil文件格式所取代;但是Anvil文件格式只对区块格式做出修改,只会将区域文件的文件名由“.mcr”修改为“.mca”。

区域文件[]

区域文件的位置[]

区域文件位于目录下名叫“region”的子文件中,并以r.x.z.mcr的命名方式进行命名(其中x和z为区域的坐标)。为了计算某一区块所属的区域的坐标,将区块坐标除以32即可。

在Java中:

   int localX = (int)floor(chunkX / 32.0);
   int localZ = (int)floor(chunkZ / 32.0);

在对位进行操作时(移位):

   int localX = chunkX >> 5
   int localZ = chunkZ >> 5

举例来说,坐标为(30, -3)的区块位于(0,-1)的区域中;而坐标为(70, -30)的区块位于(2,-1)的区域中。

结构[]

区域文件以 8kB 文件头开头,其中包含了该区域文件所包括的区块信息(最后更新的时间以及方位等)。区块坐标为(x,z)的区块在所在区域中的位置可以按如下方式找到:在区域文件中偏移4 * ((x mod 32) + (z mod 32) * 32) 字节即可。如果进行模运算后的值为负(例如可能发生在Java/C/C++中的模运算),只需将模的结果加32,或者将mod 32换为& 31,如下:4 * ((x & 31) + (z & 31) * 32)。在区块信息之后4096字节为时间戳。文件的剩余部分包含了1024个区块的信息,并以大量的未使用空间点缀其间。


字节 0 - 4095 4096 - 8191 8192...
描述 位置 (1024 个实体) 时间戳 (1024 个实体) 区块和未使用空间

区块的位置[]

区域中所包含的区块的位置信息由4字节组成,分为两部分:前三个字节为自文件开始的偏移区段数(大端序),剩余的一个字节为区块数据的长度(以区段计)。每个区段的长度是4096字节。一个区块的数据的总大小最大为1MB。如果区块并未包含在所对应的区域文件中(如该区块还未生成或还未迁移),则该部分会全部为零。

字节 0 1 2 3
描述 偏移 区段数

偏移为2的区块会在时间戳列表结束后开始。

区块的时间戳[]

时间戳列表的入口地址为独立的四字节高位优先的整值变量,代表了该区块的最后修改时间。

字节 0 1 2 3
描述 时间戳

区块数据[]

区块数据以一个长度为四字节的(高位优先的)数据开头,代表了区块以字节计的实际大小(包括偏移4处的压缩类型在内)。之后的一个字节表示区块数据的压缩方法。剩余的数据为压缩的区块数据。

字节 0 1 2 3 4 5...
描述 长度(以字节计) 压缩类型 压缩后的数据(数据长度为偏移0处记录的长度值减1)

当前有两种压缩方法:

数值 方法
1 GZip (RFC1952) (在实际中未得到应用)
2 Zlib (RFC1950)
3 不压缩数据(在实际中未得到应用)

被压缩的数据(在压缩前)以NBT格式进行保存,详细的信息请参见区块格式页面。如果使用第一种压缩算法,压缩后的文件与Alpha区块文件的磁盘目录相同。值得注意的是在官方客户端中使用的是第2种压缩算法。

如果将文件中压缩方法的值增加128,那么压缩后的数据将存放于同目录下一个名为c.x.z.mcc的文件(其中x和z是区块的坐标),而不是紧跟在压缩方法这个字节后面。这可能是为了存储过大以至于不适合直接保存于mca文件中的区块。

数据迁移与level.dat[]

Convert

Minecraft在转换至新版本时的界面样子

在Beta 1.3中会在载入世界之前将任何"较早"版本的区块转换至区域文件之中,而不是在随着游戏的进行逐渐进行转换。在转化的过程中,level.dat会更新TAG_Int("version(版本)")至19132版本。Beta 1.3同时也引入了一种新的世界命名空间,TAG_String("LevelName")。也引入了在玩家复合标签(TAG_Compounds),(单人游戏为level.dat,多人游戏为[player name].dat)中新的标签,TAG_Byte("Sleeping"),这一标签用于确定玩家是否在睡觉。其值非真(1)即假(0)。 在版本beta 1.8中添加了TAG_Int("GameType");在版本beta 1.9中添加了TAG_byte("hardcore")。

level.dat中的其他部分未作改变。

参见[]

外部链接[]

参考[]

语言

Advertisement