幻兽帕鲁存档编辑实战:palworld-save-tools 让 .sav 与 JSON 自由互转

幻兽帕鲁存档编辑实战: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/目录下则是一系列针对具体结构的解析器。想深入研究的读者,从这里下手准没错。

结语:备份,然后开始你的第一次修改

现在,工具已经装好、命令已经记住、坑也提前排过了。回到开头那个周末——与其对着乱码发愁,不如动手把角色等级调一调,体验一次"数据在手"的掌控感。

给第一次动手的你三句叮嘱:

  1. 先备份,再谈修改;
  2. 小步走,一次只动一处,改完立刻验证游戏能否读取;
  3. 合理使用,单人游戏里自娱自乐,别在多人服务器上影响他人体验。

从今天的第一次转换开始,你会发现原本神秘的存档文件,不过是另一个可以放心摆弄的文本而已。

【免费下载链接】palworld-save-toolsTools for converting Palworld .sav files to JSON and back项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools

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