☰
Ely Prism Launcher如何读取存档NBT数据?libnbtplusplus的World管理完全指南
2026/10/17 9:39:22 网站建设 项目流程

【免费下载链接】Launcher

This fork of Prism Launcher adds integrated support for Ely.by accounts.

项目地址:https://gitcode.com/GitHub_Trending/ely/Launcher
点击查看免费下载

Ely Prism Launcher 是基于 Prism Launcher 的增强版 Minecraft 启动器,内置了 Ely.by 账号支持。它内置的"World"(世界/存档)管理功能,让你无需打开游戏就能在实例页面里看到存档名称、游戏模式、最后游玩时间和种子,甚至能直接改名、复制、删除存档。这些信息的来源,就是每个存档目录下的level.dat文件——一个 Gzip 压缩的 NBT(Named Binary Tag)文件。📦

第一步:如何找到你的存档?

启动器通过 WorldList 扫描实例的saves目录:

  • 遍历目录下每个文件夹,用World类尝试解析其中的level.dat
  • 只有解析成功的文件夹才被视为有效存档(w.isValid())
  • 通过QFileSystemWatcher监听目录变化,你在游戏里新建存档后界面会自动刷新(见 WorldList.cpp)

对应界面在 WorldListPage.cpp——右键菜单里的"复制种子""打开文件夹""用 MCEdit 打开"等操作,都是基于这里解析出的 NBT 数据。

level.dat:Gzip 压缩的 NBT 文件

存档的核心文件level.dat并不是明文,处理它需要两步:

1️⃣ 解压— 由 GZip.h 提供GZip::unzip()/GZip::zip()完成压缩与解压;

2️⃣ 解析 NBT 树— 这正是 libnbtplusplus 的舞台。

核心函数parseLevelDat()位于 World.cpp:

  • 先调用GZip::unzip还原字节流
  • 再用nbt::io::read_compound()把字节流解析成一棵 NBT 标签树
  • 解析失败时返回nullptr,World对象会标记为无效,界面中直接不显示

libnbtplusplus 具体提取了哪些信息?

解析成功后,loadFromLevelDat() 会进入 NBT 树的Data复合标签,提取 5 项关键数据:

字段NBT 路径用途
存档名称Data/LevelName(String)显示在 World 列表
最后游玩时间Data/LastPlayed(Long 时间戳)转成QDateTime展示
游戏模式Data/GameType(Int)映射为生存/创造/冒险/旁观,见 GameType
世界种子Data/WorldGenSettings/seed,旧版本回退到Data/RandomSeed支持右键"复制种子"

为了兼容不同游戏版本,读取代码用了带异常捕获的辅助函数read_string()、read_long()、read_int()(World.cpp):旧世界缺少某个标签时,只会打印警告并回退默认值,而不会让启动器崩溃——这就是"健壮解析"的体现。

反向写入:改名时如何安全修改 NBT?

World 管理不只是"读"。当你右键存档选择"重命名"时,World::rename() 会执行一次完整的 NBT 读改写循环:

  1. parseLevelDat()读出整棵 NBT 树
  2. 定位Data复合标签,把LevelName标签改写为新名字
  3. nbt::io::write_tag()把 NBT 树序列化回字节流(serializeLevelDat())
  4. 重新 Gzip 压缩,通过 PSaveFile 原子写回——写入失败可自动取消,避免损坏存档 ⚠️

这个"读 → 改 → 写"闭环,是 libnbtplusplus 作为可读写 NBT 库的核心价值。

导入存档:识别 zip 压缩存档

除了目录形式,Ely Prism Launcher 也支持导入 zip 压缩包存档:

  • World::readFromZip() 用MMCZip::ArchiveReader在压缩包内查找level.dat,只解压这一个文件就能识别存档
  • LocalWorldSaveParseTask.cpp 的contains_level_dat()递归检查文件夹/压缩包结构,识别 SINGLE(单个世界)与 MULTI(含saves目录的整包)两种格式
  • 测试用例 WorldSaveParse_test.cpp 基于 tests/testdata/WorldSaveParse 的 zip 与目录样本验证了整个识别流程

libnbtplusplus 在哪里?

该库以 git 子模块形式内置在 libraries/libnbtplusplus,由根目录 CMakeLists.txt 直接编译进启动器。它是一个轻量 C++ 库,提供:

  • nbt::io::read_compound()/nbt::io::write_tag()— 流式读写 NBT
  • nbt::tag_compound、nbt::tag_string、nbt::tag_long等类型安全的标签访问器
  • 解析失败时抛出nbt::io::input_error异常,方便上层捕获处理

总结

Ely Prism Launcher 的 World 管理本质是一条流水线:

扫描 saves 目录 → 定位 level.dat → Gzip 解压 → libnbtplusplus 解析 NBT 树 → 提取名称/模式/时间/种子 → 界面展示与原地改写

理解这条链路后,你就能明白:为什么损坏的level.dat会导致存档从列表中"消失",以及启动器的改名、复制、删存档等操作为什么能如此安全。🎮

【免费下载链接】Launcher

This fork of Prism Launcher adds integrated support for Ely.by accounts.

项目地址:https://gitcode.com/GitHub_Trending/ely/Launcher
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询