区块文件格式为在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[]
在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中的其他部分未作改变。
参见[]
外部链接[]
- Mojang announcement of new region format; Jeb helping tool-makers
- McRegion
- RegionFile in Java
- RegionFileCache in Java
- Find region file from coordinates
参考[]
版本 | |||||||
---|---|---|---|---|---|---|---|
开发周期 |
| ||||||
技术 |
| ||||||
多人游戏 | |||||||
游戏订制 |
语言