cheahjs / palworld-save-tools

Tools for converting Palworld .sav files to JSON and back
MIT License
798 stars 71 forks source link

v0.3.7 update bugged the tools. #187

Open deafdudecomputers opened 2 months ago

deafdudecomputers commented 2 months ago

Traceback (most recent call last): File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\convert.py", line 145, in main() File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\convert.py", line 65, in main convert_sav_to_json( File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\convert.py", line 105, in convert_sav_to_json gvas_file = GvasFile.read( ^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\gvas.py", line 131, in read gvas_file.properties = reader.properties_until_end() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 386, in properties_until_end properties[name] = self.property(type_name, size, f"{path}.{name}") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 399, in property value = self.struct(path) ^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 515, in struct value = self.struct_value(struct_type, path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 542, in struct_value return self.properties_until_end(path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 386, in properties_until_end properties[name] = self.property(type_name, size, f"{path}.{name}") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 477, in property value = self.prop_value(value_type, value_struct_type, value_path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 499, in prop_value return self.struct_value(struct_type_name, path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 542, in struct_value return self.properties_until_end(path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 386, in properties_until_end properties[name] = self.property(type_name, size, f"{path}.{name}") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 396, in property value = self.custom_properties[path][0](self, type_name, size, path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\rawdata\character.py", line 13, in decode value["value"] = decode_bytes(reader, char_bytes) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\rawdata\character.py", line 22, in decode_bytes "object": reader.properties_until_end(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 386, in properties_until_end properties[name] = self.property(type_name, size, f"{path}.{name}") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 399, in property value = self.struct(path) ^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 515, in struct value = self.struct_value(struct_type, path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 542, in struct_value return self.properties_until_end(path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 386, in properties_until_end properties[name] = self.property(type_name, size, f"{path}.{name}") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Desktop\PalworldSaveToolsMaster\PalworldSaveTools.v0.7.3\palworld_save_tools\archive.py", line 493, in property raise Exception(f"Unknown type: {type_name} ({path})") Exception: Unknown type: ByteProperty (.SaveParameter.Rank)

Gives me an error after getting the Level.sav from updated server after the update v0.3.7. Any suggestions/inputs on how to fix this?

Choi-Jungwoo commented 2 months ago

AND Exception: Unknown type: ByteProperty (.SaveParameter.Talent_HP)

deafdudecomputers commented 2 months ago

TestSavev0.3.7.zip Thought I should attach my updated save from my server after updating to v0.3.7 just in case to help you debug and finding the potential fix.

deafdudecomputers commented 2 months ago

Thanks to Choi-Jungwoo above, the tool has a temporary solution.

palworld_save_tools.zip

Both archive.py and item_container_slots.py has been updated from v0.23.1 version of tool.

tylercamp commented 2 months ago

I've compared values between IV stats + character levels and found the original values for the fields are stored in the upper 8 bits of the uint16, e.g.:

512 -> 2
4608 -> 18
5120 -> 20
7168 -> 28
9216 -> 36

(New vals on left, original on right, right values are the same as left >> 8) (Less like uint16, more like uint8 (value) and another uint8 (padding?))

unknown_str always seems to be "None" for my sample

MuchDevSuchCode commented 2 months ago

Thanks to Choi-Jungwoo above, the tool has a temporary solution.

palworld_save_tools.zip

Both archive.py and item_container_slots.py has been updated from v0.23.1 version of tool.

Are you saying that the code in that .zip file can properly convert the Level.sav file to JSON?

deafdudecomputers commented 2 months ago

Thanks to Choi-Jungwoo above, the tool has a temporary solution. palworld_save_tools.zip Both archive.py and item_container_slots.py has been updated from v0.23.1 version of tool.

Are you saying that the code in that .zip file can properly convert the Level.sav file to JSON?

As far as I am concerned, and on multiple saves, yes - it should.

I also used it for converting from local to dedicated server, and via versa, seems to be working without any issues. As far as I know.

deafdudecomputers commented 2 months ago

The only issue I can see, is if we try to use this version of tool with older saves that aren't updated on/after v0.3.7 patch, it'll error out. Besides that, the saves on/after v0.3.7 patch will work as intended.

bmwdeejay commented 2 months ago

Checking if Python is installed as python3 INFO: Could not find files for the given pattern(s). Checking if Python is installed as python C:\Users\Administrator\AppData\Local\Programs\Python\Python312\python.exe Found Python at python Python version: Python 3.12.6 Converting C:\TCAFiles\Users\bobasaurs\14\Pal\Saved\SaveGames\0\B378F4FE4EFAF82D90BE9399231CD6A0\Level.sav to JSON, saving to C:\TCAFiles\Users\bobasaurs\14\Pal\Saved\SaveGames\0\B378F4FE4EFAF82D90BE9399231CD6A0\Level.sav.json Decompressing sav file Loading GVAS file Traceback (most recent call last): File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\convert.py", line 164, in main() File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\convert.py", line 75, in main convert_sav_to_json( File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\convert.py", line 118, in convert_sav_to_json gvas_file = GvasFile.read( ^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\gvas.py", line 131, in read gvas_file.properties = reader.properties_until_end() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 386, in properties_until_end properties[name] = self.property(type_name, size, f"{path}.{name}") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 399, in property value = self.struct(path) ^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 515, in struct value = self.struct_value(struct_type, path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 542, in struct_value return self.properties_until_end(path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 386, in properties_until_end properties[name] = self.property(type_name, size, f"{path}.{name}") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 477, in property value = self.prop_value(value_type, value_struct_type, value_path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 499, in prop_value return self.struct_value(struct_type_name, path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 542, in struct_value return self.properties_until_end(path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 386, in properties_until_end properties[name] = self.property(type_name, size, f"{path}.{name}") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 396, in property value = self.custom_properties[path][0](self, type_name, size, path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\rawdata\character.py", line 13, in decode value["value"] = decode_bytes(reader, char_bytes) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\rawdata\character.py", line 22, in decode_bytes "object": reader.properties_until_end(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 386, in properties_until_end properties[name] = self.property(type_name, size, f"{path}.{name}") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 399, in property value = self.struct(path) ^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 515, in struct value = self.struct_value(struct_type, path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 542, in struct_value return self.properties_until_end(path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 386, in properties_until_end properties[name] = self.property(type_name, size, f"{path}.{name}") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\Downloads\palworld-save-tools-windows-v0.23.1\palworld_save_tools\archive.py", line 493, in property raise Exception(f"Unknown type: {type_name} ({path})") Exception: Unknown type: ByteProperty (.SaveParameter.Level) Press any key to continue . . .

fresh world save today gives this error ?

MuchDevSuchCode commented 2 months ago

Thanks to Choi-Jungwoo above, the tool has a temporary solution. palworld_save_tools.zip Both archive.py and item_container_slots.py has been updated from v0.23.1 version of tool.

Are you saying that the code in that .zip file can properly convert the Level.sav file to JSON?

As far as I am concerned, and on multiple saves, yes - it should.

I also used it for converting from local to dedicated server, and via versa, seems to be working without any issues. As far as I know.

Would you mind sharing an example of the command syntax you're using? I cant seem to get it to work no matter what.

deafdudecomputers commented 2 months ago

Thanks to Choi-Jungwoo above, the tool has a temporary solution. palworld_save_tools.zip Both archive.py and item_container_slots.py has been updated from v0.23.1 version of tool.

Are you saying that the code in that .zip file can properly convert the Level.sav file to JSON?

As far as I am concerned, and on multiple saves, yes - it should. I also used it for converting from local to dedicated server, and via versa, seems to be working without any issues. As far as I know.

Would you mind sharing an example of the command syntax you're using? I cant seem to get it to work no matter what.

I use my own script batch to launch convert.py. I have a repo of it if you want to check.

Basically, it's just "python convert.py Level.sav" for me.

MuchDevSuchCode commented 2 months ago

Thanks to Choi-Jungwoo above, the tool has a temporary solution. palworld_save_tools.zip Both archive.py and item_container_slots.py has been updated from v0.23.1 version of tool.

Are you saying that the code in that .zip file can properly convert the Level.sav file to JSON?

As far as I am concerned, and on multiple saves, yes - it should. I also used it for converting from local to dedicated server, and via versa, seems to be working without any issues. As far as I know.

Would you mind sharing an example of the command syntax you're using? I cant seem to get it to work no matter what.

I use my own script batch to launch convert.py. I have a repo of it if you want to check.

Basically, it's just "python convert.py Level.sav" for me.

Yes, please share your repo. Thanks!

deafdudecomputers commented 2 months ago

https://github.com/deafdudecomputers/PalWorldSaveTools This is my repo.

MuchDevSuchCode commented 2 months ago

https://github.com/deafdudecomputers/PalWorldSaveTools This is my repo.

Hilarious! Your repo was the one I actually used for a long while now. I only found this one after the update broke your tool. I love your work, thanks for doing it.

deafdudecomputers commented 2 months ago

Nice to hear that, lol. Glad you like it. :)

HaplessIdiot commented 2 months ago

Thanks to Choi-Jungwoo above, the tool has a temporary solution.

palworld_save_tools.zip

Both archive.py and item_container_slots.py has been updated from v0.23.1 version of tool.

THANKS SO MUCH! I needed this to move my server from windows to linux the GUIDs are fucked and the new save format is ass and doesnt convert without this patched version