我的世界服务器区块文件,区域文件格式 - Minecraft Wiki,最详细的官方我的世界百科...

c5863208c5fabc0620aaa0484a289f9b.png

此特性为Java版独有。

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

在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)

3

不压缩数据(在实际中未得到应用)

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

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

数据迁移与level.dat[]

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

参见[]

外部链接[]

参考[]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值