本站文本内容除另有声明外,均在知识共享 署名-非商业性使用-相同方式共享 3.0 协议下提供。(详情…本站文本内容除另有声明外,均在知识共享 署名-非商业性使用-相同方式共享 3.0 协议下提供。(详情…中文Minecraft Wiki是完全公开的。请勇于扩充与修正内容!中文Minecraft Wiki是完全公开的。请勇于扩充与修正内容!Minecraft中文Wiki微博正在更新!或许有兴趣去看看Minecraft中文Wiki微博正在更新!或许有兴趣去看看想与其他用户进行编辑上的沟通?社区专页正是为此创建的。想与其他用户进行编辑上的沟通?社区专页正是为此创建的。翻译或创建页面之前,不妨看看译名标准化Wiki条例页面。翻译或创建页面之前,不妨看看译名标准化Wiki条例页面。需要管理员的协助?在管理员告示板留言也许可以帮到您。需要管理员的协助?在管理员告示板留言也许可以帮到您。

Hello there! We are conducting a survey to better understand the user experience in making a first edit. If you have ever made an edit on Gamepedia, please fill out the survey. Thank you!

基岩版世界格式

来自Minecraft Wiki
跳转至: 导航搜索
Information icon.svg
此特性为基岩版独有。
Cleanup.svg
该文章需要整理以符合样式标准 讨论
如果您可以,请帮我们优化文章样式来让它符合样式要求。讨论页可能包含一些建议。

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已发布在 https://github.com/Mojang/leveldb-mcpe ,并且构建它需要的参数都被Tommaso记录于 https://twitter.com/_tomcc/status/477950809427427328 官方的LevelDB页面则位于 https://code.google.com/p/leveldb/ 寻找一个以携带版为基准的请参阅这里:https://github.com/tinfoiled/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是 Overworld.

    •  GameType: 是在生存(0)还是在创造(1)模式。

    •  Generator: 世界类型:旧,无限,或超平坦

    •  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: 玩家分数。

    •  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结构[编辑 | 编辑源代码]


  • 根复合标签。

    •  Entities: 每个列表中的TAG_Compound定义了世界内的一个实体。

    •  TileEntities: 每个列表中的TAG_Compound定义了一个方块实体值,例如世界中的一个熔炉

实体格式[编辑 | 编辑源代码]

每个实体是一个包含在区块文件中的实体列表中的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之间。

历史[编辑 | 编辑源代码]

携带版(Alpha)
0.2.0 level.dat现在是NBT格式文件。
player.dat的信息移动到level.dat
新增entities.dat
0.3.2 Entities.dat被拓展以储存方块实体值
0.9.0 ?新增新的世界存档格式,基于LevelDB 1.17和Zlib compression support. 加载时旧的世界会自动转换到新的格式.
携带版
1.0.0 ?每个子区块现在被分开储存为不同的leveldb key。
基岩版
1.2.13 ?子区块现在被整装[4]

参考[编辑 | 编辑源代码]