本站文本内容除另有声明外,转载时均必须注明出处。(详情…本站文本内容除另有声明外,转载时均必须注明出处。(详情…中文Minecraft Wiki是完全公开的。请勇于扩充与修正内容!中文Minecraft Wiki是完全公开的。请勇于扩充与修正内容!Minecraft中文Wiki微博正在更新!或许有兴趣去看看Minecraft中文Wiki微博正在更新!或许有兴趣去看看想与其他用户进行编辑上的沟通?社区专页正是为此创建的。想与其他用户进行编辑上的沟通?社区专页正是为此创建的。翻译或创建页面之前,不妨看看译名标准化Wiki条例页面。翻译或创建页面之前,不妨看看译名标准化Wiki条例页面。需要管理员的协助?在管理员告示板留言也许可以帮到您。需要管理员的协助?在管理员告示板留言也许可以帮到您。

We are currently performing an upgrade to our software. This upgrade will bring MediaWiki from version 1.31 to 1.33. While the upgrade is being performed on your wiki it will be in read-only mode. For more information check here.

区域文件格式

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

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

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

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