Skip to content

GuildExtraSaveDataMap.Value.Expedition.RawData (post-2026.7 saves) breaks parsers that keep guild-map decoding enabled #213

Description

@homuraLan

Issue draft: GuildExtraSaveDataMap.Value.Expedition.RawData breaks parsers that keep guild-map parsing enabled

Repo: EternalWraith/PalEdit
Title: GuildExtraSaveDataMap.Value.Expedition.RawData (post-2026.7 saves) breaks third-party parsers that keep guild-map decoding enabled

Summary

After the Palworld update in late July 2026, Level.sav saves gained a new
field inside each GuildExtraSaveDataMap entry: Expedition (with an
Expedition.RawData ArrayProperty payload).

PalEdit's MAIN_SKIP_PROPERTIES skips the entire
.worldSaveData.GuildExtraSaveDataMap as an opaque blob, so this never
surfaces in PalEdit itself. However, third-party tools that need to decode
guild chest data (e.g. server-side guild-chest capacity mods that read
GuildItemStorage.RawDatacontainer_id) keep the guild map enabled and
crash while decoding the new Expedition.RawData field:

UnicodeDecodeError / Exception: Error decoding utf-16-le string of length ...

Root cause

Expedition.RawData is an ArrayProperty whose element structs are not
covered by the vendored palworld_save_tools custom-property decoders
(guild_item_storage.decode / guild_lab.decode handle GuildItemStorage
and Lab but not Expedition), so the generic decoder walks into unknown
nested structs and misaligns the byte cursor.

Suggested fix

Add a custom-property entry so downstream consumers can skip just the
Expedition blob while still decoding the rest of the guild map:

".worldSaveData.GuildExtraSaveDataMap.Value.Expedition.RawData": (
    skip_decode,
    skip_encode,
),

Using a skip_decode/skip_encode pair (read header metadata + raw payload,
write back verbatim) round-trips byte-identically and keeps
GuildItemStorage/Lab/container_id decoding intact. Verified locally:
save parses, all guild chest entries report correct SlotNum, and the save
re-serializes without the skipped field being modified.

Additional note

The same drift guard applies to other post-2026.7 top-level fields
(OilrigSaveData, SupplySaveData, RandomizerSaveData,
InvaderDeclarationSaveData, FixedWeaponDestroySaveData) — a documented
"skip list for fields added after the parser freeze" would help any tool that
mirrors PalEdit's MAIN_SKIP_PROPERTIES approach while keeping selective
decoding enabled.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions