Palworld存档数据逆向工程:Python驱动的二进制存档转换架构解析

📅 2026/7/13 12:32:32
Palworld存档数据逆向工程:Python驱动的二进制存档转换架构解析
Palworld存档数据逆向工程Python驱动的二进制存档转换架构解析【免费下载链接】palworld-save-toolsTools for converting Palworld .sav files to JSON and back项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-toolsPalworld存档工具是一个基于Python的专用工具集专注于将Palworld游戏的二进制.sav存档文件与人类可读的JSON格式进行双向转换。该项目通过逆向工程Unreal Engine的存档格式实现了对Palworld游戏数据结构的深度解析支持包括角色、物品容器、建筑对象、植被网格等在内的完整游戏数据模型转换。该工具的核心价值在于为游戏数据分析、存档修改、服务器管理和自动化处理提供了可靠的技术基础。核心概念与架构解析Unreal Engine存档格式逆向工程Palworld使用Unreal Engine的GVASGeneric Virtual Asset Storage格式存储游戏数据这是一种复杂的二进制序列化格式。工具的核心架构围绕以下关键技术组件构建GVAS文件结构解析# 核心数据结构定义 class GvasHeader: def __init__(self, save_game_version: int, package_version: int, ...): self.save_game_version save_game_version self.package_version package_version self.engine_version engine_version self.custom_version_format custom_version_format self.custom_versions custom_versions self.save_game_class_name save_game_class_name压缩存档格式识别# 存档文件头验证机制 MAGIC_BYTES bPlZ def decompress_sav_to_gvas(data: bytes) - tuple[bytes, int]: uncompressed_len int.from_bytes(data[0:4], byteorderlittle) compressed_len int.from_bytes(data[4:8], byteorderlittle) magic_bytes data[8:11] save_type data[11] if magic_bytes ! MAGIC_BYTES: raise Exception( fnot a compressed Palworld save, found {magic_bytes!r} instead of {MAGIC_BYTES!r} )模块化解析架构项目采用分层解析架构将不同的游戏数据类型分配到专门的模块中处理模块名称处理的数据类型核心功能character.py角色参数数据解析玩家和帕鲁的角色属性item_container.py物品容器数据处理物品存储和物品槽位map_object.py地图对象数据解析建筑和交互对象base_camp.py基地数据处理基地结构和模块foliage_model.py植被模型数据解析植被网格和实例FArchiveReader/Writer架构class FArchiveReader: def __init__(self, data, type_hints: dict[str, str] {}, ...): self.data data self.type_hints type_hints self.custom_properties custom_properties self.debug debug self.allow_nan allow_nan def properties_until_end(self, path: str ) - dict[str, Any]: 读取直到数据结束的所有属性 properties {} while not self.eof(): property_data self.property(, 0, path) if property_data is None: break properties[property_data[name]] property_data[value] return properties关键挑战与应对策略二进制数据格式兼容性Palworld的存档格式随着游戏版本更新而不断演进工具需要处理多种压缩类型和数据结构变体压缩类型支持# 支持的压缩类型枚举 SAVE_TYPE_SINGLE_ZLIB 0x31 # 单层zlib压缩 SAVE_TYPE_DOUBLE_ZLIB 0x32 # 双层zlib压缩 # 压缩数据处理流程 def decompress_sav_to_gvas(data: bytes) - tuple[bytes, int]: # ... 文件头验证 ... if save_type 0x31: # 单层压缩处理 uncompressed_data zlib.decompress(data[data_start_offset:]) elif save_type 0x32: # 双层压缩处理 uncompressed_data zlib.decompress(data[data_start_offset:]) uncompressed_data zlib.decompress(uncompressed_data)数据类型映射系统# 类型提示系统确保数据正确解析 PALWORLD_TYPE_HINTS { .worldSaveData.CharacterContainerSaveData.Key: StructProperty, .worldSaveData.CharacterSaveParameterMap.Key: StructProperty, .worldSaveData.CharacterSaveParameterMap.Value: StructProperty, .worldSaveData.FoliageGridSaveDataMap.Key: StructProperty, # ... 更多类型映射 ... }内存与性能优化处理大型存档文件时面临的内存和性能挑战# 选择性解析优化 def convert_sav_to_json( filename, output_path, forceFalse, minifyFalse, allow_nanTrue, custom_properties_keys[all], # 支持选择性解析 ): 转换SAV到JSON支持自定义属性过滤 custom_properties {} if custom_properties_keys ! [all]: for key in custom_properties_keys: if key in PALWORLD_CUSTOM_PROPERTIES: custom_properties[key] PALWORLD_CUSTOM_PROPERTIES[key]性能优化策略增量解析支持仅解析特定数据类型减少内存占用JSON压缩提供--minify-json选项减少输出文件大小类型缓存复用已解析的类型定义提高解析速度实践指南与配置优化命令行工具深度使用工具提供丰富的命令行选项以适应不同使用场景# 基本转换命令 python convert.py Level.sav # 高级转换选项 python convert.py Level.sav \ --to-json \ --output custom_output.json \ --minify-json \ --custom-properties .worldSaveData.GroupSaveDataMap,.worldSaveData.CharacterSaveParameterMap # JSON转回SAV python convert.py Level.sav.json --from-json --force命令行参数详解参数功能描述使用场景--to-json强制转换为JSON格式处理非标准文件扩展名--from-json强制转换为SAV格式反向转换验证--custom-properties指定解析的数据路径性能优化减少内存使用--minify-json压缩JSON输出减少文件大小提高处理速度--force强制覆盖输出文件自动化脚本集成存档文件识别与验证正确处理存档文件的关键在于准确识别文件类型# 文件类型验证流程 def validate_sav_file(data: bytes) - bool: 验证是否为有效的Palworld压缩存档 try: # 检查最小长度 if len(data) 12: return False # 验证魔数 magic_bytes data[8:11] if magic_bytes ! bPlZ: # 检查CNK变体 if magic_bytes bCNK and len(data) 24: magic_bytes data[20:23] if magic_bytes ! bPlZ: return False else: return False # 验证保存类型 save_type data[11] if magic_bytes bPlZ else data[23] return save_type in [0x31, 0x32] except Exception: return False高级特性与扩展应用自定义属性解析系统工具支持通过扩展系统添加新的数据类型解析器# 自定义属性注册机制 PALWORLD_CUSTOM_PROPERTIES { .worldSaveData.GroupSaveDataMap: (group.decode, group.encode), .worldSaveData.CharacterSaveParameterMap.Value.RawData: ( character.decode, character.encode, ), .worldSaveData.ItemContainerSaveData.Value.RawData: ( item_container.decode, item_container.encode, ), # ... 更多自定义解析器 ... } # 扩展新数据类型 def register_custom_property( path: str, decoder: Callable[[FArchiveReader, str, int, str], dict[str, Any]], encoder: Callable[[FArchiveWriter, str, dict[str, Any]], int] ): 注册自定义属性解析器 PALWORLD_CUSTOM_PROPERTIES[path] (decoder, encoder)游戏数据结构深度解析工具支持解析Palworld的复杂游戏数据结构角色数据解析def decode_character_data( reader: FArchiveReader, type_name: str, size: int, path: str ) - dict[str, Any]: 解析角色参数数据 properties reader.properties_until_end(path) # 提取关键角色属性 character_data { instance_id: properties.get(InstanceId), character_id: properties.get(CharacterID), gender: properties.get(Gender), equip_item_info: properties.get(EquipItemContainerInfo), status_point: properties.get(StatusPoint), pal_skills: properties.get(PalSkills), worker_parameter: properties.get(WorkerParameter), character_parameter: properties.get(CharacterParameter), } return character_data物品容器解析def decode_item_container( reader: FArchiveReader, type_name: str, size: int, path: str ) - dict[str, Any]: 解析物品容器数据 container_data {} # 读取容器元数据 container_data[slot_count] reader.u32() container_data[items] [] # 解析每个物品槽位 for _ in range(container_data[slot_count]): item_data { item_id: reader.fstring(), stack_count: reader.u32(), durability: reader.float(), additional_data: reader.properties_until_end() } container_data[items].append(item_data) return container_data与其他工具的集成方案工具设计考虑了与其他Palworld相关项目的集成# 作为库使用的示例 from palworld_save_tools import GvasFile, decompress_sav_to_gvas class PalworldSaveEditor: def __init__(self, save_path: str): with open(save_path, rb) as f: data f.read() # 解压并解析存档 gvas_data, save_type decompress_sav_to_gvas(data) self.gvas GvasFile.read(gvas_data) def modify_character_stats(self, character_id: str, new_stats: dict): 修改角色属性 characters self.gvas.properties[worldSaveData][CharacterSaveParameterMap] for char in characters.values(): if char[CharacterID][value] character_id: char[StatusPoint][value] new_stats break def save(self, output_path: str): 保存修改后的存档 gvas_bytes self.gvas.write() compressed_data compress_gvas_to_sav(gvas_bytes, self.save_type) with open(output_path, wb) as f: f.write(compressed_data)总结与最佳实践建议技术架构优势总结Palworld存档工具的技术架构体现了以下几个关键优势无依赖设计核心功能仅依赖Python标准库确保部署的简便性和兼容性双向转换保证SAV→JSON→SAV转换过程保证数据完整性实现无损转换模块化扩展通过自定义属性系统支持新数据类型的灵活扩展性能优化支持选择性解析和JSON压缩适应不同规模的数据处理需求生产环境部署建议内存管理策略# 处理大型存档的内存优化模式 def process_large_save(save_path: str, output_path: str): 处理大型存档文件的优化模式 # 仅解析必要的数据类型 custom_properties [ .worldSaveData.GroupSaveDataMap, .worldSaveData.CharacterSaveParameterMap.Value.RawData ] # 使用流式处理 with open(save_path, rb) as f: data f.read() # 启用JSON压缩 convert_sav_to_json( save_path, output_path, custom_properties_keyscustom_properties, minifyTrue, allow_nanFalse )错误处理最佳实践def safe_save_conversion(input_path: str, output_path: str) - bool: 安全的存档转换包装器 try: # 验证文件类型 with open(input_path, rb) as f: header f.read(24) if not validate_sav_file(header): print(f错误{input_path} 不是有效的Palworld存档文件) return False # 执行转换 convert_sav_to_json(input_path, output_path, forceTrue) return True except Exception as e: print(f转换失败{str(e)}) return False未来发展方向性能优化实现增量解析和流式处理支持超大型存档文件版本兼容性持续跟踪Palworld游戏更新保持格式兼容性API扩展提供更丰富的编程接口支持更复杂的存档操作社区集成与Palworld服务器管理工具和存档编辑器深度集成通过深入理解Palworld存档工具的技术架构和使用模式开发者和高级用户可以在游戏数据分析、存档修改、服务器管理等场景中充分发挥其潜力构建更强大的Palworld生态工具链。【免费下载链接】palworld-save-toolsTools for converting Palworld .sav files to JSON and back项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考