🏠
首页
🎨
创意设计
🧮
游戏计算
🖥️
服务器管理
控制台

Minecraft 基岩版存档格式教程

全面介绍 Minecraft 基岩版存档格式结构。基岩版使用经过 Mojang 修改的 Google LevelDB,并使用 Zlib 压缩进行存档存储。了解区块键格式、小端序 NBT 数据与数据库组织方式,为技术玩家与开发者提供清晰指引 🗃️


🗃️ 了解基岩版数据库架构

Minecraft 基岩版采用与 Java 版完全不同的存储系统。基岩版不是使用 Anvil 区域文件,而是使用 Google 的 LevelDB,并由 Mojang 进行修改,加入 Zlib 压缩与 Windows 支持。该机制保证了跨平台兼容与高效的数据访问。

🗄️

LevelDB 数据库系统

基于键值对的存储,使用修改版 LevelDB 与 Zlib 压缩

🔑

区块键格式

包含坐标与类型标签的复杂键结构

📊

小端序 NBT

使用小端序字节顺序的 NBT 格式

跨平台支持

为移动端、主机与 Windows 平台优化


🗄️ LevelDB 数据库格式

基岩版使用 Mojang 修改后的 Google LevelDB 来高效存储世界数据。

📍 数据库位置

LevelDB 数据库存储在每个基岩版世界的 db/ 子目录中:

worlds/YourWorldName/db/

重要: 传给 LevelDB API 的路径是目录路径,而不是目录中的某个文件。

🔧 Mojang 修改

  • Zlib 压缩: 提高存储效率
  • Windows 支持: 跨平台兼容
  • 自定义键格式: 专用区块寻址系统
  • 小端序 NBT: 改造 NBT 字节序

源码: 参见 github.com/Mojang/leveldb

🔄 数据组织

LevelDB 使用键值存储,其中:

  • 键:包含区块坐标、维度与数据类型
  • 值:保存实际区块数据、实体或元数据
  • 压缩:使用 Zlib 压缩以节省空间
  • 索引:快速随机访问特定区块

🔑 区块键格式系统

理解 LevelDB 中用于识别与访问区块数据的二进制键结构。

📊 键结构组件

1. 区块坐标

两个有符号 32 位小端整数

X 坐标(4 字节)+ Z 坐标(4 字节)

2. 维度 ID(可选)

32 位小端整数

主世界省略,1 为下界,2 为末地

3. 记录类型标签

1 字节标签,用于标识数据类型

见下方的键类型标签表

4. 子区块索引(可选)

SubChunkPrefix 记录使用 1 字节索引

0 到 15,表示不同高度层

🔢 键长度

  • 9 字节:主世界区块(8 字节坐标 + 1 字节类型)
  • 10 字节:主世界子区块(9 字节 + 1 字节索引)
  • 13 字节:其他维度区块(12 字节 + 1 字节类型)
  • 14 字节:其他维度子区块(13 字节 + 1 字节索引)

🏷️ 区块键类型标签

基岩版区块键中所有记录类型标签的完整参考。

地形与生物群系数据

6 种类 🔑
十进制 十六进制 ASCII 名称 说明
43 2B + Data3D 高度图(256×2 字节)与生物群系数据(长度可变)。生物群系以 25 个调色板存储,ID 为整数
44 2C , Version 1 字节版本标识:0 为旧世界,较高值为无限世界
45 2D - Data2D 高度图(256×2 字节)与 2D 生物群系(256×1 字节)。生物群系 ID 为 8 位整数。自 v1.18.0 起不再写入
46 2E . Data2DLegacy 高度图(256×2 字节)与 2D 生物群系(256×4 字节)。生物群系 ID 在首字节,后三字节为 RGB。自 v1.0.0 起不再写入
47 2F / SubChunkPrefix 子区块版本(1 字节)+ 版本相关数据。用于 16×16×16 子区块地形
48 30 0 LegacyTerrain 方块 ID(32768 字节)、元数据(32768 半字节)、天空/方块光照(各 32768 半字节)、高度图(256×1 字节)、2D 生物群系(256×4 字节)。数据按 XZY 顺序存储。自 v1.0.0 起不再写入

实体与方块实体数据

4 种类 🔑
十进制 十六进制 ASCII 名称 说明
49 31 1 BlockEntity NBT 复合根列表 - 方块实体数据(小端序 NBT)
50 32 2 Entity NBT 复合根列表 - 实体数据(小端序 NBT)
51 33 3 PendingTicks NBT 复合根列表 - 待处理刻数据(小端序 NBT)
58 3A : RandomTicks NBT 复合根列表 - 随机刻数据(小端序 NBT)

世界状态与特性

11 种类 🔑
十进制 十六进制 ASCII 名称 说明
52 34 4 LegacyBlockExtraData 条目数量(4 字节)+ 条目(键 4 字节、值 2 字节)。v1.2.13 之前用于雪层中的草。自 v1.2.13 起不再写入
53 35 5 BiomeState 区块生成用的生物群系状态信息
54 36 6 FinalizedState 4 字节:32 位小端整数,表示最终化状态
56 38 8 BorderBlocks 教育版特性 - 边界方块数据
57 39 9 HardcodedSpawners 结构生成的边界框信息,采用二进制格式存储
59 3B ; Checksums 其他区块记录的 xxHash 校验和。自 v1.18.0 起不再写入
61 3D = MetaDataHash 用于区块校验的元数据哈希
62 3E > GeneratedPreCavesAndCliffsBlending 洞穴与山崖过渡前的融合数据 - 未使用
63 3F ? BlendingBiomeHeight 生物群系高度融合数据 - 未使用
64 40 @ BlendingData 用于地形生成过渡的世界融合数据
65 41 A ActorDigestVersion 用于实体处理优化的摘要版本

旧版与弃用记录

2 种类 🔑
十进制 十六进制 ASCII 名称 说明
55 37 7 ConversionData 世界转换数据 - 不再使用
118 76 v LegacyVersion 1 字节旧版本号 - 在 v1.16.100 中迁移到标签 44

🎯 特殊数据库键

用于玩家数据、世界设置与游戏特性的非区块键。

玩家数据键

2 键 🎯

~local_player

本地玩家实体数据,包含单个 NBT 复合根

player_

远程玩家数据,client ID 来自 clientid.txt(如 player_-12345678)

世界数据键

9 键 🎯

game_flatworldlayers

ASCII 格式的平坦世界层配置(长度 20,例如长度 9 的 "[7,3,3,2]")

map_<#>

单个地图物品的数据

portals

下界传送门链接与坐标数据

structuretemplate

生成结构的模板数据

tickingarea

Ticking 区域的定义与边界

actorprefix*

实体管理用的 actor 前缀键

digp*

世界交互的持久化挖掘数据

map_*

制图相关的地图数据前缀

schedulerWT*

定时事件的世界刻调度数据

村庄系统键

4 键 🎯

VILLAGE__DWELLERS

村民、铁傀儡与猫等居民数据

VILLAGE__INFO

包含边界框与属性的村庄信息

VILLAGE__POI

村民与床/工作站的兴趣点映射

VILLAGE__PLAYERS

玩家与村庄的交互与声誉数据

📄 level.dat 文件结构

基岩版的 level.dat 使用未压缩的 NBT 格式,小端序字节顺序,并带有 8 字节头部。

📋 文件头格式

字节 0-3: 版本号(32 位小端整数,当前为 10)
字节 4-7: 文件长度(32 位小端整数,去除头部后的长度)
字节 8+: 小端序的未压缩 NBT 数据

🗂️ NBT 数据字段

玩家能力与权限

8 字段 📄
attackmobs
Byte

1 或 0(真/假)- 是否可攻击生物

attackplayers
Byte

1 或 0(真/假)- 是否可攻击玩家

build
Byte

1 或 0(真/假)- 是否可放置方块

doorsandswitches
Byte

1 或 0(真/假)- 是否可交互红石

flying
Byte

1 或 0(真/假)- 玩家当前是否在飞行

mayfly
Byte

1 或 0(真/假)- 玩家是否允许飞行

mine
Byte

1 或 0(真/假)- 是否可破坏方块

op
Byte

1 或 0(真/假)- 是否拥有管理员指令权限

世界设置与生成

7 字段 📄
Generator
Int

世界类型:0=旧世界,1=无限世界,2=平坦

RandomSeed
Long

世界生成种子

Difficulty
Int

0=和平,1=简单,2=普通,3=困难

GameType
Int

0=生存,1=创造,2=冒险,3=旁观

commandsEnabled
Byte

1 或 0(真/假)- 是否启用作弊

bonusChestEnabled
Byte

1 或 0(真/假)- 是否启用奖励箱

spawnMobs
Byte

1 或 0(真/假)- 是否允许生成生物

出生点坐标与维度

4 字段 📄
SpawnX
Int

玩家出生点 X 坐标(默认 0)

SpawnY
Int

玩家出生点 Y 坐标(默认 64)

SpawnZ
Int

玩家出生点 Z 坐标(默认 0)

Dimension
Int

当前维度:0=主世界,1=下界,2=末地

游戏规则与机制

8 字段 📄
keepinventory
Byte

死亡不掉落物品规则

mobgriefing
Byte

生物破坏规则

dodaylightcycle
Byte

昼夜循环规则

dofiretick
Byte

火焰蔓延规则

domobspawning
Byte

生物生成规则

doweathercycle
Byte

天气循环规则

naturalregeneration
Byte

自然回复规则

pvp
Byte

玩家对战规则

时间与天气数据

7 字段 📄
Time
Long

当前时间刻(24000 刻为一天)

currentTick
Long

当前游戏刻计数器

LastPlayed
Long

上次游玩时间的 64 位 Q32.32 Unix 时间戳

rainLevel
Float

当前降雨强度

rainTime
Int

当前降雨剩余刻数

lightningLevel
Float

当前雷暴强度

lightningTime
Int

当前雷暴剩余刻数

版本与兼容性

5 字段 📄
StorageVersion
Int

基岩版存储工具版本(目前为 10)

NetworkVersion
Int

上次游玩版本的协议号

baseGameVersion
String

资源加载的最大版本(例如 1.16.0 会移除新特性)

lastOpenedWithVersion
List

上次打开版本的五个整数(如 [1, 20, 30, 22, 1])

MinimumCompatibleClientVersion
List

最低兼容客户端版本的五个整数(如 [1, 20, 30, 0, 0])

教育版特性

6 字段 📄
educationFeaturesEnabled
Byte

1 或 0(真/假)- 是否启用教育版功能

EducationOid
String

教育版机构标识的 UUID

EducationProductId
String

教育版授权的产品标识

eduOffer
Int

教育版世界标记(值为 1 的世界无法在基岩版打开)

codebuilder
Byte

Code Builder/MakeCode 集成状态

immutableWorld
Byte

1 或 0(真/假)- 世界是否为只读

实验性特性

3 字段 📄
experiments_ever_used
Byte

1 或 0(真/假)- 世界是否锁定实验性玩法

saved_with_toggled_experiments
Byte

1 或 0(真/假)- 世界是否曾以实验性设置保存

enabled_features
List

该世界启用的实验性特性列表

多人游戏与网络设置

8 字段 📄
MultiplayerGame
Byte

1 或 0(真/假)- 是否启用“多人游戏”设置

MultiplayerGameIntent
Byte

1 或 0(真/假)- 是否打开“多人游戏”开关

LANBroadcast
Byte

1 或 0(真/假)- 是否开启“局域网可见”

LANBroadcastIntent
Byte

1 或 0(真/假)- 是否打开“局域网可见”开关

XBLBroadcastIntent
Int

Xbox Live 可见性:0=禁用,1=仅邀请,2=仅好友,3=好友的好友

useMsaGamertagsOnly
Byte

1 或 0(真/假)- 是否仅允许微软账号玩家

Platform
Int

平台标识(观察值:2)

PlatformBroadcastIntent
Int

平台相关的广播设置

世界模板与商城

8 字段 📄
isFromWorldTemplate
Byte

1 或 0(真/假)- 是否从模板创建

isFromLockedTemplate
Byte

1 或 0(真/假)- 是否来自锁定模板(选项不可修改)

isWorldTemplateOptionLocked
Byte

1 或 0(真/假)- 是否在接受变更前锁定世界选项

prid
String

付费模板 UUID(商城世界)

hasLockedBehaviorPack
Byte

行为包锁定状态

hasLockedResourcePack
Byte

资源包锁定状态

texturePacksRequired
Byte

1 或 0(真/假)- 是否要求加入时使用材质包

ConfirmedPlatformLockedContent
Byte

1 或 0(真/假)- 是否包含平台专属内容

高级世界设置

8 字段 📄
NetherScale
Int

下界坐标比例(默认 8):下界 X 方块 = 主世界 1 方块

worldStartCount
Long

自世界创建以来的关闭次数(每次关闭减少 1)

serverChunkTickRange
Int

区块处理的模拟距离

CenterMapsToOrigin
Byte

1 或 0(真/假)- 是否将地图中心对齐网格原点

startWithMapEnabled
Byte

1 或 0(真/假)- 新玩家是否携带定位地图

SpawnV1Villagers
Byte

1 或 0(真/假)- 生成 1.10.0 前村民

isCreatedInEditor
Byte

1 或 0(真/假)- 是否由基岩版编辑器创建

isExportedFromEditor
Byte

1 或 0(真/假)- 是否从基岩版编辑器导出

特殊数据结构

7 字段 📄
FlatWorldLayers
String

控制平坦世界生成的 JSON

默认示例:
{ "biome_id": 1, "block_layers": [ { "block_name": "minecraft:bedrock", "count": 1 }, { "block_name": "minecraft:dirt", "count": 2 }, { "block_name": "minecraft:grass_block", "count": 1 } ], "encoding_version": 6, "structure_options": null, "world_version": "version.post_1_18" }
BiomeOverride
String

将世界设为指定生物群系的单一生物群系

InventoryVersion
String

背包系统版本标识

world_policies
Compound

世界级政策设置

eduSharedResource
Compound

教育版共享资源配置(包含 buttonName 与 linkUri)

IsHardcore
Byte

1 或 0(真/假)- 是否为硬核模式

IsSingleUseWorld
Byte

1 或 0(真/假)- 未使用,可能导致一次性世界删除

🔄 NBT 格式差异

基岩版与 Java 版 NBT 数据格式的关键差异。

🔵 基岩版 NBT

  • 字节序:小端序
  • 整数存储:多字节整数为小端序
  • 字符串长度:小端序长度前缀
  • 压缩:数据库内使用 Zlib 压缩
  • 用途:实体、方块实体、待处理刻记录

🟠 Java 版 NBT

  • 字节序:大端序
  • 整数存储:多字节整数为大端序
  • 字符串长度:大端序长度前缀
  • 压缩:区域文件使用 Gzip 压缩
  • 用途:Anvil 区域文件与 level.dat

⚠️ 转换警告

由于字节序不同,Java 与基岩版的 NBT 数据无法直接兼容。跨平台存档转换需要专用工具。

🛠️ 开发者工具与资源

用于处理基岩版存档格式与 LevelDB 数据库的核心工具与库。

📚

LevelDB 库

用于访问 LevelDB 的编程库:

  • Mojang LevelDB:官方修改版,包含 Zlib
  • leveldb-mcpe-java:支持压缩的 Java 实现
  • Python leveldb:Python 数据库访问绑定
  • Node.js leveldown:JavaScript LevelDB 绑定
🔧

世界编辑器

用于编辑基岩版世界的工具:

  • Amulet Editor:跨平台世界编辑器
  • MCC Tool Chest:基岩版专用编辑器
  • Blocktopograph:移动端世界查看/编辑
  • Universal Minecraft Editor:多格式编辑器
📊

分析工具

数据库检查与调试:

  • LevelDB dump:数据库内容探索
  • NBT 解析器:小端序 NBT 读取
  • 区块分析器:键格式解码
  • 性能分析:数据库优化工具
🔄

转换工具

格式转换与迁移:

  • Java 转基岩转换器:跨版本世界迁移
  • NBT 格式转换器:端序转换
  • 结构导出工具:跨平台建筑转换
  • 世界优化工具:数据库清理与修复

📋 LOG 文件格式

LevelDB 会在 db/ 目录中生成 LOG 文件,用于记录数据库操作与压缩过程。

📍 文件位置

LOG 文件位于基岩版世界的 /db 路径:

worlds/YourWorldName/db/LOG
worlds/YourWorldName/db/LOG.old

用途: LevelDB 格式的一部分,用于 LDB 文件压缩之间的记录

📄 日志格式

每条日志遵循固定格式:

YYYY/MM/DD-Hour:Minute:Second.Microseconds ProcessID "Operation"

组成:

  • 日期/时间:操作发生时间
  • 进程 ID:十六进制进程标识
  • 操作:数据库操作描述

📊 日志示例

2014/07/24-22:20:08.400488 4a3638 Recovering log #3

数据库恢复操作

2024/09/04-11:45:12.123456 2f1a8c Compaction started

数据库压缩过程开始

2024/09/04-11:45:15.789012 2f1a8c Level-0 compaction finished

压缩过程完成

🔧 常见操作

  • Recovering log:数据库启动与恢复
  • Compaction:数据库优化与清理
  • Level operations:LSM 树层级管理
  • File operations:SSTable 文件创建/删除
  • Manifest updates:数据库元数据更新

🛠️ 使用 LOG 文件排错

🔍 损坏检测

关注关于损坏块或校验和无效的错误信息

⚠️ 恢复问题

检查未能成功完成的 “Recovering log” 记录

💾 空间问题

观察压缩操作是否出现磁盘空间或性能异常

🔒 锁定问题

识别导致世界无法打开的数据库锁定问题

✅ 最佳实践与安全指南

处理基岩版世界数据库与存档文件时必须遵循的安全实践。

🛡️

安全第一

  • 始终备份世界后再进行任何修改
  • 在副本上测试,不要直接操作原始世界
  • 确认工具兼容当前基岩版版本
  • 编辑数据库前彻底关闭 Minecraft
  • 修改后检查文件完整性
⚙️

技术规范

  • 使用正确的字节序读取与写入 NBT 数据
  • 保持键格式一致,避免新增区块数据失配
  • 正确处理压缩以读取 Zlib 压缩值
  • 注意版本兼容不同基岩版发布
  • 校验区块坐标与维度 ID

性能建议

  • 批量操作数据库提高效率
  • 正确关闭连接避免锁定
  • 监控数据库大小并定期清理
  • 大型操作使用合适工具
  • 评估修改性能影响

🔄 版本兼容性

基岩版存档格式会随更新演进。请始终确认工具、世界存储版本与当前基岩版版本之间的兼容性。部分特性与键类型为版本专用,可能无法跨版本使用。