基岩版使用了修改后的Google的LevelDB(Zlib压缩格式)来储存世界格式资料。
基于LevelDB的格式[]
Mojang的LevelDB格式[]
Mojang修改了谷歌的原始LevelDB以加入对Zlib压缩格式和Windows系统的支持。代码可以在Github页面访问,且编写指引由Tommaso在此处提供。
对于Java版的LevelDB + Zlib,请见此Github页面。
Google的leveldb库自从Mojang在发布Minecraft后得到了极大的改变,但Mojang自己修改后的版本仍然可以独立运作,但代码需要一些小修改来实现兼容性:
db/snappy_compressor.cc
应该引用<snappy.h>
而不是<snappy/snappy.h>
。table/table_test.cc
包含两个无法解析但不相关的snappy引用:port::Snappy_Compress
和leveldb::SnappyCompressor
。如果被简单地注释掉,其余的代码仍可以正常运行。
数据库储存在db或基岩版世界的子目录。传递给LevelDB API的数据库路径是这个路径,而不是其中任何文件的路径。这似乎也是存储世界地形的位置,因为可以通过将其db文件夹替换为来自无限世界类型的文件夹来将旧世界类型变为无限。
区块键值格式[]
有关区块数据的数据库键是以下内容的并列:
- 两个带符号的32位小端序整数(x和z分别位于区块坐标中)。
- 可选的第三个32位小端序整数(1为下界,2为末地,忽略掉则为主世界)。
- 一个单字节标签,指定键所代表的记录类型(见表),以及……
- (对于SubChunkPrefix记录)一个字节的子区块索引(从0到15)。
因此,这些键值应当为9、10、13或14字节长度。对于指定的区块而言,并非所有子区块都需要存在。
BlockEntity
、Entity
和PendingTicks
记录代表了NBT变种中的串联根标签序列,它以短整数格式存储长度和多字节整数类型,而不是Java版或原始 NBT规范使用的大端序格式。
Version
中的零值用于记录旧世界格式,更高的值被无限世界类型使用。
标签字节 | 名称 | 描述 | ||
---|---|---|---|---|
Dec | Hex | ASCII | ||
43 | 2B | + |
Data3D | 新版的三维生物群系和海拔高度 |
44 | 2C | , |
Version | 一个字节 |
45 | 2D | - |
Data2D | 生物群系和海拔高度 |
46 | 2E | . |
Data2DLegacy | 旧版生物群系和海拔高度 |
47 | 2F | / |
SubChunkPrefix | 16×16×16子区块的地形 |
48 | 30 | 0 |
LegacyTerrain | 整个区块的地形 |
49 | 31 | 1 |
BlockEntity | 方块实体数据(小端序NBT) |
50 | 32 | 2 |
Entity | 旧版实体数据(小端序NBT) |
51 | 33 | 3 |
PendingTicks | 计划刻数据(小端序NBT) |
52 | 34 | 4 |
LegacyBlockExtraData | 旧版方块额外数据 |
53 | 35 | 5 |
BiomeState | 生物群系状态 |
54 | 36 | 6 |
FinalizedState | 32位小端序整数 |
55 | 37 | 7 |
ConversionData | 转换器提供的数据,用于运行时中的融合等操作 |
56 | 38 | 8 |
BorderBlocks | 教育版独有 |
57 | 39 | 9 |
HardcodedSpawners | 以二进制格式存储的结构生成的边界框 |
58 | 3A | : |
RandomTicks | 随机刻数据(小端序NBT) |
59 | 3B | ; |
Checksums | 其他区块记录的xxHash校验码 |
60 | 3C | < |
GenerationSeed | |
61 | 3D | = |
GeneratedPreCavesAndCliffsBlending | 不再使用 |
62 | 3E | > |
BlendingBiomeHeight | 不再使用 |
63 | 3F | ? |
MetaDataHash | |
64 | 40 | @ |
BlendingData | |
65 | 41 | A |
ActorDigestVersion | 1.18.30之后新版实体存储格式下的实体摘要版本 |
110 | 6E | n |
VersionEnchant | 中国版独有 |
111 | 6F | o |
VersionMarkInsert | 中国版独有 |
118 | 76 | v |
LegacyVersion | 一个字节。1.16.100为44。 |
其余键值[]
实体数据存在特殊键值~local_player
来储存本地玩家实体数据。如果这里存在实体数据,则它优先于存储在level.dat中的玩家数据。与~local_player
关联的数据值使用NBT格式在父级根目录里有且只有一个复合标签。
同时存在一个用于远程控制玩家的特殊键值,它由两个部分组成。第一个部分是前缀player_
,第二部分是客户端ID,包含了远程遥控玩家的clientid.txt文件。例如,player_-12345678
是使用客户端ID为-12345678
的控制远程客户端的键值。与前缀player_
键值关联的值是一个NBT结构文件,并且在根级别只有一个复合标签。
此外,也有一个名为game_flatworldlayers
的长度为20的键值,被超平坦世界使用。与此键关联的值是一组ASCII文本格式的数字。与game_flatworldlayers
键关联的值的例子是[7,3,3,2]
,值长度为9。
一些键值与村民有关:
- VILLAGE_[0-9a-f\\-]+_DWELLERS
- 主要由实体/生物ID组成。包括村民、铁傀儡和猫。
- VILLAGE_[0-9a-f\\-]+_INFO
- 包含了村庄边界。
- VILLAGE_[0-9a-f\\-]+_POI
- 包含了村民和工作站点之间的映射。床位分配似乎没有被存储。
- VILLAGE_[0-9a-f\\-]+_PLAYERS
基岩版leveldb解析器示例[]
基岩版存档数据库解析器的例子可以在minecraft_mmccoo找到。用于实现遍历所有方块、实体或生物、海拔和村庄相关项目的NBT文件。
NBT结构[]
下列页面记录了方块实体和实体的NBT结构文档:
level.dat[]
level.dat为NBT格式。
NBT结构[]
- :世界格式根目录。
- abilities:玩家权限或能力。
- attackmobs:玩家是否能攻击生物。
- attackplayers:玩家是否能攻击其他玩家。
- build:玩家是否能放置方块。
- doorsandswitches:玩家是否能打开或关闭门、打开或关闭拉杆等方块。
- flying:玩家是否处于飞行状态。
- instabuild:玩家是否能瞬间破坏方块。
- invulnerable:玩家是否无敌。
- lightning:玩家是否能被闪电劈中。
- mayfly:玩家是否能飞行。
- mine:玩家是否能挖掘方块。
- mute:玩家是否被禁言。
- noclip:玩家是否拥有自由视角。
- op:玩家是否拥有管理员权限。
- opencontainers:玩家是否能打开容器(例如箱子)。
- teleport:玩家是否能传送。
- permissionsLevel:世界主人的权限等级。
- playerPermissionsLevel:其他玩家的权限等级。
- flySpeed:玩家的飞行速度。
- walkSpeed:玩家的移动速度。
- lastOpenedWithVersion:最后一次打开的游戏版本。格式为
x.x.x.x.x
,x为下列整数的值,例如基岩版1.18.2为1.18.2.3.0
。- 0:主版本号。
- 1:次版本号。
- 2:补丁版本号。
- 3:修订版本号。
- 4:测试版本号。
- MinimumCompatibleClientVersion:最小可兼容的客户端版本。若游戏客户端版本低于此值,则不能打开目标存档。格式为
x.x.x.x.x
,x为下列整数的值,例如基岩版1.18.10为1.18.10.0.0
。- 0:主版本号。
- 1:次版本号。
- 2:补丁版本号。
- 3:修订版本号。
- 4:测试版本号。
- allowdestructiveobjects:在教育版中是否允许破坏性物体(如TNT)出现。
- allowmobs:在教育版中是否允许生物生成。
- bonusChestEnabled:是否允许生成奖励箱。
- bonusChestSpawned:是否在出生点处生成奖励箱。
- CenterMapsToOrigin:玩家创建的地图是否总是以玩家为中心,0表示对齐区块。
- cheatsEnabled:是否启用过作弊。
- codebuilder:在教育版中是否开启Code Builder权限。
- commandblockoutput:是否展示命令方块输出信息。
- commandblocksenabled:是否允许使用命令方块。
- commandsEnabled:是否允许使用管理员权限的命令。
- ConfirmedPlatformLockedContent:是否已经确认平台锁定的内容。
[需要验证] - dodaylightcycle:是否启用昼夜更替。
- doentitiydrops:非生物实体是否有掉落物。
- dofiretick:火是否蔓延及自然熄灭。
- doimmediaterespawn:玩家死后是否瞬间重生。
- doinsomnia:幻翼是否生成。
- domobloot:生物是否携带战利品表生成。
- domobspawning:是否可以生成生物。不影响刷怪笼生成生物。
- dotiledrops:方块被破坏时是否掉落物品。
- doweathercycle:天气是否变化。
- drowningdamage:玩家是否承受窒息伤害。
- educationFeaturesEnabled:是否启用教育版特性。
-
experimentalgameplay:是否启用实验性玩法特性。在1.16.100.55及之后版本中会被替换为 experiments。 - experiments:实验性玩法选项。
- data_driven_biomes:自定义生物群系。
- data_driven_items:其他数据型驱动功能。
- experimental_molang_features:实验性Molang功能。
- experiments_ever_used:存档是否使用过实验性功能。
- gametest:GameTest框架。
- saved_with_toggled_experiments:是否使用了自定义的实验性功能储存的世界。
[需要验证] - upcoming_creator_features:即将到来的创作者功能。
- falldamage:是否受到坠落伤害。
- firedamage:是否受到火焰伤害。
- freezedamage:是否受到冰冻伤害。
- ForceGameType:强制使用的游戏模式。0为生存模式,1为创造模式,2为冒险模式。
- globalmute:在教育版中是否全体玩家禁言。
- hasBeenLoadedInCreative:是否已经在创造模式打开过存档。主要用于控制是否可以获得成就。
- hasLockedBehaviorPack:是否包含已经锁定的行为包。
- hasLockedResourcePack:是否包含已经锁定的资源包。
- immutableWorld:是否开启无World Builder权限玩家不能放置或破坏方块的世界。
- isFromLockedTemplate:存档是否为锁定的模板世界。
- isFromWorldTemplate:存档是否为世界模板。
- isSingleUseWorld:教育版中是否为单学生游戏。
- isWorldTemplateOptionLocked:该模板世界是否解锁全部选项。
- keepinventory:玩家死后是否保留物品栏。
- LANBroadcast:是否允许开放局域网联机。
- LANBroadcastIntent:是否开启局域网联机。
- mobgriefing:生物是否能够进行破坏性行为。详见游戏规则。
- MultiplayerGame:是否允许进行多人联机游戏。
- MultiplayerGameIntent:是否开启局域网和Xbox多人游戏。
- naturalregeneration:玩家是否能在饥饿值足够时自然恢复生命值(不影响外部治疗效果,如金苹果、生命恢复状态效果等)。
- pvp:是否允许玩家互相攻击。
- requiresCopiedPackRemovalCheck:是否需要去除复制过的资源包/行为包才能加载世界。
[需要验证] - sendcommandfeedback:玩家执行命令的返回信息是否在聊天框中显示。
- showcoordinates:是否在GUI左上角显示坐标。
- showdeathmessages:是否展示死亡信息。
- showtags:是否在玩家头顶显示用户名。
- spawnMobs:控制生物生成。
- SpawnV1Villagers:是否生成旧版村民。
- startWithMapEnabled:玩家是否携带地图首次生成。
- texturePacksRequired:是否需要携带特定纹理包生成。
- tntexplodes:TNT是否能够破坏地形。
- useMsaGamertagsOnly:是否在仅在游戏中使用玩家的Xbox代号。本地存档默认为0,Realms世界默认为1。
- Difficulty:世界难度。0为和平,1为简单,2为普通,3为困难。
- eduOffer:是否为教育版独有世界。设置为1时只能由教育版客户端打开。
- functioncommandlimit:数据包的命令限制数量。
- Dimension:玩家所在的维度。0为主世界,1为下界,2为末地。
- GameType:玩家的游戏模式。0为生存模式,1为创造模式,2为冒险模式。
- Generator:世界格式。0为旧世界,1为无限,2为超平坦。
- lightningTime:下一次闪电出现前的剩余时间(刻)。
- LimitedWorldOriginX:有限(旧)世界生成开始的X坐标。
- LimitedWorldOriginY:有限(旧)世界生成开始的Y坐标。
- LimitedWorldOriginZ:有限(旧)世界生成开始的Z坐标。
- maxcommandchainlength:连锁型命令方块执行命令的数量限制。默认值为65535。
- NetherScale:下界与主世界的比例尺。默认值为8。
- NetworkVersion:网络协议版本号。用于控制联机时其余玩家是否可以加入该世界。
- Platform:世界时使用何种平台保存的,值总为2。
- PlatformBroadcastIntent:在平台间开放游戏,值总为3。
- rainTime:下一次进入下雨或下雪天气前的剩余时间(刻)。
- randomtickspeed: 随机刻速度。默认值为1。
- serverChunkTickRange:渲染距离。
- spawnradius:玩家出生点的坐标。
- SpawnX: 玩家出生点坐标X轴,默认值为0。
- SpawnY:玩家出生点坐标Y轴,默认值为64。
- SpawnZ: 玩家出生点坐标Z轴,默认值为0。
- StorageVersion:基岩版存储工具版本,目前为8。
- XBLBroadcastIntent:允许什么用户进行Xbox联机。1为仅邀请,2为仅好友,3为好友的好友。
- currentTick:当前的游戏刻。
- LastPlayed:玩家在最后一次退出游戏时的Unix时间戳(秒)。
- RandomSeed:世界的种子号。
- Time:以刻数形式储存的游戏内时间(游戏日)。1秒20刻,完成一次昼夜更替需要14400刻(12分钟,比标准情况下20分钟还要快)。0为早晨时间,7200为日落时间,8280为晚上时间,13320为日出时间,14400是下一次早晨的时间。level.dat内储存的数值会持续增加,且可以大于14400,但“游戏日”始终是
Time
字段值整除14400的结果。 - worldStartCount:最后一次打开存档的时间(时间戳)。
[需要验证] - lightningLevel:雷暴天气的强度。
- rainLevel:下雨天气的强度。
- baseGameVersion:世界模板使用的基础客户端版本。默认值为
*
。 - BiomeOverride:需要进行转换的生物群系。包含了在1.18.0移除的生物群系。
- FlatWorldLayers:控制超平坦世界生成的JSON文件。预设值:
{"biome_id":1,"block_layers":[{"block_data":0,"block_id":7,"count":1},{"block_data":0,"block_id":3,"count":2},{"block_data":0,"block_id":2,"count":1}],"encoding_version":3,"structure_options":null}
- InventoryVersion:物品栏使用的游戏版本。若游戏客户端版本低于此值,则不能打开目标存档。例如在基岩版1.18.10.26中创建的世界为
1.18.10-beta26
。 - LevelName:存档的名称。
- prid:世界模板的产品ID,由市场自动分配。
[需要验证] - worldTemplateUUID:世界模板的UUID。
- worldTemplateVersion:世界模板的版本号。
- world_policies:世界的使用政策。
[需要验证]
- abilities:玩家权限或能力。
LOG[]
LOG日志文件位于存档的/db路径里,并且是leveldb格式的一部分,用于在LDB压缩文件之间使用。类似于程序的日志文件:
YYYY /MM/DD-Hour/Minute/Second.StepName "Info"
示例:
2014/07/24-22:20:08.400488 4a3638 Recovering log #3
历史[]
携带版Alpha | |||||
---|---|---|---|---|---|
0.2.0 | level.dat现在是一个NBT格式文件。 | ||||
player.dat被合并到level.dat里。 | |||||
加入了entities.dat文件。 | |||||
0.3.2 | Entities.dat现在用于储存方块实体数据。 | ||||
0.9.0 | build 1 | 加入了新的世界储存格式和基于LevelDB 1.17的Zlib压缩格式支持。旧世界在新版本打开后会自动转换。 | |||
携带版 | |||||
1.0.0 | 0.17.0.1 | 现在每个子区块会被分别储存在不同的leveldb键中。 | |||
基岩版 | |||||
1.2.13 | ? | 子区块现在使用托管。[1] |
参考[]
版本 |
| ||||||
---|---|---|---|---|---|---|---|
开发 |
| ||||||
技术性 | |||||||
多人游戏 | |||||||
特色功能 |
语言