PyPoE 101: Updating specifications for new leagues - Project-Path-of-Exile-Wiki/PyPoE GitHub Wiki

Preparation

When the Contents.ggpk are live, you can use snosme's dat viewer to read it from the update servers.

  • Put the patch version accordingly and click import

  • In the left side explorer you will see all the game files. The subfolders are the localized game files.

Updating specifications

When exporting data, you will see an error looking like this:

This means that our specifications don't match the tables in the game files. In this case it was the incursion rooms, so we browse the IncursionRooms.dat in the dat viewer, which displays the table:

Then we need to go into PyPoE\poe\file\specification\data\stable.py and find 'IncursionRooms.dat': File() which contains the following fields:

'IncursionRooms.dat': File(
        fields=(
            Field(
                name='Id',
                type='ref|string',
                unique=True,
            ),
            Field(
                name='Name',
                type='ref|string',
            ),
            Field(
                name='Tier',
                type='int',
            ),
            Field(
                name='MinLevel',
                type='int',
            ),
            Field(
                name='RoomUpgrade_IncursionRoomsKey',
                type='ref|generic',
                key='IncursionRooms.dat',
            ),
            Field(
                name='ModsKey',
                type='ulong',
                key='Mods.dat',
            ),
            Field(
                name='PresentARMFile',
                type='ref|string',
                file_path=True,
                file_ext='.arm',
            ),
            Field(
                name='IntId',
                type='int',
                unique=True,
            ),
            Field(
                name='IncursionArchitectKey',
                type='ulong',
                key='IncursionArchitect.dat',
            ),
            Field(
                name='PastARMFile',
                type='ref|string',
                file_path=True,
                file_ext='.arm',
            ),
            Field(
                name='TSIFile',
                type='ref|string',
                file_path=True,
                file_ext='.tsi',
            ),
            Field(
                name='UIIcon',
                type='ref|string',
            ),
            Field(
                name='FlavourText',
                type='ref|string',
            ),
            Field(
                name='Description',
                type='ref|string',
            ),
            Field(
                name='AchievementItemsKeys',
                type='ref|list|ulong',
                key='AchievementItems.dat',
            ),
            Field(
                name='Unknown0',
                type='int',
            ),
            Field(
                name='Unknown1',
                type='int',
            ),
            Field(
                name='RoomUpgradeFrom_IncursionRoomsKey',
                type='ref|generic',
                key='IncursionRooms.dat',
            ),
        ),
    ),

And according to the dat viewer, there are 8 bytes of unidentified data at the end of the fields, so we add them accordingly:

'IncursionRooms.dat': File(
        fields=(
            Field(
                name='Id',
                type='ref|string',
                unique=True,
            ),
            Field(
                name='Name',
                type='ref|string',
            ),
            Field(
                name='Tier',
                type='int',
            ),
            Field(
                name='MinLevel',
                type='int',
            ),
            Field(
                name='RoomUpgrade_IncursionRoomsKey',
                type='ref|generic',
                key='IncursionRooms.dat',
            ),
            Field(
                name='ModsKey',
                type='ulong',
                key='Mods.dat',
            ),
            Field(
                name='PresentARMFile',
                type='ref|string',
                file_path=True,
                file_ext='.arm',
            ),
            Field(
                name='IntId',
                type='int',
                unique=True,
            ),
            Field(
                name='IncursionArchitectKey',
                type='ulong',
                key='IncursionArchitect.dat',
            ),
            Field(
                name='PastARMFile',
                type='ref|string',
                file_path=True,
                file_ext='.arm',
            ),
            Field(
                name='TSIFile',
                type='ref|string',
                file_path=True,
                file_ext='.tsi',
            ),
            Field(
                name='UIIcon',
                type='ref|string',
            ),
            Field(
                name='FlavourText',
                type='ref|string',
            ),
            Field(
                name='Description',
                type='ref|string',
            ),
            Field(
                name='AchievementItemsKeys',
                type='ref|list|ulong',
                key='AchievementItems.dat',
            ),
            Field(
                name='Unknown0',
                type='int',
            ),
            Field(
                name='Unknown1',
                type='int',
            ),
            Field(
                name='RoomUpgradeFrom_IncursionRoomsKey',
                type='ref|generic',
                key='IncursionRooms.dat',
            ),
            Field(
                name='Unknown2',
                type='byte',
            ),
            Field(
                name='Unknown3',
                type='byte',
            ),
            Field(
                name='Unknown4',
                type='byte',
            ),
            Field(
                name='Unknown5',
                type='byte',
            ),
            Field(
                name='Unknown6',
                type='byte',
            ),
            Field(
                name='Unknown7',
                type='byte',
            ),
            Field(
                name='Unknown8',
                type='byte',
            ),
            Field(
                name='Unknown9',
                type='byte',
            ),
        ),
    ),

You should be good to go.

Note

Other errors might show up if other related data changes.

Keep in mind that new columns might be added in between existing ones or old ones removed. They need to be in order and casted correctly.


Credits: snosme - dat viewer