幻兽帕鲁存档编辑实战:palworld-save-tools 让 .sav 与 JSON 自由互转
【免费下载链接】palworld-save-toolsTools for converting Palworld .sav files to JSON and back项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools
周末晚上,你花了整整三个小时在野外刷稀有帕鲁,却在最后一刻被一只突然冒出的野生首领打回营地。望着背包里可怜的物资,你忍不住想:如果能直接改一下存档该多好——给角色加点等级,把帕鲁技能调一调,或者干脆复制一组稀有物品。
可惜的是,《幻兽帕鲁》的存档并不是一个能直接用记事本打开的文本文件。它是经过压缩和编码的二进制数据,普通编辑器打开只会看到一片乱码。这篇文章要介绍的 palworld-save-tools,正是解决这个问题的钥匙:它能把.sav存档完整地"翻译"成人类可读的 JSON,改完之后再原样转回.sav。读完本文,你会掌握从安装、转换、修改到批量自动化的完整流程。
一、先看清"对手":存档文件里到底藏着什么
在动手之前,先花一分钟理解存档的本质,这能帮你少踩很多坑。
.sav文件本质上是游戏引擎的序列化数据,它把世界里的每一样东西都编码成字节流,还做了压缩处理。palworld-save-tools 的处理流程可以概括为两条路:
- 解压与解码:把压缩的
.sav解包成引擎内部的 GVAS 结构,再按帕鲁特有的规则解析成 JSON; - 反向还原:把 JSON 重新编码、压缩回字节流,产出和原文件一致的
.sav。
整个过程的目标是"无损":官方明确承诺,SAV → JSON → SAV的往返转换(压缩前)应得到逐字节一致的还原结果。这意味着你可以放心大胆地改 JSON,只要不写坏语法,游戏就能正常读取。
对于大部分玩家来说,最常接触的是Level.sav——它承载了整个世界的核心数据。工具目前能够解析的数据结构包括以下这些:
| 想改的东西 | 对应的数据结构 | 说明 |
|---|---|---|
| 公会、组织信息 | GroupSaveDataMap | 成员、权限等组织类数据 |
| 玩家与帕鲁属性 | CharacterSaveParameterMap | 角色等级、技能、外观等 |
| 地图上的物件 | MapObjectSaveData | 建筑位置、世界物品 |
| 背包与容器 | ItemContainerSaveData | 物品数量、资源储备 |
| 帕鲁存储容器 | CharacterContainerSaveData | 帕鲁仓库、个体属性 |
| 动态物品 | DynamicItemSaveData | 带状态变化的物品 |
| 植被网格 | FoliageGridSaveDataMap | 地表植物等 |
| 基地与营地 | BaseCampSaveData | 基地布局、生产设施 |
| 工作相关数据 | WorkSaveData | 工作分配与任务状态 |
记住这张表,后面用--custom-properties选择性解析时会用到它。
二、三种方式把工具装进你的电脑
palworld-save-tools 需要 Python 3.9 或更高版本。不同习惯的用户有三条路可以选:
方式一:直接用 pip 安装(推荐开发者)
pip install palworld-save-tools安装完成后,命令行里会多出一个palworld-save-tools命令,可以直接调用。由于项目仍在快速迭代、接口可能变化,建议锁定具体版本号再升级。
方式二:克隆源码安装(推荐想读代码的用户)
git clone https://gitcode.com/gh_mirrors/pa/palworld-save-tools cd palworld-save-tools pip install .这种方式的额外好处是,你可以在本地直接运行python convert.py脚本,也能随时翻阅palworld_save_tools/目录下的源码,搞清楚每一块数据是怎么被解析的。
方式三:Windows 用户免命令行(最省事)
从项目的发布页下载最新的 Windows 压缩包,解压到任意文件夹后,直接把.sav文件拖到convert.cmd上,松手即可完成转换;把.sav.json再拖上去一次,就能转回.sav。整个过程不需要敲任何命令。
如果convert.cmd双击后没有反应,多半是 Windows 的"应用执行别名"拦住了 Python,到系统设置里关掉相关别名再试;或者干脆改用终端方式。
三、完成你的第一次存档转换
Steam 版《幻兽帕鲁》的存档默认放在这个目录下:
%LOCALAPPDATA%\Pal\Saved\SaveGames\<SteamID>\<SaveID>\核心文件就是Level.sav。动手之前,先把原始文件复制一份到安全的地方——这是整个流程中最重要的一步,后面所有操作都建立在这份备份之上。
找到存档后,在终端里执行(二选一,取决于你的安装方式):
# 方式一:使用全局命令 palworld-save-tools Level.sav # 方式二:在源码目录里直接运行 python convert.py Level.sav工具会根据文件扩展名自动判断方向:.sav转 JSON,.json转回.sav。默认输出文件名为原文件名加上.json后缀(反过来则是去掉.json)。
如果你想显式指定转换方向,可以用两个强制参数:
# 强制 SAV → JSON palworld-save-tools Level.sav --to-json # 强制 JSON → SAV palworld-save-tools Level.sav.json --from-json转换得到的 JSON 文件会很大。用 Visual Studio Code 或 JetBrains 系的编辑器打开会流畅很多,记事本这种轻量工具很可能直接卡死。修改完成后,执行反向命令,把改动"写回"游戏即可。
四、命令行参数速查:每个选项什么时候用
工具提供了一组实用的开关,这里按"使用场景"重新整理一份速查表:
| 参数 | 作用 | 典型使用场景 |
|---|---|---|
--to-json | 强制按 SAV→JSON 方向转换 | 文件扩展名异常时兜底 |
--from-json | 强制按 JSON→SAV 方向转换 | 同上,反向兜底 |
--output/-o | 自定义输出路径 | 不想覆盖默认命名时 |
--force/-f | 覆盖已有文件不再询问 | 脚本批量运行时避免卡在确认提示 |
--minify-json | 输出压缩后的 JSON | 供其他程序二次处理,加快读取 |
--convert-nan-to-null | 把 NaN/Inf 浮点值转成 null | 保证 JSON 合法性,但会丢失 Inf 信息 |
--custom-properties | 只解析指定的数据结构 | 大存档提速、按需解析 |
其中--custom-properties是最值得研究的参数,单独开一节细说。
五、大存档的提速秘诀:按需解析
一个完整Level.sav的 JSON 可能达到数 GB,处理时对内存和 CPU 都是考验。如果你只关心某一类数据,完全没必要把整个世界都解析出来。
--custom-properties接受一个逗号分隔的路径列表,路径来自paltypes.py中定义的属性映射。例如,只想看公会和角色数据:
palworld-save-tools Level.sav --to-json \ --custom-properties ".worldSaveData.GroupSaveDataMap,.worldSaveData.CharacterSaveParameterMap.Value.RawData"这条命令会跳过其余所有结构,只处理你点名的那几个,解析速度往往能提升一半以上,内存占用也大幅下降。这是个非常实用的思路:先把范围缩小,改完再整体转换回去。
与之搭配的还有两个小技巧:
- 大存档尽量用 64 位 Python,并在转换前关闭无关程序,给足内存余量;
- 如果 JSON 是给脚本或工具消费的,加上
--minify-json能明显加快读取。
六、常见翻车现场与对策
即便是熟练用户,也难免在几个老地方栽跟头。提前了解这些坑,能省下不少时间:
转换失败或文件损坏。先确认存档没被游戏进程占用,必要时用游戏自带的存档修复功能处理后重试。若依然失败,回到备份文件重新操作。
内存不足。存档越大,解析越吃内存。使用--custom-properties缩小范围是最直接的解法;也可以先把 Level.sav 移到 SSD 上,减少磁盘读写等待。
游戏读不了修改后的存档。九成是 JSON 语法出了问题——多一个逗号、少一个引号都会让转换结果失效。修改前先确认 JSON 校验通过,每次只改少量内容,出问题也好定位。
覆盖提示反复弹出。批量处理时加上--force,让脚本一口气跑完;单次操作时则保留确认提示,避免手滑覆盖重要文件。
数据"神秘失踪"。检查是否使用了--convert-nan-to-null——这个开关会把Inf/-Inf这类特殊浮点值转成 null,属于"有损"操作。不是必要场景尽量别开。
七、从手动改到自动化:批量处理与生态工具
当你要处理的存档不止一个时,手敲命令就太慢了。写一段简单的 Python 脚本,把"转换 → 修改 → 还原"串成流水线:
import subprocess save_files = ["save1/Level.sav", "save2/Level.sav", "save3/Level.sav"] for save_file in save_files: # 1. 转成 JSON subprocess.run(["palworld-save-tools", save_file, "--to-json", "--force"]) # 2. 在这里插入你的 JSON 修改逻辑 # 3. 转回 SAV subprocess.run(["palworld-save-tools", save_file + ".json", "--from-json", "--force"])如果你想省掉自己写逻辑的功夫,社区里已经有一批围绕 palworld-save-tools 构建的工具:
- PalEdit:图形化帕鲁编辑器,可视化调整帕鲁属性;
- palworld-host-save-fix:把联机存档迁移到专用服务器,处理玩家 ID 转换;
- palworld-server-tool:通过 RCON 和存档解析管理专用服务器;
- palworld-server-toolkit:一套杂项存档操作工具集。
这些工具各有所长,但底层都离不开"解析 → 修改 → 回写"这条主线,理解了本文的原理,你就能更好地驾驭它们。
八、一个值得信任的项目,背后有清晰的原则
最后聊聊这个项目本身的设计理念,它决定了你用它时能有多放心:
- 零外部依赖:脚本用 Python 标准库即可运行,不要求装任何第三方包(性能增强是可选项);
- 正确性优先:宁可慢一点,也要保证往返转换逐字节一致,这是所有修改操作的安全底线;
- 正在完善:项目路线图包括解析全部已知数据结构、优化 CPU 与内存占用。
模块分工也很清晰:archive.py负责存档读写,gvas.py处理引擎数据,palsav.py管压缩解压,paltypes.py定义类型映射,commands/convert.py是命令行入口,rawdata/目录下则是一系列针对具体结构的解析器。想深入研究的读者,从这里下手准没错。
结语:备份,然后开始你的第一次修改
现在,工具已经装好、命令已经记住、坑也提前排过了。回到开头那个周末——与其对着乱码发愁,不如动手把角色等级调一调,体验一次"数据在手"的掌控感。
给第一次动手的你三句叮嘱:
- 先备份,再谈修改;
- 小步走,一次只动一处,改完立刻验证游戏能否读取;
- 合理使用,单人游戏里自娱自乐,别在多人服务器上影响他人体验。
从今天的第一次转换开始,你会发现原本神秘的存档文件,不过是另一个可以放心摆弄的文本而已。
【免费下载链接】palworld-save-toolsTools for converting Palworld .sav files to JSON and back项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考