你好,我最近有在研究基岩版世界存档结构与格式,现在想分享给你。
Minecraft基岩版世界存档结构与格式概述
Minecraft基岩版世界存档结构与格式概述
基岩版于 2017 年 9 月 20 日推出,基于 2011 年发布的 Minecraft: Pocket Edition。 它将九种主要设备平台汇集在一个称为基岩引擎的单一代码库下。 它从头开始对《我的世界》进行了重写,并带来了平台的一些根本性变化,为令人兴奋的新开发社区铺平了道路。 此版本通常简称为基岩版
以下是它的文件结构
我的世界基岩版是使用 LevelDB 格式存储世界
Mojang修改了谷歌的原始LevelDB以加入对Zlib压缩格式和Windows系统的支持。代码可以在Github页面访问,且编写指引由Tommaso在此处提供https://github.com/google/leveldb
Google的leveldb库自从Mojang在发布Minecraft后得到了极大的改变,但Mojang自己修改后的版本仍然可以独立运作,但代码需要一些小修改来实现兼容性:
如果被简单地注释掉,其余的代码仍可以正常运行。
数据库储存在db或基岩版世界的子目录。传递给LevelDB API的数据库路径是这个路径,而不是其中任何文件的路径。这似乎也是存储世界地形的位置,因为可以通过将其db文件夹替换为来自无限世界类型的文件夹来将旧世界类型变为无限。
一、什么是“.dat”文件
“.dat”中的“dat”是“Data”的简写。意为“数据”的意思,因而“.dat”文件即是数据文件。
“.dat”不是一种标准文件格式,许多文件都使用这个扩展名,但文件含义不同。例如,VCD光盘中的“.dat”文件用一般的视频播放器就可以打开,而QQ目录下的“.dat”文件是存储了用户信息的文件,不能使用常规方式打开,只有QQ程序可以访问。每种程序都有自己对“.dat”文件的定义,要通过产生它的程序来打开相应的“.dat”文件。
二、“.dat”文件用什么打开
广义上来说,文字、图片、声音、视频都可以保存为“.dat”文件,它们会以二进制的形式储存在“.dat”文件中,所以,要打开“.dat”文件,就不能以一种特定的软件来定义,这一点与“.dll”文件和“.ini”文件不同。
用特殊工具打开,比如winhex,以16进制的方式查看其代码。如图,“example.dat”打开后显示如下代码。
以下是关于level.dat的内容
level.dat为NBT格式。
NBT结构
-
db/snappy_compressor.cc应该引用<snappy.h>而不是<snappy/snappy.h>。
-
table/table_test.cc包含两个无法解析但不相关的snappy引用:port::Snappy_Compress和leveldb::SnappyCompressor。
-
:世界格式根目录。
-
data_driven_biomes:自定义生物群系。
-
data_driven_items:其他数据型驱动功能。
-
experimental_molang_features:实验性Molang功能。
-
experiments_ever_used:存档是否使用过实验性功能
-
-
upcoming_creator_features:即将到来的创作者功能。
-
0:主版本号。
-
1:次版本号。
-
2:补丁版本号。
-
3:修订版本号。
-
4:测试版本号。
-
0:主版本号。
-
1:次版本号。
-
2:补丁版本号。
-
3:修订版本号。
-
4:测试版本号。
-
attackmobs:玩家是否能攻击生物。
-
attackplayers:玩家是否能攻击其他玩家。
-
build:玩家是否能放置方块。
-
doorsandswitches:玩家是否能打开或关闭门、打开或关闭拉杆等方块。
-
flying:玩家是否处于飞行状态。
-
instabuild:玩家是否能瞬间破坏方块。
-
invulnerable:玩家是否无敌。
-
lightning:玩家是否能被闪电劈中。
-
mayfly:玩家是否能飞行。
-
mine:玩家是否能挖掘方块。
-
mute:玩家是否被禁言。
-
noclip:玩家是否拥有自由视角。
-
op:玩家是否拥有管理员权限。
-
opencontainers:玩家是否能打开容器(例如箱子)。
-
teleport:玩家是否能传送。
-
permissionsLevel:世界主人的权限等级。
-
playerPermissionsLevel:其他玩家的权限等级。
-
flySpeed:玩家的飞行速度。
-
walkSpeed:玩家的移动速度。
-
abilities:玩家权限或能力。
-
lastOpenedWithVersion:最后一次打开的游戏版本。格式为
x.x.x.x.x
,x为下列整数的值,例如基岩版1.18.2为1.18.2.3.0
。 -
MinimumCompatibleClientVersion:最小可兼容的客户端版本。若游戏客户端版本低于此值,则不能打开目标存档。格式为
x.x.x.x.x
,x为下列整数的值,例如基岩版1.18.10为1.18.10.0.0
。 -
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:实验性玩法选项。
-
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:世界的使用
区块键值格式
有关区块数据的数据库键是以下内容的并列:
两个带符号的32位小端序整数(x和z分别位于区块坐标中)。
可选的第三个32位小端序整数(1为下界,2为末地,忽略掉则为主世界)。
一个单字节标签,指定键所代表的记录类型(见表),以及……
(对于SubChunkPrefix记录)一个字节的子区块索引(从0到15)。
因此,这些键值应当为9、10、13或14字节长度。对于指定的区块而言,并非所有子区块都需要存在。
BlockEntity、Entity和PendingTicks记录代表了NBT变种中的串联根标签序列,它以短整数格式存储长度和多字节整数类型,而不是Java版或原始 NBT规范使用的大端序格式。
Version中的零值用于记录旧世界格式,更高的值被无限世界类型使用。
其余键值
实体数据存在特殊键值~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
1.“我的世界 (Minecraft)”Java版和 RTX 版的世界转换指南https://www.nvidia.cn/geforce/guides/minecraft-rtx-world-conversion-guide/
2. MCC Tool Chest PE - Minecraft 我的世界 基岩版 java版 存档世界互转
https://www.kirimasharo.com/archives/MCC_Tool_Chest_PE.html
3. Minecraft基岩版存档结构概述
https://www.bilibili.com/read/cv9966827/
4. MCC Toolchest(PE) -强大的世界编辑器
https://www.minebbs.com/threads/mcc-toolchest-pe.1548/
5.《我的世界》基岩版和《我的世界》Java 版之间的差异
https://learn.microsoft.com/zh-cn/minecraft/creator/documents/differencesbetweenbedrockandjava
6. 关于“.dat”文件,我们可以知道些什么?
https://zhuanlan.zhihu.com/p/636104809
7. Minecraft Wiki
https://minecraft.fandom.com/zh/wiki/Minecraft_Wiki
8. leveldb
https://github.com/google/leveldb
更新到2024年5月10日