UE5.1 v0.7.3 被动技能 DataTable 解析工作流
🎮 游戏开发
FModel CLI 导出 + 本地化键映射,从 Palworld 服务端 Pak 中提取完整被动技能中英文对照表,自动化更新配置文件。
背景
Palworld v0.7.3 更新后,被动技能 ID 发生了变更(旧 ID 被废弃,新 ID 加入)。本文档记录了一套严格离线的 DataTable 解析工作流:从服务端 Pak 中提取被动技能中英文对照表,自动更新配置文件。
核心约束
- 全程禁止调用外部在线数据库,所有数据源仅限本地解包的
uasset/uexp、FModel 导出文件 - 禁止手写二进制 uasset 解析器,必须使用 FModel CLI 导出 DataTable 为标准 JSON
- ID 有效性唯一判定标准:是否存在于
DT_PassiveSkill_Main的 RowName 列表 - 禁止字符串模糊搜索推断映射
环境资源
| 资源 | 路径 / 版本 |
|---|---|
| Pak 路径 | G:\PalServer\Pal\Content\Paks\Pal-WindowsServer.pak |
| 引擎版本 | UE5.1.1 |
| 工具 | UnrealPak.exe、FModel.exe |
| 预解包目录 | G:\PalServer\extracted_511 |
| 存档编辑器 | G:\PalServer\pst\pal_editor.py |
映射链路
text
DT_PassiveSkill_Main.RowName (真实 SkillID)
↓
行内 NameText (FText 本地化键)
↓
DT_SkillNameText_Common.zh-Hans LocRes 中文文本DataTable 结构解析
FModel 导出 JSON 格式
每条被动技能在 JSON 中是一个 RowName 对象,包含以下关键字段:
json
{
"Legend": {
"Rank": 4,
"LotteryWeight": 100,
"TargetElementType": "EPalElementType::None",
"EffectType1": "EPalPassiveSkillEffectType::MeleeAttack",
"EffectValue1": 20.0,
"TargetType1": "EPalPassiveSkillEffectTargetType::ToSelf",
"InvokeActiveOtomo": true,
"InvokeWorker": false,
"InvokeRiding": false,
"InvokeAlways": true,
"AddPal": true,
"AddRarePal": true,
"Category": "EPalPassiveCategory::SortDisplayable"
}
}字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
Rank | int | 技能等级(-3 ~ 5),影响颜色品质 |
LotteryWeight | int | 抽取权重(越高越容易获得) |
EffectType1~3 | enum | 效果类型(攻击力/防御/速度/采集等) |
EffectValue1~3 | float | 效果数值 |
TargetType1~3 | enum | 效果目标(自身/帕鲁/骑乘等) |
InvokeActiveOtomo | bool | 队伍中激活时生效 |
InvokeWorker | bool | 工作时生效 |
InvokeRiding | bool | 骑乘时生效 |
InvokeAlways | bool | 始终生效 |
InvokeInBaseCamp | bool | 据点中生效 |
Category | enum | 分类(可显示/不可显示) |
数据总览(873 条技能)
Rank 分布
| Rank | 品质 | 数量 | 说明 |
|---|---|---|---|
| -3 | 🔴 深红 | 5 | 极端负面 |
| -2 | 🔴 红色 | 2 | 严重负面 |
| -1 | 🟠 橙色 | 37 | 负面 |
| 0 | ⚪ 灰色 | 1 | 测试/特殊 |
| 1 | 🔵 蓝色 | 658 | 基础(大部分) |
| 2 | 🟣 紫色 | 57 | 进阶 |
| 3 | 🟡 金色 | 78 | 稀有 |
| 4 | ⭐ 传说 | 24 | 传说级 |
| 5 | 🌟 超传说 | 9 | 最高稀有度 |
| 9 | 💎 特殊 | 2 | 特殊事件技能 |
触发条件分布
| 触发条件 | 数量 | 说明 |
|---|---|---|
InvokeAlways | 348 | 始终生效(被动常驻) |
InvokeActiveOtomo | 184 | 队伍中激活时 |
InvokeRiding | 133 | 骑乘时 |
InvokeInBaseCamp | 29 | 据点中 |
InvokeWorker | 28 | 工作时 |
效果类型 Top 10
| 效果类型 | 数量 | 说明 |
|---|---|---|
| ShotAttack | 75 | 远程攻击力 |
| CraftSpeed | 43 | 制作速度 |
| Defense | 30 | 防御力 |
| ElementBoost_Dark | 30 | 暗属性增强 |
| MoveSpeed | 29 | 移动速度 |
| Mining | 25 | 采集速度 |
| ElementBoost_Leaf | 23 | 草属性增强 |
| ElementBoost_Normal | 21 | 无属性增强 |
| ElementBoost_Ice | 21 | 冰属性增强 |
| ElementBoost_Water | 20 | 水属性增强 |
PASSIVE_SKILLS 字典(pal_editor.py)
存档编辑器 pal_editor.py 中维护了完整的 英文ID → 中文名 映射字典,共 200+ 条。按 Tier 分级:
Tier 4 传说级(⭐ Rank 4-5)
python
PASSIVE_SKILLS = {
# 传说级帕鲁专属
"Legend": "传说",
"PAL_ALLAttack_up3": "鬼神",
"Artisan": "卓绝技艺", # v0.7.3 → CraftSpeed_up3
"DiamondBody": "金刚之躯",
"Swift": "神速", # v0.7.3 → MoveSpeed_up_3
"EternalFlame": "永炎",
"InfiniteGenerator": "永动机",
"LordOfTheLake": "湖之主",
"WaveBreakerKing": "破浪王者",
"Savior": "救世主",
# 通用传说级
"RageStorm": "疾风怒涛",
"BloodFuel": "血液燃料",
}Tier 3 金色(🟡 Rank 3)
python
"CraftsmanSpirit": "工匠精神", # v0.7.3 → CraftSpeed_up2
"SturdyBody": "顽强肉体",
"Ferocious": "凶猛", # v0.7.3 → PAL_ALLAttack_up2
"FlameEmperor": "炎帝",
"SeaEmperor": "海皇",
"ThunderEmperor": "雷帝",
"SpiritKing": "精灵王",
"IceEmperor": "冰帝",
"RockEmperor": "岩帝",
"DarkLord": "冥王",
"DivineDragon": "神龙",
"Workaholic": "工作狂",
"InfiniteStamina": "无限精力",
"Noble": "贵族",
}Tier 1 蓝色(🔵 Rank 1)
python
"Brave": "勇敢",
"Aggressive": "粗暴",
"Nocturnal": "夜行性",
"Nimble": "灵活",
"Diligent": "认真", # v0.7.3 → CraftSpeed_up1
"HardSkin": "坚硬皮肤",
"CorporateSlave": "社畜", # v0.7.3 → PAL_CorporateSlave
"SmallStomach": "小胃",
"PositiveThinking": "积极思维",
}负面技能(🔴 Rank -1 ~ -3)
python
# Tier R2 红色负面
"BottomlessStomach": "无底之胃",
"DestructionDesire": "毁灭欲望",
# Tier R3 红色严重负面
"LazyAddict": "偷懒成瘾", # v0.7.3 → CraftSpeed_down2
"Osteoporosis": "骨质疏松",
"Pessimist": "消极主义者",
}v0.7.3 新增 ID
python
# FModel 导出确认的新 RowName
"CraftSpeed_up1": "认真",
"CraftSpeed_up2": "工匠精神",
"CraftSpeed_up3": "卓绝技艺",
"Noukin": "脑筋",
"Alien": "未知生物细胞",
"PAL_CorporateSlave": "社畜",
# 旧 ID 已从 DataTable 移除,保留映射用于向下兼容
"Artisan": "工匠精神(旧)",
"WorkSlave": "社畜(旧)",
"Work_Serious": "认真(旧)",
"MuscleHead": "脑筋(旧)",
}装备/道具来源技能
除帕鲁被动技能外,DataTable 还包含 装备/道具来源的通用技能(Category: SortNotDisplayable,共 781 条):
属性抗性系列(9 属性 × 3 级 = 27 条)
python
"FireResist_Lv1": "减轻火属性伤害Lv1",
"FireResist_Lv2": "减轻火属性伤害Lv2",
"FireResist_Lv3": "减轻火属性伤害Lv3",
# ... 水/雷/草/冰/地/暗/龙 同理属性增强系列(S/M/L 三级)
python
"FireBoost_S": "增强火属性伤害小",
"FireBoost_M": "增强火属性伤害中",
"FireBoost_L": "增强火属性伤害大",
# ... 8 种属性 × 3 级 = 24 条基础数值系列
python
"HP_Up_Lv1": "提升体力Lv1", # +10% HP
"HP_Up_Lv2": "提升体力Lv2", # +20% HP
"HP_Up_Lv3": "提升体力Lv3", # +30% HP
"Attack_Up_Lv3": "提升攻击Lv3",
"Defense_Up_Lv3": "提升防御Lv3",
"WorkSpeed_Up_Lv3": "高速工作Lv3",
"Weight_Up_Lv3": "提升负重Lv3",
}阶段 1:FModel CLI 完整导出
目标资产
Pal/Content/Pal/DataTable/PassiveSkill/DT_PassiveSkill_Main.uasset + .uexpPal/Content/Pal/DataTable/SkillText/DT_SkillNameText_Common.uasset + .uexp
执行步骤
- 切换 FModel 工作目录,执行导出命令,将
DT_PassiveSkill_Main完整导出为 JSON - 读取 JSON,提取全部 873 条行数据
- 输出基础清单:
RowName | Rank | EffectType1 | EffectValue1 | Category
待校验 ID 列表
| 类型 | ID 列表 | 状态 |
|---|---|---|
| 旧 ID | Artisan、WorkSlave、MuscleHead、Work_Serious | ❌ v0.7.3 已移除 |
| 新 ID | CraftSpeed_up1、CraftSpeed_up2、Noukin、PAL_CorporateSlave | ✅ v0.7.3 已确认 |
阶段 2:本地化键映射解析
- 针对每条有效 RowName (SkillID),提取 NameText 内的
StringTable/Key值(DisplayNameKey) - FModel 导出
DT_SkillNameText_Common中文本地化表 JSON - 建立
DisplayNameKey → 中文文本字典
阶段 3:输出标准文件
生成 passive_skills.json
json
{
"Legend": "传说",
"CraftSpeed_up3": "卓绝技艺",
"CraftSpeed_up2": "工匠精神",
"CraftSpeed_up1": "认真",
"Noukin": "脑筋",
"PAL_ALLAttack_up3": "鬼神",
"DiamondBody": "金刚之躯",
"Swift": "神速",
"PAL_CorporateSlave": "社畜"
}更新 pal_editor.py
python
PASSIVE_SKILLS = {
# v0.7.3 新增(FModel 确认)
"CraftSpeed_up1": "认真",
"CraftSpeed_up2": "工匠精神",
"CraftSpeed_up3": "卓绝技艺",
"CraftSpeed_down2": "偷懒成瘾",
"Noukin": "脑筋",
"Alien": "未知生物细胞",
"PAL_CorporateSlave": "社畜",
# 旧 ID 已从 v0.7.3 DataTable 移除,保留映射用于向下兼容
"Artisan": "工匠精神(旧)",
"WorkSlave": "社畜(旧)",
"Work_Serious": "认真(旧)",
"MuscleHead": "脑筋(旧)",
# ... 200+ 条完整映射
}pal_editor.py 功能概览
存档编辑器支持以下操作:
| 命令 | 功能 | 说明 |
|---|---|---|
list | 查看队伍帕鲁信息 | 等级、技能、性别、突破等级 |
edit setlevel | 修改等级 | 设置帕鲁等级 |
edit setrank | 修改突破等级 | 设置星数 |
edit setgender | 修改性别 | 切换帕鲁性别 |
edit shiny | 设置闪光 | 标记为闪光帕鲁 |
edit maxall | 全属性最大 | 一键满级满突破 |
edit passive | 替换被动技能 | 通过 ID 替换技能槽 |
edit addpassive | 添加被动技能 | 追加新技能 |
edit clearpassive | 清空被动技能 | 移除所有被动 |
save | 备份并解码存档 | SAV → JSON 转换 |
技术栈
text
sav_cli.exe (PST) → SAV 解码
oo2core_9_win64.dll → Oodle Kraken 解压
oodle_wrapper.py → ctypes 封装
GVAS 精准偏移 → 属性级字节定位整体工作流
text
Palworld 更新
↓
新 Pak 文件
↓
FModel 导出 DT_PassiveSkill_Main.json
↓
读取所有 RowName(873 条)
↓
匹配本地化键 → 中文文本
↓
生成 passive_skills.json
↓
更新 pal_editor.py PASSIVE_SKILLS 字典禁止行为清单
禁止行为
- ❌ 禁止启动 Monolith MCP / UE 编辑器(无运行环境)
- ❌ 禁止手写 struct 二进制解析 uasset 头部
- ❌ 禁止引用任何网络抓取数据
- ❌ 禁止修改 Pak、打包、覆盖游戏资源(仅只读导出分析)
- ❌ 禁止猜测文本映射(无本地化键匹配则中文值填 null)