Minecraft基岩版为储存的世界使用了一个完全不同的格式。携带版0.9.0及以后版本采用的是谷歌LevelDB的修改版,使用Zlib压缩格式来储存资料。携带版0.8.1及更低版本使用一个经修改的NBT格式(为某些文件使用了小端序)。
1.0[]
1.0中,以LevelDB键值形式单独存储每个子区块。[1]
例如,主世界: | x: 32 | z: 32 | 标签: 8 |(非必须)子区块id: 8 |
任何其他维度: | x: 32 | z: 32 | 维度: 32 | 标签: 8 |(非必须)子区块id: 8 |
合理的标签值:
enum class Tag : char { Data2D = 45, Data2DLegacy = 46, SubChunkPrefix = 47, LegacyTerrain = 48, BlockEntity = 49, Entity = 50, PendingTicks = 51, BlockExtraData = 52, BiomeState = 53, FinalizedState = 54, Version = 118 };
要请求一个特定的子区块,你需要将值“47”填入标签中,并且提供一个介于0到16的数字给子区块ID。注意,子区块可以不存在。然而它们仍如同堆叠般运作,举例来说,如果有个子区块存在,那么所有其下方的子区块必须存在。
子区块的格式如下:
- 版本:1字节
- 方块ID:4kb,每方块8字节
- 方块数据:2kb,每方块4字节
- 天空亮度:2kb,每方块4字节
- 方块亮度:2kb,每方块4字节
0.9.0[]
LevelDB格式[]
Mojang修改的LevelDB已发布在此处,并且构建它需要的参数都被Tommaso记录于https://twitter.com/_tomcc/status/477950809427427328,官方的LevelDB页面则位于 此处,寻找一个以携带版为基准的请参阅此处。
数据库被储存在携带版世界的db/子文件夹。似乎这也是地形文件的存储位置。因为你可以用一个无限世界的db文件夹来替换旧世界的db文件夹,这样就可以把一个旧世界转换为无限世界。
储存在数据库的资料有三种类型:地形数据,实体数据,方块实体数据。
键值形式:9字节长的键值,可能由下述所组成:
- 为小端序整数的区块X坐标
- 为小端序整数的区块Z坐标
- 另外的1个字节表示该数据的类型:
- 0x30(48 以十进位显示、'0' ASCII)可能为地形数据
- 0x31(49 以十进位显示、'1' ASCII)为方块实体数据
- 0x32(50 以十进位显示、'2' ASCII)为实体数据
- 0x76(118 以十进位显示、'v' ASCII)为1字节的数据
自从0.12.1版本加入了下界,就有了特殊的记录下界数据的键,大小有13字节,好像有:
- 为小端序整数的区块X坐标
- 为小端序整数的区块Z坐标
- 为小端序整数的1(0x01 0x00 0x00 0x00)
- 表示数据类型的额外的1字节:
- 0x30(48 以十进位显示、'0' ASCII)可能为地形数据
- 0x31(49 以十进位显示、'1' ASCII)为方块实体数据
- 0x32(50 以十进位显示、'2' ASCII)为实体数据
- 0x76(118 以十进位显示、'v' ASCII)为1字节的数据
0×30的地形数据条目看似包含x*z*y = 16*16*128区块的的方块数据。这个数据和这个和0×30地形数据键有关的值的值始终为83,200,并且似乎包含以下数据:
- 看似为x*z*y = 16*16*128的区块的32,768字节方块数据。
- 16,384字节的普通数据(上面的方块数据的每个字节为一个半字节)。
- 16,384字节的天空亮度数据(上面的方块数据的每个字节为一个半字节)。
- 16,384字节的方块亮度数据(上面的方块数据的每个字节为一个半字节)。
- 256字节的附加数据,似乎是一个z*x = 16*16字节的数组(上面128字节块数据的每个垂直y列的一个字节),包含脏列信息。
- 1,024字节的附加数据,似乎是一个16*16*4字节的数组(上面的128字节块数据的每个垂直y列的四个字节),包含草色信息。
以下所提供的定义是为了阐明包含32,768方块的区块的LevelDB条目和相对应的整个世界所包含的方块位置的绘制:
- 设X和Z为LevelDB键值。
- 设C []为LevelDB区块的三维数组。前两个指数i和j的值域为0到15,第三个指数y的值域为0到127。
- 设W []为整个世界所包含的方块三维数组。
- 对于old世界,前两个指数x和z的值域为0到255;对于infinite世界,x和z的值域高出四位数,并可以为负数
- 不论是old还是infinite世界,第三个指数y的值域都是0到127。
假设以上的定义,以下为带有X和Z值的地图的LevelDB的方块位置和其所对应的整个世界所包含方块位置:
- 当x = 16*X + i and z = 16*Z + j时,C [i, j, y] <-> W [x, z, y]。
x指数指定了南北方位,x值越小,方位越北。z指数指定了东西方位,z值越小,方位越东。y指数制定了垂直方位,y值越小,高度越低。在old世界中,在东北的最低处的角落的位置为W [0, 0, 0]。
以上的0×31 tile实体和0×32实体数据条目为NBT编码,并在根层次包含0、1、或多个连接的复合标签。在复合为0的情况下,LevelDB指定0为这个键值的长度。多个连接复合标签可被支持,因为在一个区块内,可有不止一个实体会被加载。每个0×31 tile实体和0×32实体条目会有一个关联的0×30的地形条目,但是反之不然。
0×30的地形条目的数量和0×76的1字节数据条目始终是一样的,并且两者的x值和z值有一对一的关联。在这三个值中,发现了1字节的数据,包括了二进制的值0、1、和2。0值会在old世界发现,1和2值会在infinite世界发现。
同时,实体数据条目有特殊键~local_player来储存本地玩家实体。如果此处存在实体数据,则它优先于level.dat中存储的玩家数据。和~local_player键有关的值为NBT编码,并在根层次里只有一个复合标签。
远程玩家也个有由两部分组成的特殊键。第一个带有前缀player_,第二个是包含远程用户的clientid.txt文件的客户ID。例如,player_-12345678为客户ID为-12345678的远程用户的键。和player——前缀键有关的值为NBT编码,并在根层次里只有一个复合标签。
在超平坦世界中,有一个长度为20的特殊的“game_flatworldlayers”键。与此键关联的值是ASCII文本格式的一组数字。例如,与“game_flatworldlayers”键相关联的值为“[7,3,3,2]”,其中该示例的值长度是9。
level.dat[]
level.dat的结构与0.8.1及以下版本的很相似。
结构[]
- 世界数据
- Dimension: 玩家所在的维度。0为主世界。
- GameType: 默认游戏模式:生存(0)模式、创造(1)模式。
- Generator: 世界类型:旧,无限(1),或超平坦(2)
- LastPlayed: 当玩家保存游戏时,存储Unix时间戳(以秒为单位)。
- LevelName: 指定这个存档的名字。
- 有限地图起点(仅限于旧世界(Old)模式)
- LimitedWorldOriginX: 有限地图生成位置的X坐标。
- LimitedWorldOriginY: 有限地图生成位置的Y坐标。
- LimitedWorldOriginZ: 有限地图生成位置的Z坐标。
- Platform: 似乎存储创建层次的平台。目前观察值为2。
- RandomSeed: 地图种子。
- SizeOnDisk: 估计的存档大小(字节)。
- 在世界中的生成坐标。
- SpawnX: 玩家生成位置的X坐标。默认为0。
- SpawnY: 玩家生成位置的Y坐标。默认为64。
- SpawnZ: 玩家生成位置的Z坐标。默认为0。
- StorageVersion:基岩版存储工具版本, 目前为4
- Time:基岩版以“刻”的方式来储存一天的时间。现实一秒钟等于20刻;一个游戏中的日夜更新等于14400刻,也就是12分钟——比普通的昼夜更新(20分钟)短了8分钟。0刻为白天的开始,7200刻开始“日落”,8280刻进入黑夜,13320刻开始“日出”,最后14440刻为另一天白天的开始。level.dat中存的刻度值会一直增长,超过14400,但是游戏中的昼夜更新仍用14400进制。
- dayCycleStopTime:增加在8.0。默认是18446744073709552000。
- spawnMobs:禁止(0)或允许(1)生物生成。
LOG[]
LOG文件位于存档的/db
路径,并且是leveldb格式的一部分,用于压缩LDB文件之间。它类似于程序的日志文件。格式为:
YYYY /MM/DD-Hour/Minute/Second.StepName "Info"
例如:
2014/07/24-22:20:08.400488 4a3638 Recovering log #3
0.8.1及以前[]
level.dat[]
level.dat的格式在0.2.0版时被修改了;它现在是一个基于计算机版本的level.dat格式的NBT格式的文件。 在一个0.2.0 移动版之后的世界里, level.dat 是一个存储了环境数据(比如时间)和玩家的健康值、背包、速度和地图内的位置的未压缩的小端序NBT文件。
这个文件有8字节的文件头。包括一个小端序的4字节表明文件类型的整数,对于level.dat是3(更新前是2)。 在它之后是另一个整数,表明了文件除去文件头之外的大小。[2]
NBT结构[]
- 世界数据。
- GameType: 生存模式时为0,创造模式时为1。
- LastPlayed: 存储玩家保存游戏文件时的Unix 时间戳(以秒的形式)。
- LevelName: 世界名称。
- Platform: 看起来是用来存储世界所创建时的平台的。目前观察到的值是2。
- Player: 玩家实体信息。它缺少id标签并且有附加元素:
- Armor: 每个列表中的TAG_Compound定义了玩家正穿着的一件盔甲。这是一个长度4的列表。对应着头盔、胸甲、护腿和靴子。
- 背包物品数据。
- id: 物品或方块的ID。
- Count: 物品在背包内堆叠的数量。任何物品都能堆叠,包括工具。范围在1-255之间。高于255的值在游戏内不会显示。
- Damage: 对于盔甲, 是盔甲的损害值。盔甲满的损害值意味着没有损伤。在损害值到达0时,它会损坏然后消失。
- 背包物品数据。
- Dimension: 玩家所在的维度。0代表主世界。
- Inventory: 列表内的每个TAG_Compound定义了一个玩家正在携带或手持的物品。
- 背包物品数据。
- Slot: 标志着这件物品在哪个背包槽内。
- id: 物品或方块的ID。
- Count: 物品在背包内堆叠的数量。任何物品都能堆叠,包括工具。范围在1-255之间。高于255的值在游戏内不会显示。
- Damage: 对于工具, 是工具的耐久值。工具满的耐久值(比如金质工具的33)意味着没有损伤。在损害值到达0时,它会损坏然后消失。
- 背包物品数据。
- Score: 玩家分数。
- Armor: 每个列表中的TAG_Compound定义了玩家正穿着的一件盔甲。这是一个长度4的列表。对应着头盔、胸甲、护腿和靴子。
- RandomSeed: 为生成地形用的随机种子。
- SizeOnDisk: 字节形式的整个世界的大小。
- SpawnX: 玩家出生点的X坐标(默认为0)。
- SpawnY: 玩家出生点的Y坐标(默认为64)。
- SpawnZ: 玩家出生点的Z坐标(默认为0)。
- StorageVersion: 当前的携带版NBT的版本。当前为3。
- Time: 以刻的形式存储的当天时间。每一真实生活中的秒中有20刻, 每Minecraft日有14400刻,是整个日夜循环只有12分钟的长度(比标准的20分钟日夜循环短8分钟)。0是白天的开始,7200是日落的开始,8280是夜晚的开始, 13320是是日出的开始, 14400 又到了白天. 存储在level.dat内的值总是增加并且可以大于14400,但当天时间总是Time字段除以14400的余数。
chunks.dat[]
这个文件存储16x16(256)个区块的数组,保存了每个默认地图的全部256x256x128(8,388,608)个方块。每个 4096字节(或者说4kb)是一个区域长度,一个默认地图内有5377个区域 。这个文件最高可以储存32x32(1024)个区块或是512x512x128(33,554,432)个方块, 在在游戏生成的默认地图中,地图会处在一个标准的大小。文件内的字节类型绝大多数为32位的小端序, 除了几个区域的数据。
第一个区域是数据位置表,指向哪些区块是可用的和它们在地图和本文件内的位置。数据位置表的每128字节描述了地图中的一行区块,但它经常只有64字节长,因为每行只有16个区块。
在数据位置表中的每个区块是15 XX ZZ 00, 15 (21hex) 描述了本节中有多少个区域,第二个数字是16进制的区块左上角的X坐标,第三个数字是16进制的当前区块所在的行的Z坐标, 最后一个数字保持未使用直到一个导致地图大小变大的更新发生。
要寻找一个区块在表中的偏移值,所有必须做的就是使用这个算法:4096+(x*21*4096)+(z*21*16*4096)
,第一个区域是位置表,所以我们从4096位置开始。每21*4096字节是一个新区块,所以乘x。Z坐标同理,每16区块为一行,所以乘16。
在前8个区域的方块信息后是四个存储确切方块数据的使用大端序的区域。每字节代表两个方块。
在这4个区域之后是4个区域的天顶光照信息。 每字节是两个方块并要用大端序读取。光照值是F表示黑暗,光照值是0表示光亮。因为游戏动态生成光照所以通过外部程序修改此值是无意义的。
player.dat[]
在0.2.0前的版本,这个文件储存了玩家背包信息(现在位于level.dat)。
entities.dat[]
这个文件在0.2.0 Alpha版加入,使用经修改的小端序NBT格式。它以一种基于Alpha世界格式的格式存储实体信息。 在0.3.2时,这个文件被扩展以存储 方块实体信息。
这个文件具有12字节的头部,以ASCII字符串"ENT"开始,后跟一个0,再是一个小端序的整数1,后跟另一个小端序整数表明字节形式的文件长度(不包括头部)。[2]
NBT结构[]
实体格式[]
每个实体是一个包含在区块文件中的实体列表中的TAG_Compound。唯一的例外是玩家实体(储存在level.dat中)。
所有实体共享这个基类:
- 实体数据
- id: 实体ID。13 代表着绵羊,32代表着僵尸,64代表着掉落物。
- Pos: 3个TAG_Floats描述实体当前的 X,Y,Z坐标。
- Motion: 3个TAG_Floats 描述实体当前的dX,dY,dZ 速度。 (注意: 0,0,0 代表无动作)
- Rotation: 2个TAG_Floats描述当前以度为单位的倾斜度。
- :实体Y轴的顺时针倾斜度。朝西为0。因为它累计生物在游戏中的每次倾斜,所以可以是一个很大的值。
- : 实体Y轴的从水平开始的倾斜度。水平为0。为负值时看起来向下。不要超过正负90度。
- FallDistance: 实体已下落的距离。越大时当实体落地时会造成更大伤害。
- Fire: 距离火焰熄灭还剩多少刻。负值反映实体在火焰中能保持多久不燃烧。
- Air: 实体有多少空气(刻的形式).在空气中为300。在水下时减少。
- OnGround: 当实体接地时为1。
生物[]
- 生物的附加字段:
- AttackTime: 实体的"无敌盾牌"在受到打击后保持的刻形式的时间长度。
- DeathTime: 生物已死亡的刻数。控制死亡动画。
- Health: 生物拥有的健康值。玩家和敌对生物最高有20点,牲畜最高有10点。
- HurtTime: 未知。
- 动物的附加字段(比如绵羊):
- Age: 动物年龄。可能被后续版本中的幼年动物使用。
Sheep 绵羊有两个附加字段:
- Sheared: 1或0 (true/false) - 已剪毛时为1。
- Color: 0到15 - 现有一个证据表明此值不影响绵羊的颜色,但影响绵羊的羊毛掉落的颜色。[3]
- 物品附加字段:
- Health: 从5开始,目前仅当物品受到火焰伤害时降低。降至0时物品被摧毁。
- Age: 物品掉落在地上的时间.在2400刻或者说2分钟后,物品会被摧毁。
- Item: 物品数据
- id: 物品或方块ID
- Damage: 物品的损害值。0代表着无损害。当损害值超过物品耐久值时,它会损坏然后消失。只有盔甲和工具会正常累加损害值。
- Count: 掉落物实体包含的物品数量。任何物品都能堆叠,包括工具、盔甲和交通工具,范围在0-255之间。
历史[]
关于“基岩版世界格式/历史”的历史,请见各版本页面。
关于“基岩版世界格式/历史”的历史,请见各版本页面。
关于“基岩版世界格式/历史”的历史,请见各版本页面。
关于“基岩版世界格式/历史”的历史,请见各版本页面。
关于“基岩版世界格式/历史”的历史,请见各版本页面。
关于“基岩版世界格式/历史”的历史,请见各版本页面。
关于“基岩版世界格式/历史”的历史,请见各版本页面。
关于“基岩版世界格式/历史”的历史,请见各版本页面。
关于“基岩版世界格式/历史”的历史,请见各版本页面。
参考[]
版本 |
| ||||||
---|---|---|---|---|---|---|---|
开发 |
| ||||||
技术性 | |||||||
多人游戏 | |||||||
特色功能 |
语言