# 04. Nghiên cứu Kiến trúc Dữ liệu Game Content.ggpk (Content GGPK Architecture Research)

> **Tệp Nguồn**: `C:\Program Files (x86)\Grinding Gear Games\Path of Exile 2\Content.ggpk`  
> **Dung lượng**: 161,927,115,259 bytes (~150.8 GB)  
> **Mục đích**: Khai thác dữ liệu tĩnh ngoại tuyến (Offline Game Data Extraction) về bảng chỉ số, quái vật, kỹ năng và địa hình.

---

## 1. Cấu trúc Tổng thể của Kho Dữ liệu GGPK trong POE2

Tệp `Content.ggpk` là kho lưu trữ trung tâm của toàn bộ trò chơi Path of Exile 2. Trong phiên bản 0.5.5, Grinding Gear Games đã tối ưu hóa định dạng GGPK sang hệ thống **Bundles2**:

```mermaid
graph TD
    GGPK["Content.ggpk (150.8 GB)"]
    GGPK_Root["GGPK Root Header (0x4B504747 - 'GGPK')"]
    IndexBin["Index.bin / HashCache.dat (Danh bạ Tệp)"]
    Bundles2["Phân vùng Bundles2 (Khối Nén Đa Tệp)"]
    
    DataTables["Bảng Dữ liệu .dat64 (Schemas)"]
    Meshes["Mô hình 3D & Animation (.sm / .ast)"]
    Shaders["Compiled Shader Bytecode"]
    Audio["FMOD Sound Banks (.bank)"]

    GGPK --> GGPK_Root
    GGPK_Root --> IndexBin
    GGPK_Root --> Bundles2
    Bundles2 --> DataTables
    Bundles2 --> Meshes
    Bundles2 --> Shaders
    Bundles2 --> Audio
```

### Đặc tính Kỹ thuật (đo trên client 10/09/2026):
1. **Thuật toán Nén Bundles2**: chunk magic `8C 0C` = **Oodle Leviathan** (encoder=12), block 256 KiB. Client **không** ship `oo2core*.dll` — Oodle gắn tĩnh trong `PathOfExile.exe`.
2. **Hệ thống Bundles2**: payload nằm trong `Bundles2/` (42 entry ở root bundle dir). Danh bạ logic là `Bundles2/_.index.bin` (MurmurHash64A seed `0x1337b33f`), không phải `HashCache.dat`.
3. **`HashCache.dat` (2,846 bytes, 33 bản ghi)**: SHA-256 các file *rời* cạnh exe (`PathOfExile.exe`, DLL launcher) — **không** phải bảng `.datc64` và không phải chữ ký bundle.

---

## 2. Các Bảng Dữ liệu Trọng yếu (.dat64 Schemas)

Toàn bộ logic toán học, thuộc tính vật phẩm, cây kỹ năng và quái vật được lưu trữ dạng bảng nhị phân **`.datc64`** (không phải `.dat64` đời PoE1) bên trong bundle `Bundles2/Folders/data.dat.bundle.bin`:

| Tên bảng `.datc64` | Nội dung | Ứng dụng |
| :--- | :--- | :--- |
| **`BaseItemTypes`** | Trang bị gốc, kích thước ô, drop level, ItemClass. | Loot filter / định danh. |
| **`Mods`** | Affix, domain, level. | Định giá loot. |
| **`SkillGems`** | Gem → BaseItemType, % Str/Dex/Int. | Combo / HUD. |
| **`MonsterVarieties`** | Id, Name, MovementSpeed, PoiseThreshold. | Nhận diện quái. |
| **`WorldAreas`** | Act, waypoint, town, connections. | Điều hướng. |

---

## 3. Chiến lược Trích xuất Ngoại tuyến (Offline Data Mining)

Thay vì liên tục quét bộ nhớ RAM của game để tìm hiểu thông số quái và vật phẩm:
1. **Trích xuất 1 Lần (One-Time Extraction)**:
   - CLI read-only: `python tools/extract_ggpk_to_db.py` (`src/assistant_tool/ggpk_extract/`).
   - Đi cây `GGPK/PDIR/FILE`, giải nén Bundles2 Oodle Leviathan (`8C 0C`, block 256 KiB) khi có `libooz.dll` / `oo2core*.dll`, parse `.datc64` theo `schema.min.json` (`validFor` 2|3).
   - Ghi SQLite WAL `assets/game_data/poe2_ggpk.db`. **Không** sửa `Content.ggpk`.
2. **Hiệu quả Đạt được**:
   - Tra cứu item/area/mod từ SQLite (< 0.1ms) sau khi đã extract; Core 120 Hz không đụng database.
