GGPK
Old: chuanhsing#2097 2024-07-20 07:37:20
New: chuanhsing#2097 2024-07-20 07:40:25
| Old | New | Differences | |
|---|---|---|---|
| 1 | - | # | |
| 1 | + | # GGPK | |
| 2 | 2 | ||
| 3 | - | There are 2 api sets: | |
| 4 | - | * POESESSID used in the website API is not officially supported. | |
| 5 | - | * [OAuth](https://www.pathofexile.com/developer/docs) apis are officially supported, but less functions. | |
| 3 | + | ## GGPK schema | |
| 6 | 4 | ||
| 7 | - | ## | |
| 5 | + | ### Record Structures | |
| 8 | 6 | ||
| 7 | + | ||
| 8 | + | ||
| 9 | + | ``` | |
| 10 | + | struct GGPK { | |
| 11 | + | uint32 Length; | |
| 12 | + | char[4] Tag; // ="GGPK" | |
| 13 | + | uint32 Version; | |
| 14 | + | GgpkEntry[2] Entries; | |
| 15 | + | } | |
| 16 | + | ||
| 17 | + | struct GgpkEntry { | |
| 18 | + | uint64 offset; | |
| 19 | + | } | |
| 20 | + | ``` | |
| 21 | + | ||
| 22 | + | ``` | |
| 23 | + | struct FREE { | |
| 24 | + | uint32 Length; | |
| 25 | + | char[4] Tag; // = "FREE" | |
| 26 | + | Byte[Length-8] Data; | |
| 27 | + | } | |
| 28 | + | ``` | |
| 29 | + | ||
| 30 | + | ``` | |
| 31 | + | struct PDIR { | |
| 32 | + | uint32 Length; | |
| 33 | + | char[4] Tag; // ="PDIR" | |
| 34 | + | uint32 NameLength; | |
| 35 | + | uint32 TotalEntries; | |
| 36 | + | byte[32] SHA256Hash; | |
| 37 | + | wchar_t[NameLength] Name; | |
| 38 | + | DirectoryEntry[TotalEntries]; | |
| 39 | + | } | |
| 40 | + | ||
| 41 | + | struct DirectoryEntry { | |
| 42 | + | int32 entryNameHash; | |
| 43 | + | uint64 offset; | |
| 44 | + | } | |
| 45 | + | ``` | |
| 46 | + | ||
| 47 | + | ``` | |
| 48 | + | struct FILE { | |
| 49 | + | uint32 Length; | |
| 50 | + | char[4] Tag; // ="FILE" | |
| 51 | + | uint32 NameLength; | |
| 52 | + | byte[32] SHA256Hash; | |
| 53 | + | wchar_t[NameLength] Name; | |
| 54 | + | byte[reminder] Data; | |
| 55 | + | } | |
| 56 | + | ``` | |
| 57 | + | ||
| 58 | + | <a href="https://i.imgur.com/VRBetTX.png" data-lightbox="panel"></a> | |
| 59 | + | ||
| 60 | + | ### Sample Tree | |
| 61 | + | <a href="https://i.imgur.com/EP7QRal.png" data-lightbox="panel"></a> | |
| 62 | + | ||
| 63 | + | ||
| 64 | + | ### Reference | |
| 9 | 65 | Site | Description | |
| 10 | 66 | - | - | |
| 11 | - | [ | |
| 12 | - | [ | |
| 13 | - | [ | |
| 67 | + | [Path of Go](https://github.com/oriath-net/pogo) | Golang tools for reading PoE data files | |
| 68 | + | [LibGGPK3](https://github.com/aianlinb/LibGGPK3) | Windows GUI tool to view Content.ggpk and export | |
| 69 | + | [libbun](https://github.com/zao/ooz) | Ooz shared library (libooz.dll/liblibooz.so) for Oodle decompression and Bun library/tool with a C API suitable for FFI/interop - reads and extracts bundle contents from a Steam game directory or a PC Standalone GGPK. Tested on x64 Windows and Debian. <br>Original Ooz code by powzix/rarten, adapted into a library. | |
| 14 | 70 | ||
| 71 | + | ## Bundle schema | |
| 15 | 72 | ||
| 16 | - | ## APIs | |
| 73 | + | [Bundle schema](Bundle_schema) | |
| 74 | + | ||
| 75 | + | ## Dat schema | |
| 76 | + | ||
| 77 | + | ``` | |
| 78 | + | struct DAT { | |
| 79 | + | uint32 rowCounts; | |
| 80 | + | Data[rowCounts] rows; | |
| 81 | + | REFERENCE refer; | |
| 82 | + | } | |
| 83 | + | ||
| 84 | + | struct Data { | |
| 85 | + | blob row; | |
| 86 | + | } | |
| 87 | + | ||
| 88 | + | struct REFERENCE { | |
| 89 | + | char[8]; // 0xBB * 8 | |
| 90 | + | blob reference; | |
| 91 | + | } | |
| 92 | + | ``` | |
| 93 | + | ||
| 94 | + | ### Data Export | |
| 95 | + | ||
| 96 | + | The game data does not have any official API, and only possible data can be analyzed from the game files. | |
| 97 | + | ||
| 98 | + | Almost all data is stored in .dat64 files within Content.ggpk. But they only have data, no headers. You can start with the .dat64 format, the [PoE dat schema](https://github.com/poe-tool-dev/dat-schema) project is the latest format. Or try to parse the .dat format from [PoE Dat Viewer](https://snosme.github.io/poe-dat-viewer/) yourself. [RePoE](https://github.com/lvlvllvlvllvlvl/RePoE) collects many common and processed .dat files and exports them to .json format. | |
| 99 | + | ||
| 100 | + | ### Reference | |
| 17 | 101 | Site | Description | |
| 18 | 102 | - | - | |
| 19 | - | [PoE API swagger](https://poedb.tw/us/poe-api) | PoEDB collections of POESESSID and OAuth API | |
| 20 | - | [Official Website API](https://www.pathofexile.com/developer/docs) | OAuth API endpoints of Path of Exile | |
| 21 | - | [POESESSID](POESESSID) | how to get your POESESSID | |
| 22 | - | [API:Passive_Skill_Tree](API%3APassive_Skill_Tree) | |
| 23 | - | [API:OAuth](API%3AOAuth) | how to use OAuth | |
| 24 | - | [API:Ladder](API%3ALadder) | |
| 25 | - | [API:Trade](API%3ATrade) | Official Trade API (POESESSID) | |
| 26 | - | [API:Public_Stashes](API%3APublic_Stashes) | OAuth Public Stashes API | |
| 27 | - | [GGPK](GGPK) | Content.ggpk file format | |
| 28 | - | [Atlas Tree Export](https://github.com/grindinggear/skilltree-export/tree/atlas) | |
| 103 | + | [PyPoE](https://github.com/Project-Path-of-Exile-Wiki/PyPoE) | Collection of Python Tools for Path of Exile, mostly used by wiki | |
| 104 | + | [RePoE](https://github.com/lvlvllvlvllvlvl/RePoE) | Repository of Path of Exile resources for tool developers. | |
| 105 | + | [Poe Dat Viewer](https://snosme.github.io/poe-dat-viewer/) | Web-base Poe Dat Viewer | |
| 106 | + | [PoE dat schema](https://github.com/poe-tool-dev/dat-schema) | Source of truth schema for dat files. | |
| 107 | + | [Path Of Building Fork schema](https://github.com/PathOfBuildingCommunity/PathOfBuilding/blob/dev/src/Export/spec.lua) | Source of Path Of Building Fork schema | |
| 29 | 108 | ||
| 30 | - | ## Path Of Building Fork schema | |
| 31 | - | ||
| 32 | - | Site | Description | |
| 33 | - | - | - | |
| 34 | - | [Pastebin](Pastebin) | |
| 35 | - | [Pobbin](Pobbin) | |
| 109 | + | ### PyPoe stable.py to spec.json | |
| 110 | + | ``` | |
| 111 | + | from PyPoE.poe.file.specification.data import stable | |
| 112 | + | from json import dump | |
| 113 | + | with open('D:/spec.json', 'w') as f: | |
| 114 | + | dump(stable.specification.as_dict(), f) | |
| 115 | + | ``` |