【免费下载链接】Launcher
This fork of Prism Launcher adds integrated support for Ely.by accounts.
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 读改写循环:
parseLevelDat()读出整棵 NBT 树- 定位
Data复合标签,把LevelName标签改写为新名字 nbt::io::write_tag()把 NBT 树序列化回字节流(serializeLevelDat())- 重新 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()— 流式读写 NBTnbt::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.
相关推荐
如何快速管理我的世界存档:Ely Prism Launcher 的 WorldList 功能完整指南
如何快速管理我的世界存档:Ely Prism Launcher 的 WorldList 功能完整指南 🎮 Ely Prism Launcher 是基于 Pri
Ely Prism Launcher实例数据模型:MinecraftInstance与BaseInstance完整解读
Ely Prism Launcher实例数据模型:MinecraftInstance与BaseInstance完整解读 Ely Prism Launcher 是
如何用Ely Prism Launcher配置内存与JVM参数:提升游戏FPS的完整教程
如何用Ely Prism Launcher配置内存与JVM参数:提升游戏FPS的完整教程 Ely Prism Launcher(PineconeMC)是一款基于
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考