palworld-save-tools 存档转换实战手册
palworld-save-tools 存档转换实战手册【免费下载链接】palworld-save-toolsTools for converting Palworld .sav files to JSON and back项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools当你想看清 Palworld 存档里养了哪些帕鲁、基地建在什么位置用十六进制编辑器打开Level.sav得到的却是一片压缩后的乱码。当你想在游戏更新前备份存档、更新后再对比结构变化你手里没有任何人类可读的中间格式可以留档。当你想改一个数值再写回去通用 Unreal 存档编辑器又读不懂 Palworld 自定义的数据块。palworld-save-tools 就是解决这件事的Palworld .sav 存档与 JSON 的双向转换工具。它和通用存档编辑器最大的区别在于它为 Palworld 的每个数据块角色、公会、基地、地图物体、工作分配手写了编解码器并保证 SAV→JSON→SAV 往返后逐位一致——改完能安全写回游戏而不只是读得出来。 最短跑通路径第一次把 .sav 转成 JSON 再写回只需要 Python 3.9 或更高版本。项目零第三方依赖clone 下来就能直接跑不需要额外装包。克隆仓库并确认 Python 版本你输入git clone https://gitcode.com/gh_mirrors/pa/palworld-save-tools cd palworld-save-tools python --version你看到Python 3.9.x或更高的版本号即合格。跑第一次转换仓库自带测试存档下面这条命令把tests/testdata/Level.sav转成 JSON输出为同目录的Level.sav.jsonpython -m palworld_save_tools.commands.convert tests/testdata/Level.sav ✅ 终端依次打印 Decompressing → Loading → Writing同目录多出 Level.sav.json你看到用编辑器打开Level.sav.json能看到GroupSaveDataMap、CharacterSaveParameterMap等完整结构不再是乱码。再写回 .sav走完整条链路这一步把 JSON 转回 .sav。注意默认输出路径就是原 .sav 所在位置程序覆盖前会先问你python -m palworld_save_tools.commands.convert tests/testdata/Level.sav.json ✅ 确认后生成 tests/testdata/Level.savsav→json→sav 回路走通⚠️风险在测试数据上按y会覆盖仓库自带的Level.sav。第一次跑直接按n体验流程即可操作真实存档时永远用-o把输出指到别处。不想 clone 也可以pip install palworld-save-tools会得到同名命令palworld-save-tools参数完全一样只是没有现成的测试存档。按你的意图取数只解析需要的块、把修改写回去、控制输出格式只解析你关心的数据Level.sav全量转换出的 JSON 可能非常大。如果你只想看公会和角色两块可以让工具跳过其余数据块省下的不只是磁盘python -m palworld_save_tools.commands.convert tests/testdata/Level.sav \ --custom-properties .worldSaveData.GroupSaveDataMap,.worldSaveData.CharacterSaveParameterMap.Value.RawData ✅ 生成的 JSON 只剩公会与角色两块文件明显变小处理也更快--custom-properties逗号分隔的路径列表必须是 paltypes.py 中PALWORLD_CUSTOM_PROPERTIES的键默认all常用路径.worldSaveData.GroupSaveDataMap公会、.worldSaveData.CharacterSaveParameterMap.Value.RawData角色、.worldSaveData.BaseCampSaveData.Value.RawData基地原理.sav 是 12 字节文件头加 zlib 压缩0x32 存档会二次压缩解压后是 GVAS——Unreal 引擎的通用存档结构。通用结构由 gvas.py 解析各RawData块则由 rawdata/ 里手写的编解码器解码成可读 dict。这就是为什么--custom-properties能同时省时间又省内存。技巧试一试只留.worldSaveData.BaseCampSaveData.Value.RawData重新导出对比看看基地数据结构长什么样。改完 JSON 写回 .sav并确认没改坏改完 JSON 后用新路径写回 .sav避免碰原文件python -m palworld_save_tools.commands.convert ./saves/Level.sav.json -o ./saves/Level-fixed.sav --force ✅ 终端打印 Writing SAV file 后./saves/ 下出现 Level-fixed.sav写回之后用仓库自带的往返校验脚本确认链路没有丢数据——它内部执行 sav→json→sav 并逐字节对比这也是项目测试套件验证正确性的同一方法python -m palworld_save_tools.commands.resave_test tests/testdata/Level.sav ✅ Files are the same!技巧试一试如果 JSON 只是给下游脚本读而不是给人看导出时加--minify-json体积更小、解析更快。让 JSON 输出兼容严格的解析器Python 的 json 默认会写出NaN、Infinity这在 JSON 规范里不合法一些语言的解析器会直接报错。如果你的 JSON 要喂给严格工具SAV 转 JSON 时加--convert-nan-to-null工具会把 NaN/Inf 统一转成null代价是丢失 Inf 的区分想要更紧凑的文件就再加--minify-json。技巧试一试导出后用python -m json.tool ./saves/Level.sav.json快速校验 JSON 合法性。转换报错排错路径、魔数、内存这三个报错按出现频率排序都是真实会撞上的。Level.sav does not existLevel.sav does not exist原因路径是相对你终端当前目录解析的当前目录不对就找不到文件。回到仓库根目录用相对路径重跑python -m palworld_save_tools.commands.convert tests/testdata/Level.savfound b\x00\x00\x00 instead of bPlZnot a compressed Palworld save, found b\x00\x00\x00 instead of bPlZ原因这个文件根本不是有效的 Palworld 存档多半是空文件或从错误位置拷来的。确认文件位于游戏存档目录Windows 下是%LOCALAPPDATA%\Pal\Saved\SaveGames\SteamID\SaveID\且大小非 0。Windows 上也可以把 .sav 直接拖到仓库里的convenience_tools/convert.cmd它会自动找可用的 Python 命令帮你跑。MemoryErrorMemoryError原因大型存档的全量 JSON 可达几十 MB完整解析会把所有数据结构一次性载入内存。只解析你要的块内存立刻降下来python -m palworld_save_tools.commands.convert ./saves/Level.sav --custom-properties .worldSaveData.CharacterSaveParameterMap.Value.RawData实战更新前批量校验服务器存档如果你跑专用服务器可以借resave_test在每次游戏更新前把所有玩家的存档做一轮往返验证坏一个挡一个别让坏存档跟着更新一起出问题# 批量往返校验更新前跑一遍比更新后才发现解析失败强得多 import subprocess import sys from pathlib import Path # 用 pathlib 是因为要对 SteamID/SaveID 两层目录做跨平台遍历 saves_dir Path(./saves) failed [] for sav in saves_dir.glob(*/*/Level.sav): r subprocess.run( [sys.executable, -m, palworld_save_tools.commands.resave_test, str(sav)], capture_outputTrue, ) if r.returncode ! 0: failed.append(sav) # 有失败就打印出来方便在更新前逐个处理 print(All pass if not failed else fBroken: {failed})不这么做会怎样游戏更新后某天转换直接抛异常你分不清是哪个玩家的存档受影响而且备份窗口早就错过了。速查一张表存进你的编辑器侧边栏打开这张速查表想做什么命令 / 参数.sav 转 JSONpython -m palworld_save_tools.commands.convert ./saves/Level.savJSON 写回 .savpython -m palworld_save_tools.commands.convert ./saves/Level.sav.json强制转换方向不看扩展名--to-json/--from-json指定输出路径-o ./output/Level.sav覆盖已存在文件不再询问--force只解析指定数据块--custom-properties .worldSaveData.GroupSaveDataMapNaN 转 null / 紧凑输出--convert-nan-to-null/--minify-json往返逐字节校验python -m palworld_save_tools.commands.resave_test ./saves/Level.sav接下来打开仓库里的palworld_save_tools/paltypes.py对照PALWORLD_CUSTOM_PROPERTIES认识每个可解析的数据块再翻翻rawdata/下对应的解码实现你就知道 JSON 里每个字段是从哪来的。遇到新版游戏解析失败时先去看tests/testdata/里是否已经有对应版本的测试存档。【免费下载链接】palworld-save-toolsTools for converting Palworld .sav files to JSON and back项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

最新新闻

日新闻

周新闻

月新闻