catrenelle/PalDex
GitHub: catrenelle/PalDex
PalDex 是一款直接读取 Palworld 存档和游戏资源的自托管实时地图,为专用服务器提供玩家追踪、收集品进度和世界状态可视化。
Stars: 1 | Forks: 0
# PalDex
一个为 Palworld 专用服务器设计的实时自托管地图 —— 玩家位置、收集品、
Boss 以及世界状态,所有数据均直接读取自服务器自身的存档文件
和游戏自身的资源(而非从 Wiki 抓取)。

## 功能展示
| 图层 | 追踪内容 | 玩家个人实时状态? |
|---|---|---|
| **玩家** | 实时位置、等级、HP、饥饿度、在线/离线(通过 RCON)、最后在线时间 | — |
| **雕像**(遗物) | 407 个可收集雕像,按等级分组 | ✅ 个人已收集 |
| **Alpha Boss** | 90 个野外 Boss 刷新点,名称/物种/元素 | ✅ 个人已击败 |
| **悬赏** | 66 个人类 NPC Boss(强盗/袭击者/集团首领) | ✅ 个人已击败 |
| **挑战之塔** | 9 个“GYM” Boss 连战塔 | ✅ 个人已击败 |
| **石油钻井平台** | 3 个突袭区域 POI | 世界共享(不存在个人状态) |
| **瞭望塔 / 传送点** | 22 个可攀爬的瞭望塔 + 152 个快速旅行点 | ✅ 个人已解锁 |
| **日志** | 64 个剧情拾取物(漂流者日志 + NPC 日记) | ✅ 个人已阅读 |
| ** schematic ** | 106 个蓝图拾取物 | ✅ 个人已收集 |
| **公会基地** | 玩家建造的基地,按公会分组 | 实时,世界共享 |
| **地下城** | 开放世界地下城入口 —— **仅显示当前已刷新/可进入的入口**,并带有实时 `激活 / 总数` 计数和消失 ETA | 实时,世界共享 |
从 **视为... (View As...)** 中选择一名玩家,会将每个清单过滤为*该*
玩家实际已收集/击败/解锁的内容,并将地图平移至其当前位置。
## 工作原理 - **`backend/remote.py`** 通过 SSH(基于 sudo 权限的 `rsync`/SFTP) 从 AMP 游戏服务器拉取 `Level.sav` 和每个玩家的 `.sav` 文件,刷新 循环为 30 秒。 - **`backend/parse.py`** 使用 [`deafdudecomputers/PalworldSaveTools`](https://github.com/deafdudecomputers/PalworldSaveTools) 解码存档文件 (PyPI 的 `palworld-save-tools` 包不支持 1.0 版本的 存档格式)并实时提取所有内容:玩家状态、个人的 收集/击败/解锁标记、公会基地,以及 —— 随着“地下城” 功能的推出 —— 当前已生成实例的地下城入口。 - **`extractor/PalExtract`** 是一个一次性的 C# 控制台应用 ([CUE4Parse](https://github.com/FabianFG/CUE4Parse)),用于直接从 游戏自身的 `.uasset`/World Partition 文件中读取 *静态*数据(位置、名称、图标、元素类型、地图纹理)。 该程序在装有游戏的 Windows 机器上每次游戏补丁更新时 运行一次,而非在请求时运行 —— 其输出被 内嵌到 Docker 镜像中,表现为 `data/*_static.json` + `frontend/assets/`。 - **`backend/server.py`** 是一个 Flask 应用,用于将静态和实时数据 作为 JSON 提供(`/api/players`、`/api/relics`、`/api/dungeons` 等)。 - **`frontend/index.html`** 是一个单页 Leaflet (`CRS.Simple`) 地图, 基于游戏自身的地图纹理进行渲染,并轮询这些 endpoint —— 无需构建步骤,没有使用框架。 这里没有任何内容是靠猜测的:每一个机制(雕像收集标记、Boss 击杀追踪键、地下城激活状态、坐标转换等)都是 直接从真实的存档文件或游戏自身的数据库中逆向工程得出的, 并记录了死胡同以避免重蹈覆辙。完整的 调查日志 —— 包括少数*确实*与公开 Wiki 交叉验证过的内容 (例如,不作为游戏数据存储的元素属性克制表) —— 位于 [`NOTES.md`](NOTES.md) 中。 ## 技术栈 | | | |---|---| | 后端 | Python 3.13, [Flask](https://github.com/pallets/flask) | | 存档解析 | [`palsav-flex` / `palooz`](https://github.com/deafdudecomputers/PalworldSaveTools) (Oodle decompression) | | 前端 | [Leaflet.js](https://github.com/Leaflet/Leaflet),原生 JS,无需构建步骤 | | 提取器 | C#, .NET, [CUE4Parse](https://github.com/FabianFG/CUE4Parse) | | 部署 | Docker, Portainer (git-repository stack) | ## 致谢 本项目直接读取游戏数据而不是抓取 Wiki,如果 没有以下开源项目,这是不可能实现的: - **[deafdudecomputers/PalworldSaveTools](https://github.com/deafdudecomputers/PalworldSaveTools)** — 存档文件解码(`palsav-flex`,`palooz`),包括针对 1.0 游戏版本的 Oodle/`PlM` 解压缩。它承担了地图上每一个“实时”图层背后的所有繁重工作。 - **[FabianFG/CUE4Parse](https://github.com/FabianFG/CUE4Parse)** + **[CUE4Parse-Conversion](https://github.com/FabianFG/CUE4Parse-Conversion)** — 直接读取 Unreal Engine 资源(`.uasset`/World Partition/DataTables), 为 `extractor/PalExtract` 提取每一个静态位置、名称、图标和 地图纹理提供动力。 - **[SixLabors.ImageSharp](https://github.com/SixLabors/ImageSharp)** — 图像 缩放,用于提取出的图标集(CUE4Parse-Conversion 的一个依赖项, 直接用于缩小 Journal 图标)。 - **[PalworldModding/UsefulFiles](https://github.com/PalworldModding/UsefulFiles)** — 针对当前游戏版本积极维护的 CUE4Parse 映射文件。 - **[palworldlol/palworld-coord](https://github.com/palworldlol/palworld-coord)** — 游戏内 HUD 坐标转换公式,用于验证多个 提取出的位置(参见 `NOTES.md`)。 - **[Leaflet](https://github.com/Leaflet/Leaflet)** — 整个前端构建所基于的 地图渲染器。 ## 在本地运行 ``` cd backend python -m venv ../.venv ../.venv/Scripts/pip install -r requirements.txt # 提供 RCON_PASSWORD / AMP_HOST / AMP_USER / AMP_SAVE_ROOT / AMP_WORLD_GUID # 通过 env vars,或者一个本地的 backend/secrets.py (gitignored) python server.py ``` 然后打开 `http://localhost:5151`。 ## 部署 完整的 Docker/Portainer 设置(必需的环境变量、SSH 密钥配置以及首次 实际部署中遇到的问题),请参阅 [`deploy/README.md`](deploy/README.md)。 ## 项目布局 ``` backend/ Flask app, save-file parsing, live refresh loop frontend/ Leaflet map (index.html + assets/) extractor/PalExtract One-off CUE4Parse extractor for static game data data/ Static extracted JSON (+ gitignored live-refreshed data) deploy/ Docker/Portainer deployment docs and config NOTES.md Full reverse-engineering investigation log ``` ## 许可证 [MIT](LICENSE)
## 工作原理 - **`backend/remote.py`** 通过 SSH(基于 sudo 权限的 `rsync`/SFTP) 从 AMP 游戏服务器拉取 `Level.sav` 和每个玩家的 `.sav` 文件,刷新 循环为 30 秒。 - **`backend/parse.py`** 使用 [`deafdudecomputers/PalworldSaveTools`](https://github.com/deafdudecomputers/PalworldSaveTools) 解码存档文件 (PyPI 的 `palworld-save-tools` 包不支持 1.0 版本的 存档格式)并实时提取所有内容:玩家状态、个人的 收集/击败/解锁标记、公会基地,以及 —— 随着“地下城” 功能的推出 —— 当前已生成实例的地下城入口。 - **`extractor/PalExtract`** 是一个一次性的 C# 控制台应用 ([CUE4Parse](https://github.com/FabianFG/CUE4Parse)),用于直接从 游戏自身的 `.uasset`/World Partition 文件中读取 *静态*数据(位置、名称、图标、元素类型、地图纹理)。 该程序在装有游戏的 Windows 机器上每次游戏补丁更新时 运行一次,而非在请求时运行 —— 其输出被 内嵌到 Docker 镜像中,表现为 `data/*_static.json` + `frontend/assets/`。 - **`backend/server.py`** 是一个 Flask 应用,用于将静态和实时数据 作为 JSON 提供(`/api/players`、`/api/relics`、`/api/dungeons` 等)。 - **`frontend/index.html`** 是一个单页 Leaflet (`CRS.Simple`) 地图, 基于游戏自身的地图纹理进行渲染,并轮询这些 endpoint —— 无需构建步骤,没有使用框架。 这里没有任何内容是靠猜测的:每一个机制(雕像收集标记、Boss 击杀追踪键、地下城激活状态、坐标转换等)都是 直接从真实的存档文件或游戏自身的数据库中逆向工程得出的, 并记录了死胡同以避免重蹈覆辙。完整的 调查日志 —— 包括少数*确实*与公开 Wiki 交叉验证过的内容 (例如,不作为游戏数据存储的元素属性克制表) —— 位于 [`NOTES.md`](NOTES.md) 中。 ## 技术栈 | | | |---|---| | 后端 | Python 3.13, [Flask](https://github.com/pallets/flask) | | 存档解析 | [`palsav-flex` / `palooz`](https://github.com/deafdudecomputers/PalworldSaveTools) (Oodle decompression) | | 前端 | [Leaflet.js](https://github.com/Leaflet/Leaflet),原生 JS,无需构建步骤 | | 提取器 | C#, .NET, [CUE4Parse](https://github.com/FabianFG/CUE4Parse) | | 部署 | Docker, Portainer (git-repository stack) | ## 致谢 本项目直接读取游戏数据而不是抓取 Wiki,如果 没有以下开源项目,这是不可能实现的: - **[deafdudecomputers/PalworldSaveTools](https://github.com/deafdudecomputers/PalworldSaveTools)** — 存档文件解码(`palsav-flex`,`palooz`),包括针对 1.0 游戏版本的 Oodle/`PlM` 解压缩。它承担了地图上每一个“实时”图层背后的所有繁重工作。 - **[FabianFG/CUE4Parse](https://github.com/FabianFG/CUE4Parse)** + **[CUE4Parse-Conversion](https://github.com/FabianFG/CUE4Parse-Conversion)** — 直接读取 Unreal Engine 资源(`.uasset`/World Partition/DataTables), 为 `extractor/PalExtract` 提取每一个静态位置、名称、图标和 地图纹理提供动力。 - **[SixLabors.ImageSharp](https://github.com/SixLabors/ImageSharp)** — 图像 缩放,用于提取出的图标集(CUE4Parse-Conversion 的一个依赖项, 直接用于缩小 Journal 图标)。 - **[PalworldModding/UsefulFiles](https://github.com/PalworldModding/UsefulFiles)** — 针对当前游戏版本积极维护的 CUE4Parse 映射文件。 - **[palworldlol/palworld-coord](https://github.com/palworldlol/palworld-coord)** — 游戏内 HUD 坐标转换公式,用于验证多个 提取出的位置(参见 `NOTES.md`)。 - **[Leaflet](https://github.com/Leaflet/Leaflet)** — 整个前端构建所基于的 地图渲染器。 ## 在本地运行 ``` cd backend python -m venv ../.venv ../.venv/Scripts/pip install -r requirements.txt # 提供 RCON_PASSWORD / AMP_HOST / AMP_USER / AMP_SAVE_ROOT / AMP_WORLD_GUID # 通过 env vars,或者一个本地的 backend/secrets.py (gitignored) python server.py ``` 然后打开 `http://localhost:5151`。 ## 部署 完整的 Docker/Portainer 设置(必需的环境变量、SSH 密钥配置以及首次 实际部署中遇到的问题),请参阅 [`deploy/README.md`](deploy/README.md)。 ## 项目布局 ``` backend/ Flask app, save-file parsing, live refresh loop frontend/ Leaflet map (index.html + assets/) extractor/PalExtract One-off CUE4Parse extractor for static game data data/ Static extracted JSON (+ gitignored live-refreshed data) deploy/ Docker/Portainer deployment docs and config NOTES.md Full reverse-engineering investigation log ``` ## 许可证 [MIT](LICENSE)
标签:Palworld, 地图, 多人体追踪, 存档解析, 游戏服务器, 游戏辅助, 自托管, 请求拦截