《我的世界》南宫幻雅开发技术手册——Minecraft基岩版世界存档结构与格式概述

你好,我最近有在研究基岩版世界存档结构与格式,现在想分享给你。

f139ddd8c91f2a2f09d6c86bd12a84d5.png

Minecraft基岩版世界存档结构与格式概述

374fa357631cc8e44490cba477c6618d.png

Minecraft基岩版世界存档结构与格式概述

        基岩版于 2017 年 9 月 20 日推出,基于 2011 年发布的 Minecraft: Pocket Edition。 它将九种主要设备平台汇集在一个称为基岩引擎的单一代码库下。 它从头开始对《我的世界》进行了重写,并带来了平台的一些根本性变化,为令人兴奋的新开发社区铺平了道路。 此版本通常简称为基岩版

e7912d12258f8f190980575c70718294.png

以下是它的文件结构

888617630f46b11be6dd0b68d399af0b.png

我的世界基岩版是使用 LevelDB 格式存储世界

de7e776aae22c30712039982fb1a2607.png

84af56a5d84fa46bd3a22b50ddb94cec.png

        Mojang修改了谷歌的原始LevelDB以加入对Zlib压缩格式和Windows系统的支持。代码可以在Github页面访问,且编写指引由Tommaso在此处提供https://github.com/google/leveldb

Google的leveldb库自从Mojang在发布Minecraft后得到了极大的改变,但Mojang自己修改后的版本仍然可以独立运作,但代码需要一些小修改来实现兼容性:

      如果被简单地注释掉,其余的代码仍可以正常运行。

      数据库储存在db或基岩版世界的子目录。传递给LevelDB API的数据库路径是这个路径,而不是其中任何文件的路径。这似乎也是存储世界地形的位置,因为可以通过将其db文件夹替换为来自无限世界类型的文件夹来将旧世界类型变为无限。

ae8e55579bc0abf7ddddb6d5afca10ce.png

一、什么是“.dat”文件

“.dat”中的“dat”是“Data”的简写。意为“数据”的意思,因而“.dat”文件即是数据文件。

“.dat”不是一种标准文件格式,许多文件都使用这个扩展名,但文件含义不同。例如,VCD光盘中的“.dat”文件用一般的视频播放器就可以打开,而QQ目录下的“.dat”文件是存储了用户信息的文件,不能使用常规方式打开,只有QQ程序可以访问。每种程序都有自己对“.dat”文件的定义,要通过产生它的程序来打开相应的“.dat”文件。

二、“.dat”文件用什么打开

广义上来说,文字、图片、声音、视频都可以保存为“.dat”文件,它们会以二进制的形式储存在“.dat”文件中,所以,要打开“.dat”文件,就不能以一种特定的软件来定义,这一点与“.dll”文件和“.ini”文件不同。

用特殊工具打开,比如winhex,以16进制的方式查看其代码。如图,“example.dat”打开后显示如下代码。

af9af42d4a6c955e8c51bccfdec32a43.png

以下是关于level.dat的内容

3626e1d1b2f4a6a7a2d0fb44c17d7788.png

a183bf1686f9c4479ffc6e853f6d15d6.png

2490aac985eb17a60be597bafe626cb3.png

6ba19dd37e5ca0c3d9d5953bdb546fc4.png

a25620b5faf70bd31ca4db760cb649a8.png

a25620b5faf70bd31ca4db760cb649a8.png

6ec5f45e1fd86606e9fc9f8711ed5718.png

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:世界的使用

f90794b651f82ba56643372c385d4f8b.png

8be08d230d2ba06d5db7f09a7b18adac.png

区块键值格式

有关区块数据的数据库键是以下内容的并列:

两个带符号的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日

  • 31
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值