本站文本内容除另有声明外,均在知识共享 署名-非商业性使用-相同方式共享 3.0 协议下提供。(详细信息…

区域文件格式

来自Minecraft Wiki
跳转至: 导航搜索

区块文件格式为在Minecraft 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) 字节即可。针对于x或z可能为负的情况,在计算其模数后需要以31减去其绝对值。在区块信息之后4096字节为时间戳。文件的剩余部分包含了1024个区块的信息,并以大量的未使用空间点缀其间。


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

区块的位置[编辑 | 编辑源代码]

区域中所包含的区块的位置信息由4字节组成,分为两部分:前三个字节为自文件开始的4KB区段中的偏移信息(高位优先),剩余的一个字节为区块的长度(也在4KB区段中,四舍五入)。区块的总大小最大为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)

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

数据迁移与level.dat[编辑 | 编辑源代码]

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中的其他部分未作改变。

另见[编辑 | 编辑源代码]

外部链接[编辑 | 编辑源代码]

另见[编辑 | 编辑源代码]