区域文件格式

  • Published2026-01-11 23:35:03

此特性为Java版独有。

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

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

目录

1 区域文件

1.1 区域文件的位置

1.2 结构

1.3 区块的位置

1.4 区块的时间戳

1.5 区块数据

2 数据迁移与level.dat

3 参见

4 外部链接

5 参考

区域文件[]

区域文件的位置[]

区域文件位于目录下名叫“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[]

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

参见[]

世界格式

区块格式

Anvil文件格式

外部链接[]

Mojang announcement of new region format; Jeb helping tool-makers

McRegion

RegionFile in Java

RegionFileCache in Java

Find region file from coordinates

参考[]

↑ http://www.minecraftforum.net/viewtopic.php?f=25&t=120160&start=510#p2619453

↑ http://www.pcgamer.com/2011/02/09/minecraft-dev-diary-new-block-magic-fiddles/

Java版

版本

演示版

地点

PC Gamer演示版(Beta 1.3)

开发周期

版本记录

pre-Classic

Classic

Classic早期创造

多人测试

生存测试

Classic后期创造

Indev

Infdev

Alpha

Beta

正式版

开发版本

已移除特性

方块

物品

配方

未使用特性

独有特性

提及特性

计划版本

技术

已知漏洞

启动器

Minecraft API

硬件需求

al_version

方块实体

命令

函数

崩溃

数据值

Classic

Indev

扁平化前

数据版本

调试屏幕

格式化代码

键控代码

启动器

命名空间ID

协议版本

截屏

种子

统计信息

出生点区块

坐标

世界加载屏幕

.minecraft

client.jar

client.json

launcher_profiles.json

options.txt

开发资源

Anvil文件格式

区块格式

命令存储格式

世界格式

战利品表

随机序列格式

地图物品格式

模型

Mojang API

NBT格式

混淆映射表

实体格式

生物记忆

Player格式

兴趣点文件格式

raids.dat格式

区域文件格式

结构文件格式

Schematic文件格式

记分板格式

已保存的快捷栏格式

服务器列表格式

原始JSON文本格式

sounds.json

字幕

已配置的地物

已配置的结构地物

过时开发资源

Classic世界格式

Classic服务器协议

Indev世界格式

Alpha世界格式

材料

server_level.dat

结构生成格式

villages格式

已配置的地表生成器

多人游戏

服务器

Minecraft Realms

服务器列表

server.properties

服务器需求

定制服务器

游戏订制

皮肤

披风

资源包

数据包

语言

Deutsch

English

français

日本語

Nederlands