pdump 是 AzerothCore 用来把单个角色完整导出 / 导入的命令(控制台或游戏内 .character pdump write|load|copy)。导出来的文件是一条条 INSERT,把这个角色相关的表都串起来。本文以真实样本 pdump_20260715.txt为切片,对照 PlayerDump.cpp 与 db_characters 建表,把 18 张实际落盘的表逐个拆开:表职能、字段类型与含义、样本数据、表间引用,以及交叉读表后还原出的角色画像。
0. 样本概况
0.1 角色画像(来自 characters)
| 字段 | 值 | 解读 |
|---|---|---|
guid |
1002 | 角色全局唯一 ID,所有 character_* 表外键都指它 |
account |
101 | 账号 ID(acore_auth.account.id) |
name |
大法师 | 角色名 |
race / class / gender |
10 / 8 / 1 | 血精灵 / 法师 / 女性 |
level / xp |
29 / 4026 | 当前等级与本级经验 |
money |
2096484 | 209 金 64 银 84 铜 |
position_* / map / zone |
-2386.9, -1891.31, 95.85 / 1 / 17 | 卡利姆多 · 贫瘠之地 |
totaltime / leveltime |
123225 / 3352 | 总在线 ≈ 34.2 小时;本级 ≈ 56 分钟 |
creation_date |
2026-06-20 18:26:59 | 建号时间 |
logout_time |
1784122746 | 最后下线 ≈ 2026-07-15 13:39 UTC |
health / power1 |
973 / 2337 | 当前生命 / 法力 |
0.2 样本表行数
flowchart TB
subgraph rows["样本各表行数(从高到低)"]
direction TB
A1["character_achievement_progress — 281"]
A2["character_spell — 179"]
A3["character_queststatus_rewarded — 176"]
A4["item_instance — 149"]
A5["character_inventory — 147"]
A6["character_reputation — 105"]
A7["character_action — 47"]
A8["character_skills — 20"]
A9["character_achievement — 19"]
A10["character_talent — 10"]
A11["其余 8 张表 — 各 1~4 行"]
A1 --> A2 --> A3 --> A4 --> A5 --> A6 --> A7 --> A8 --> A9 --> A10 --> A11
end
| 表 | 行数 | 职能一句话 |
|---|---|---|
character_achievement_progress |
281 | 成就进度计数器 |
character_spell |
179 | 已学法术 / 配方 |
character_queststatus_rewarded |
176 | 已领奖任务 |
item_instance |
149 | 物品实体 |
character_inventory |
147 | 物品槽位映射 |
character_reputation |
105 | 声望 |
character_action |
47 | 动作条 |
character_skills |
20 | 技能熟练度 |
character_achievement |
19 | 已完成成就 |
character_talent |
10 | 已点天赋法术 |
character_aura |
4 | 持久光环 |
character_queststatus |
3 | 进行中任务 |
character_queststatus_seasonal |
2 | 节日任务状态 |
character_account_data |
2 | 客户端按角色配置 |
character_glyphs |
1 | 雕文 |
character_homebind |
1 | 炉石绑定 |
mail |
1 | 邮件 |
characters |
1 | 角色主表 |
可以把它当作 characters 库的一次垂直切片——只盯一个角色,就能把核心表学完。
0.3 为什么不能直接灌库
1 | IMPORTANT NOTE: THIS DUMPFILE IS MADE FOR USE WITH THE 'PDUMP' COMMAND ONLY |
必须通过 pdump load 回放。PlayerDump.cpp 导入时会重写角色 GUID、物品 GUID、邮件 ID、宠物 ID、装备方案 ID,并级联修正引用;直接 mysql < dump.txt 会撞主键或留下悬空引用。
0.4 pdump 导出范围与命令
DumpTables[] 登记的表比本样本多,空表不写 INSERT。本样本无宠物、装备方案、法术 CD、邮件附件。
导出时按表类型处理 GUID:
flowchart TB
subgraph types["PlayerDump 表类型"]
DTT_CHARACTER["DTT_CHARACTER
characters 主行"]
DTT_CHAR_TABLE["DTT_CHAR_TABLE
多数 character_*"]
DTT_INVENTORY["DTT_INVENTORY
character_inventory"]
DTT_ITEM["item_instance
GUID_TYPE_ITEM"]
DTT_MAIL["mail / mail_items"]
DTT_PET["character_pet* / pet_*"]
DTT_EQSET["character_equipmentsets"]
end
DTT_CHARACTER --> DTT_CHAR_TABLE
DTT_CHARACTER --> DTT_INVENTORY
DTT_INVENTORY --> DTT_ITEM
DTT_CHARACTER --> DTT_MAIL
DTT_CHARACTER --> DTT_PET
DTT_CHARACTER --> DTT_EQSET
flowchart LR
A[".character pdump write"] --> B["PlayerDumpWriter"]
B --> C["按 DumpTables 扫库"]
C --> D["生成 INSERT 文本"]
E[".character pdump load"] --> F["PlayerDumpReader"]
F --> G["分配新 GUID"]
G --> H["改写引用后入库"]
命令入口:src/server/scripts/Commands/cs_character.cpp
1 | .character pdump write <file> <player> |
1. characters —— 角色主表
1.1 职能
一条记录 = 一个角色。登录、选人界面、地图落点、休息经验、PVP 货币、天赋组开关等顶层状态都在这里。主键 guid 是整棵角色数据树的根。
1.2 字段全表
| 字段 | 类型 | 含义 | 样本值 / 说明 |
|---|---|---|---|
guid |
int unsigned PK | 角色 GUID | 1002 |
account |
int unsigned | 账号 ID → acore_auth.account.id |
101 |
name |
varchar(12) bin | 角色名(大小写敏感校对) | 大法师 |
race |
tinyint | ChrRaces.dbc ID |
10 血精灵 |
class |
tinyint | ChrClasses.dbc ID |
8 法师 |
gender |
tinyint | 0 男 / 1 女 | 1 |
level |
tinyint | 等级 | 29 |
xp |
int | 本级当前经验 | 4026 |
money |
int | 铜币现金 | 2096484 |
skin |
tinyint | 肤色索引 | 7 |
face |
tinyint | 脸型 | 3 |
hairStyle |
tinyint | 发型 | 11 |
hairColor |
tinyint | 发色 | 9 |
facialStyle |
tinyint | 面部装饰 | 0 |
bankSlots |
tinyint | 已购银行背包栏数 0–7 | 5 |
restState |
tinyint | 休息状态枚举 | 1=REST_STATE_RESTED |
playerFlags |
int | PlayerFlags 位掩码 |
3072=`HIDE_HELM |
position_x/y/z |
float | 世界坐标 | 贫瘠之地 |
map |
smallint | 地图 ID | 1 卡利姆多 |
instance_id |
int | 实例 ID,世界地图为 0 | 0 |
instance_mode_mask |
tinyint | 副本难度掩码 | 0 |
orientation |
float | 朝向弧度 | 2.4174 |
taximask |
text | 飞行点位图,空格分隔 uint32 | 14 个节点已解锁 |
online |
tinyint | 是否在线 | 0 |
cinematic |
tinyint | 是否看过种族开场动画 | 1 |
totaltime |
int | 总在线秒数 | 123225 |
leveltime |
int | 本级在线秒数 | 3352 |
logout_time |
int | 最后登出 Unix 秒 | 1784122746 |
is_logout_resting |
tinyint | 是否在休息区下线 | 0 |
rest_bonus |
float | 已累计休息经验池 | 1998.15 |
resettalents_cost |
int | 下次洗天赋金币代价 | 0 |
resettalents_time |
int | 上次洗天赋时间 | 0 |
trans_x/y/z/o |
float | 交通工具内相对坐标 | 0 |
transguid |
int | 交通工具 guid | 0 |
extra_flags |
smallint | PlayerExtraFlags |
4=ACCEPT_WHISPERS |
stable_slots |
tinyint | 宠物寄存栏购买数 | 0 |
at_login |
smallint | AtLoginFlags 登录时强制动作 |
0 |
zone |
smallint | 区域 AreaTable ID | 17 贫瘠之地 |
death_expire_time |
int | 尸体可召回等相关截止时间 | 1783764264 |
taxi_path |
text | 当前飞行路径序列,空则 NULL | NULL |
arenaPoints |
int | 竞技场点 | 0 |
totalHonorPoints |
int | 荣誉点总量 | 0 |
todayHonorPoints |
int | 今日荣誉 | 0 |
yesterdayHonorPoints |
int | 昨日荣誉 | 0 |
totalKills |
int | 荣誉击杀总量 | 0 |
todayKills |
smallint | 今日击杀 | 0 |
yesterdayKills |
smallint | 昨日击杀 | 0 |
chosenTitle |
int | 当前展示称号 CharTitles ID | 0 |
knownCurrencies |
bigint | 已知货币位图 | 0 |
watchedFaction |
int | 声望面板追踪的 faction;0xFFFFFFFF=无 |
4294967295 |
drunk |
tinyint | 醉酒等级 0–100 档 | 0 |
health |
int | 当前生命 | 973 |
power1 |
int | POWER_MANA | 2337 |
power2 |
int | POWER_RAGE | 0 |
power3 |
int | POWER_FOCUS | 0 |
power4 |
int | POWER_ENERGY | 100(法师残留) |
power5 |
int | POWER_HAPPINESS | 0 |
power6 |
int | POWER_RUNE | 0 |
power7 |
int | POWER_RUNIC_POWER | 0 |
latency |
int | 最近延迟 ms | 0 |
talentGroupsCount |
tinyint | 天赋组数量 1 或 2 | 1 |
activeTalentGroup |
tinyint | 当前天赋组索引 | 0 |
exploredZones |
longtext | 128 个 uint32 迷雾位图 | ~132 bit 已探索 |
equipmentCache |
longtext | 选人界面装备缓存:entry ench 成对 |
见 §1.3 |
ammoId |
int | 弹药 item entry | 0 |
knownTitles |
longtext | 称号位图,空格分隔 uint32 | 全 0 |
actionBars |
tinyint | 额外动作条解锁位 | 15=0b1111 |
grantableLevels |
tinyint | 可授予等级(招募等) | 0 |
order |
tinyint | 角色列表排序 | NULL |
creation_date |
timestamp | 建号时间 | 2026-06-20 18:26:59 |
deleteInfos_Account |
int | 软删除时原账号 | NULL |
deleteInfos_Name |
varchar(12) | 软删除时原名 | NULL |
deleteDate |
int | 软删除时间 | NULL |
innTriggerId |
int | 最近旅店 areatrigger | 2286 乱风岗 |
extraBonusTalentCount |
int | 额外天赋点数 | 0 |
1.2.1 race / class / gender 枚举
源码:src/server/shared/SharedDefines.h(enum Races / enum Classes / enum Gender)。characters.race、characters.class、characters.gender 直接存这些整型 ID;创建角色时还会再和 ChrRaces.dbc / ChrClasses.dbc 校验。
Gender
| 值 | 枚举 | 含义 | 样本 |
|---|---|---|---|
| 0 | GENDER_MALE |
男性 | |
| 1 | GENDER_FEMALE |
女性 | 本样本 |
| 2 | GENDER_NONE |
无性别(非玩家单位等) |
Races(3.3.5a 可创建角色)
| 值 | 枚举 | 中文 | 阵营 | 备注 |
|---|---|---|---|---|
| 0 | RACE_NONE |
无 | — | 占位,不可创建 |
| 1 | RACE_HUMAN |
人类 | 联盟 | |
| 2 | RACE_ORC |
兽人 | 部落 | |
| 3 | RACE_DWARF |
矮人 | 联盟 | |
| 4 | RACE_NIGHTELF |
暗夜精灵 | 联盟 | |
| 5 | RACE_UNDEAD_PLAYER |
亡灵 | 部落 | |
| 6 | RACE_TAUREN |
牛头人 | 部落 | |
| 7 | RACE_GNOME |
侏儒 | 联盟 | |
| 8 | RACE_TROLL |
巨魔 | 部落 | |
| 9 | (未用) | 地精 | — | 3.3.5 玩家不可选;枚举里注释掉 |
| 10 | RACE_BLOODELF |
血精灵 | 部落 | 本样本 |
| 11 | RACE_DRAENEI |
德莱尼 | 联盟 |
12 及以上(邪兽人、纳迦、破碎者等)只出现在 NPC / 扩展占位,正常
characters.race不会是这些值。
Classes(3.3.5a)
| 值 | 枚举 | 中文 | 备注 |
|---|---|---|---|
| 0 | CLASS_NONE |
无 | 占位 |
| 1 | CLASS_WARRIOR |
战士 | |
| 2 | CLASS_PALADIN |
圣骑士 | |
| 3 | CLASS_HUNTER |
猎人 | |
| 4 | CLASS_ROGUE |
潜行者 | |
| 5 | CLASS_PRIEST |
牧师 | |
| 6 | CLASS_DEATH_KNIGHT |
死亡骑士 | WotLK 英雄职业 |
| 7 | CLASS_SHAMAN |
萨满祭司 | |
| 8 | CLASS_MAGE |
法师 | 本样本 |
| 9 | CLASS_WARLOCK |
术士 | |
| 10 | (未用) | — | 枚举空号 |
| 11 | CLASS_DRUID |
德鲁伊 |
样本对应关系:
1 | race=10 → RACE_BLOODELF 血精灵 |
种族与职业并非任意组合。服务端创建角色时会查 ChrRaces / ChrClasses 及内部 mask(如 CLASSMASK_ALL_PLAYABLE);例如血精灵可做法师,牛头人不可。读 dump 时若看到非法组合,多半是手工改库或私服自定义。
flowchart LR
subgraph sample["本样本"]
R["race = 10
Blood Elf"] --> C["class = 8
Mage"]
C --> G["gender = 1
Female"]
end
1.2.2 其它常用枚举摘录
1 | PlayerFlags: HIDE_HELM=0x400, HIDE_CLOAK=0x800, RESTING=0x20, GM=0x8 ... |
1.3 equipmentCache
按可见装备槽顺序,每槽 2 个数:itemEntry + PERM 附魔 ID。选人界面只读主表,不联 item_instance。
| 槽 | itemEntry | 物品 | 缓存附魔 |
|---|---|---|---|
| 头 | 10502 | Spellpower Goggles Xtreme | 0 |
| 肩 | 3748 | Feline Mantle | 0 |
| 胸 | 4324 | Azure Silk Vest | 17 |
| 腰 | 51968 | Enumerated Wrap | 0 |
| 腿 | 7046 | Azure Silk Pants | 17 |
| 脚 | 4320 | Spidersilk Boots | 0 |
| 腕 | 14148 | Crystalline Cuffs | 0 |
| 手 | 51973 | Enumerated Handwraps | 0 |
| 戒指1 | 50255 | Dread Pirate Ring | 0 |
| 戒指2 | 1156 | Lavishly Jeweled Ring | 0 |
| 饰品1 | 42992 | Discerning Eye of the Beast | 0 |
| 背 | 6340 | Fenrus’ Hide | 0 |
| 主手 | 15241 | Battle Knife | 0 |
| 副手 | 6341 | Eerie Stable Lantern | 0 |
| 远程 | 7001 | Gravestone Scepter | 0 |
| 包1–4 | 23162×4 | Foror’s Crate | 0 |
1.4 时间线
flowchart LR
T1["06-20
建号 / Lv10 / RFC"] --> T2["06-27
WC / 小宠物"]
T2 --> T3["07-04
100 Quests"]
T3 --> T4["07-06
Lv20 / SFK / 骑术 / DM"]
T4 --> T5["07-11
决斗 / BFD / Stockades"]
T5 --> T6["07-15
登出 / pdump"]
2. character_account_data —— 客户端按角色配置
2.1 职能
把客户端 CVar、聊天窗、按键、宏等按角色持久化。换机登录可恢复 UI 习惯。主键 (guid, type)。
2.2 字段
| 字段 | 类型 | 含义 |
|---|---|---|
guid |
int unsigned | → characters.guid |
type |
tinyint | AccountDataType,见下表 |
time |
int | 该块最后更新 Unix 时间 |
data |
blob | 原始内容(多为可解析文本) |
AccountDataType(WorldSession.h):
| type | 枚举 | 范围 | 含义 |
|---|---|---|---|
| 0 | GLOBAL_CONFIG_CACHE | 账号级 | 全局配置(一般不在本表) |
| 1 | PER_CHARACTER_CONFIG_CACHE | 角色 | CVar |
| 2 | GLOBAL_BINDINGS_CACHE | 账号级 | 全局按键 |
| 3 | PER_CHARACTER_BINDINGS_CACHE | 角色 | 按键 |
| 4 | GLOBAL_MACROS_CACHE | 账号级 | 全局宏 |
| 5 | PER_CHARACTER_MACROS_CACHE | 角色 | 宏 |
| 6 | PER_CHARACTER_LAYOUT_CACHE | 角色 | 界面布局 |
| 7 | PER_CHARACTER_CHAT_CACHE | 角色 | 聊天窗 |
样本 2 行:type=1(CVar)与 type=7(聊天,约 3.7KB)。
type=1 要点:
1 | equipmentManager=1 |
3. character_achievement —— 已完成成就
3.1 职能
已经点亮的成就。完成瞬间写入一行;进度型统计在 character_achievement_progress。
3.2 字段
| 字段 | 类型 | 含义 |
|---|---|---|
guid |
int | → characters.guid |
achievement |
smallint | Achievement.dbc ID |
date |
int | 完成 Unix 时间 |
主键 (guid, achievement)。
3.3 样本 19 条
| ID | 名称 | 时间 UTC |
|---|---|---|
| 879 | Old School Ride | 06-20 10:35 |
| 131 | Journeyman Medic | 06-20 11:07 |
| 6 | Level 10 | 06-20 14:41 |
| 503 / 522 | 50 Quests / Somebody Likes Me | 06-20 14:43 |
| 116 | Professional Journeyman | 06-20 14:46 |
| 629 | Ragefire Chasm | 06-20 15:29 |
| 1017 | Can I Keep Him? | 06-27 14:23 |
| 630 | Wailing Caverns | 06-27 15:11 |
| 504 | 100 Quests | 07-04 12:54 |
| 7 | Level 20 | 07-06 03:34 |
| 631 | Shadowfang Keep | 07-06 03:57 |
| 731 | Professional Expert | 07-06 04:05 |
| 891 | Giddy Up! | 07-06 08:25 |
| 628 | Deadmines | 07-06 13:54 |
| 1157 | Duel-icious | 07-11 06:33 |
| 632 | Blackfathom Deeps | 07-11 08:52 |
| 633 | Stormwind Stockade | 07-11 10:30 |
flowchart LR
RFC[629 RFC] --> WC[630 WC]
WC --> SFK[631 SFK]
SFK --> DM[628 Deadmines]
DM --> BFD[632 BFD]
BFD --> STK[633 Stockades]
4. character_achievement_progress —— 成就进度
4.1 职能
未完成或需累计的 criteria。每个 (guid, criteria) 一行,counter 为当前累计。
4.2 字段
| 字段 | 类型 | 含义 |
|---|---|---|
guid |
int | → characters.guid |
criteria |
smallint | AchievementCriteria.dbc ID |
counter |
int | 当前进度值(击杀数/铜币/伤害等) |
date |
int | 最后更新时间 |
4.3 样本高值
| criteria | counter | 解读 |
|---|---|---|
| 4224 | 2317003 | 金钱类累计,约 231 金量级 |
| 3361 / 4091 | 621267 | 62 金 12 银 67 铜 |
| 3355 等 | 184260 | 造成伤害 |
| 3354 等 | 36676 | 承受伤害 |
| 3356 | 8742 | 治疗量 |
| 2072 | 1439 | 击杀数 |
| 73 / 232 等 | 176 | 已交任务数 = rewarded 行数 |
| 992 等 | 42xxx | 主城声望接近 Exalted |
| 842–902 | 225 | 专业 225 相关 |
| 164 等 | 210 | 炼金 210 相关 |
经济结论:现金 209 金,自产统计约 62 金 → 明显有外部注资。
5. character_action —— 动作条
5.1 职能
记录每个动作条按钮绑定的法术 / 物品 / 宏。双天赋时 spec 分 0/1 两套。
5.2 字段
| 字段 | 类型 | 含义 |
|---|---|---|
guid |
int | → characters.guid |
spec |
tinyint | 天赋组索引 |
button |
tinyint | 按钮编号 0–143 |
action |
int | 法术 ID 或物品 entry 或宏 ID |
type |
tinyint | ActionButtonType |
主键 (guid, spec, button)。
type:
| 值 | 枚举 | 含义 |
|---|---|---|
| 0x00 | ACTION_BUTTON_SPELL | 法术,action=spellId |
| 0x01 | ACTION_BUTTON_C | click 类 |
| 0x20 | ACTION_BUTTON_EQSET | 装备方案 |
| 0x40 | ACTION_BUTTON_MACRO | 宏 |
| 0x80 | ACTION_BUTTON_ITEM | 物品,action=itemEntry |
button 分区:
flowchart TB
M["button 0-11 主动作条"]
M --> R1["12-23 右下"]
M --> R2["24-35 左下"]
M --> R3["36-47 右侧"]
M --> R4["48-59 左侧"]
M --> R5["60-71 额外条"]
M --> R6["72-83 上方条"]
样本 47 键:法术 39、物品 8。主条:
| btn | action | 含义 |
|---|---|---|
| 0 | 120 | Cone of Cold |
| 1 | 8406 | Frostbolt 高阶 |
| 2 | 8444 | Fire Blast |
| 3 | 8400 | Fireball |
| 4 | 5145 | Arcane Missiles |
| 5 | 8437 | Arcane Explosion |
| 6 | 5019 | Shoot |
| 8 | 1953 | Blink |
| 9 | 12824 | Polymorph |
| 10 | 865 | Frost Nova |
| 11 | 2138 | Fire Blast 另一阶 |
其它条含专业技能、手雷 4390、药水、12472 Icy Veins、2139 Counterspell、28730 奥术洪流。
6. character_aura —— 持久光环
6.1 职能
下线仍保留、上线需恢复的长 buff(自身护甲、智力、NPC 耐力、药剂、物品触发等)。短战斗光环通常不入库。
6.2 字段
| 字段 | 类型 | 含义 |
|---|---|---|
guid |
int | 受益者 → characters.guid |
casterGuid |
bigint | 施法者完整 GUID(玩家或生物,可含 HighGuid) |
itemGuid |
bigint | 物品触发时的物品完整 GUID;非物品为 0 |
spell |
int | 法术 ID |
effectMask |
tinyint | 哪些 effect 槽生效(bit0=effect0…) |
recalculateMask |
tinyint | 上线需重算的 effect 位 |
stackCount |
tinyint | 层数 |
amount0/1/2 |
int | 三 effect 当前修正值 |
base_amount0/1/2 |
int | 基础值(未吃加成前) |
maxDuration |
int | 最大持续 ms |
remainTime |
int | 剩余 ms(下线冻结) |
remainCharges |
tinyint | 剩余次数;0 常表示无次数限制 |
主键 (guid, casterGuid, itemGuid, spell, effectMask)。
样本 4 条:
1 | caster=505 spell=1245 +20耐力 30min NPC 耐力 |
7. character_glyphs —— 雕文
7.1 职能
每个天赋组 6 个雕文槽(3 主 3 副,按等级解锁)。
7.2 字段
| 字段 | 类型 | 含义 |
|---|---|---|
guid |
int | → characters.guid |
talentGroup |
tinyint | 天赋组 0/1 |
glyph1..6 |
smallint | GlyphProperties.dbc ID;0=空 |
主键 (guid, talentGroup)。
样本:glyph1=315, glyph2=451, 其余 0。29 级只开部分槽。
8. character_homebind —— 炉石绑定
8.1 职能
炉石传送目标。每个角色一行。
8.2 字段
| 字段 | 类型 | 含义 | 样本 |
|---|---|---|---|
guid |
int PK | → characters.guid |
1002 |
mapId |
smallint | 地图 | 1 |
zoneId |
smallint | 区域 | 484 |
posX/Y/Z |
float | 坐标 | -5473.93, -2458.54, 89.2845 |
对照 areatrigger 2286 + areatrigger_tavern:千针石林 Freewind Post 旅店。与 characters.innTriggerId=2286 一致。人在贫瘠、炉石在千针。
9. character_inventory + item_instance —— 物品系统
9.1 职能分工
| 表 | 职能 |
|---|---|
item_instance |
物品实体:模板、堆叠、附魔、耐久、绑定 |
character_inventory |
放哪:哪个 bag 的第几 slot |
erDiagram
characters ||--o{ character_inventory : "guid"
characters ||--o{ item_instance : "owner_guid"
character_inventory }o--|| item_instance : "item = guid"
character_inventory }o--o| item_instance : "bag = guid (or 0)"
characters ||--o{ item_instance : "creatorGuid"
样本:item_instance 149,inventory 147。多出 2 件悬空:
1 | 36538 Clarice's Pendant (6145) |
9.2 character_inventory 字段
| 字段 | 类型 | 含义 |
|---|---|---|
guid |
int | 角色 → characters.guid |
bag |
int | 容器 item_instance.guid;0=角色自身槽位空间 |
slot |
tinyint | 槽位号(含义随 bag 变化) |
item |
int PK | 物品实例 → item_instance.guid |
唯一键 (guid, bag, slot):同一格不能放两件。
9.3 bag=0 时的 slot 空间
flowchart TB
subgraph body["bag = 0 角色自身"]
E["0-18 装备槽"]
B["19-22 四个背包栏"]
M["23-38 主背包 16 格"]
BI["39-66 银行物品格"]
BB["67-73 银行背包栏"]
end
E --> B --> M --> BI --> BB
| slot 范围 | 枚举 | 含义 |
|---|---|---|
| 0–18 | EQUIPMENT_SLOT_* | 头颈肩…主副手远程战袍 |
| 19–22 | INVENTORY_SLOT_BAG_* | 身上 4 个包 |
| 23–38 | INVENTORY_SLOT_ITEM_* | 主背包 16 格 |
| 39–66 | BANK_SLOT_ITEM_* | 银行主空间 |
| 67–73 | BANK_SLOT_BAG_* | 银行包栏(bankSlots 控制已购数) |
装备槽细目:
flowchart LR
subgraph equip["装备 0-18"]
H["0 头"] --- N["1 颈"] --- S["2 肩"] --- C["3 衬衣"]
C --- Ch["4 胸"] --- W["5 腰"] --- L["6 腿"] --- F["7 脚"]
F --- Wr["8 腕"] --- Ha["9 手"] --- R1["10 戒"] --- R2["11 戒"]
R2 --- T1["12 饰"] --- T2["13 饰"] --- B["14 背"]
B --- MH["15 主手"] --- OH["16 副手"] --- RG["17 远程"] --- TB["18 战袍"]
end
样本 bag=0 占用:装备 15 件(缺颈/衬衣/饰品2/战袍)、背包栏 4、主包与银行大量材料格、银行包栏 5(= bankSlots)。
9.4 item_instance 字段
| 字段 | 类型 | 含义 |
|---|---|---|
guid |
int PK | 物品实例全局 ID |
itemEntry |
int | → item_template.entry |
owner_guid |
int | 所有者 → characters.guid |
creatorGuid |
int | 制造者角色 guid;0=非制造 |
giftCreatorGuid |
int | 包装赠送者 |
count |
int | 堆叠数量 |
duration |
int | 限时物品剩余秒;0=无限 |
charges |
tinytext | 最多 5 个法术充能,空格分隔 |
flags |
int | ITEM_FIELD_FLAGS;样本 1=已绑定 |
enchantments |
text | 12 槽 × (id,duration,charges) = 36 个整数 |
randomPropertyId |
smallint | 随机属性;负值多为 random suffix |
durability |
smallint | 当前耐久;无耐久为 0 |
playedTime |
int | 已装备秒数 |
text |
text | 可读物品正文;无则 NULL |
enchantments 槽:
| 槽 | 枚举 | 含义 |
|---|---|---|
| 0 | PERM_ENCHANTMENT_SLOT | 永久附魔 |
| 1 | TEMP_ENCHANTMENT_SLOT | 临时附魔 |
| 2–4 | SOCK_ENCHANTMENT_SLOT* | 宝石 |
| 5 | BONUS_ENCHANTMENT_SLOT | 插槽奖励 |
| 6 | PRISMATIC_ENCHANTMENT_SLOT | 棱彩 |
| 7–11 | PROP_ENCHANTMENT_SLOT* | 随机属性 |
9.5 样本装备 / 包 / 材料
身上装备见 §1.3 联表结果;穿最久:Feline Mantle / Fenrus’ Hide ≈ 30.3h。
背包:4×23162 Foror’s Crate。银行 5 包(bankSlots=5):4245/932/918/857/5576。
材料汇总:Linen 803、Wool 364、绷带 96、手雷 56、Blood Shard 52、法力药水 29 等。
自制(creatorGuid=1002):Spidersilk Boots、Azure Silk Vest、Green Silken Shoulders、Crimson Silk Vest、Black Mageweave Vest、Mana Agate。
10. character_queststatus —— 进行中任务
10.1 职能
任务日志里还没收工的任务:目标计数、失败/完成态、计时器。交完领奖后删本行,写入 queststatus_rewarded。
stateDiagram-v2
[*] --> INCOMPLETE: 接取任务
INCOMPLETE --> COMPLETE: 目标达成
INCOMPLETE --> FAILED: 失败/超时
COMPLETE --> [*]: 交任务领奖
写 rewarded 删本行
FAILED --> INCOMPLETE: 放弃重接
FAILED --> [*]: 放弃
10.2 字段
| 字段 | 类型 | 含义 |
|---|---|---|
guid |
int | → characters.guid |
quest |
int | → quest_template.ID |
status |
tinyint | QuestStatus |
explored |
tinyint | 探索类目标是否完成 |
timer |
int | 限时任务截止 Unix 时间;非限时也可能写时间戳 |
mobcount1..4 |
smallint | 最多 4 个杀怪/目标计数 |
itemcount1..6 |
smallint | 最多 6 个交物品计数 |
playercount |
smallint | 需要玩家击杀类计数 |
QuestStatus:
| 值 | 枚举 | 含义 |
|---|---|---|
| 0 | NONE | 无 |
| 1 | COMPLETE | 目标完成,可交 |
| 3 | INCOMPLETE | 仍在进行 |
| 5 | FAILED | 失败 |
| 6 | REWARDED | 不进本表 |
样本:
| quest | 名称 | status | 说明 |
|---|---|---|---|
| 1088 | Ordanus | 3 INCOMPLETE | 还在做 |
| 1136 | Frostmaw | 3 INCOMPLETE | 千针霜喉 |
| 3633 | Goblin Engineering | 1 COMPLETE | itemcount1=1,可交 |
11. character_queststatus_rewarded —— 已领奖任务
11.1 职能
永久记录「这号交过哪些任务」。任务前置、成就、某些重复性判断都读它。
11.2 字段
| 字段 | 类型 | 含义 |
|---|---|---|
guid |
int | → characters.guid |
quest |
int | 任务 ID |
active |
tinyint | 通常 1;部分实现用于标记是否仍参与某些逻辑 |
主键 (guid, quest)。样本 176 行,active 全 1。
按 ID 段:
| 区段 | 数量 | 内容 |
|---|---|---|
| 0–999 | 48 | 贫瘠/石爪等 |
| 1000–1999 | 18 | 含法师职业任务 |
| 3000–5999 | 27 | 千针等 |
| 6000–6999 | 21 | 灰谷/石爪/BFD 相关 |
| 8000–9999 | 53 | 血精灵起始 + 幽魂之地 |
| 10000+ | 3 | 10068;节日 11859/11915 |
| 24882/24883 | 2 | LFG 随机本每日 |
| 90000 | 1 | 私服自定义任务 |
12. character_queststatus_seasonal —— 季节性任务
12.1 职能
节日/事件任务在本周期是否已做。事件重置后清或轮换,与永久 rewarded 互补。
12.2 字段
| 字段 | 类型 | 含义 |
|---|---|---|
guid |
int | → characters.guid |
quest |
int | 任务 ID |
event |
int | → game_event.entry |
样本:
1 | 11859 Honor the Flame event=1 |
game_event=1 = Midsummer Fire Festival(仲夏火焰节)。
13. character_reputation —— 声望
13.1 职能
每个阵营的 standing 与 UI 标志。角色创建时会初始化大量阵营行。
13.2 字段
| 字段 | 类型 | 含义 |
|---|---|---|
guid |
int | → characters.guid |
faction |
smallint | Faction.dbc ID |
standing |
int | 原始声望点数(可负) |
flags |
smallint | FactionFlags 位掩码 |
主键 (guid, faction)。
声望阈值:
1 | Hated < -6000 ≤ Hostile < -3000 ≤ Unfriendly < 0 |
FactionFlags:
| 位 | 枚举 | 含义 |
|---|---|---|
| 0x01 | VISIBLE | 声望面板可见 |
| 0x02 | AT_WAR | 交战 |
| 0x04 | HIDDEN | 隐藏 |
| 0x08 | INVISIBLE_FORCED | 强制不可见 |
| 0x10 | PEACE_FORCED | 强制和平 |
| 0x20 | INACTIVE | 玩家标为不活跃 |
| 0x40 | RIVAL | 外域对立阵营 |
| 0x80 | SPECIAL | 主城等特殊 |
样本非零:Orgrimmar/TB 42499、Darkspear 39278、Silvermoon 38999、Undercity 37030、Ratchet 20000、三 goblin 城 10000、Argent Dawn 2500。
14. character_skills —— 技能熟练度
14.1 职能
武器、护甲、语言、专业、骑术等 SkillLine 当前值与上限。不是法术列表。
14.2 字段
| 字段 | 类型 | 含义 |
|---|---|---|
guid |
int | → characters.guid |
skill |
smallint | SkillLine.dbc ID |
value |
smallint | 当前熟练度 |
max |
smallint | 当前上限(受等级/训练影响) |
主键 (guid, skill)。
样本要点:Frost/Fire/Arcane 145;Alchemy 210、Tailoring 220、Engineering 225;First Aid 225;Riding 75;无 Mining(186)。三门主要专业并存,说明私服放宽限制。
15. character_spell —— 已学法术
15.1 职能
角色会的全部法术与配方。是否放在动作条另见 character_action;天赋点选另见 character_talent。
15.2 字段
| 字段 | 类型 | 含义 |
|---|---|---|
guid |
int | → characters.guid |
spell |
int | Spell.dbc ID |
specMask |
tinyint | 哪些天赋组可用的位掩码 |
主键 (guid, spell)。
specMask:bit0=spec0,bit1=spec1;255 (0xFF)=所有天赋组;1=仅 spec0。
样本 179 个:战斗法术 + 天赋法术 + 炼金/工程/裁缝/急救配方 + 骑术 33388 等。
flowchart TB
spell[character_spell 会什么]
action[character_action 放哪]
talent[character_talent 天赋点了什么]
spell --> action
talent --> spell
16. character_talent —— 天赋
16.1 职能
已学习的天赋法术(按 rank 分行)。与 character_spell 中对应 spell 常同时存在。
16.2 字段
| 字段 | 类型 | 含义 |
|---|---|---|
guid |
int | → characters.guid |
spell |
int | 天赋法术 ID |
specMask |
tinyint | 所属天赋组位掩码 |
主键 (guid, spell)。
样本 10 行全 specMask=1:Icy Veins、Improved Frostbolt/Blizzard/Permafrost、Ice Shards、Arcane Concentration/Subtlety 等。冰系为主 + 少量奥术前置。talentGroupsCount=1 未开双天赋。
17. mail —— 邮件
17.1 职能
邮箱信件。附件在 mail_items(本样本无)。pdump 按 receiver 导出。
17.2 字段
| 字段 | 类型 | 含义 |
|---|---|---|
id |
int PK | 邮件 ID |
messageType |
tinyint | MailMessageType |
stationery |
tinyint | 信纸样式 Stationery.dbc |
mailTemplateId |
smallint | 非 0 时正文来自模板,subject/body 可空 |
sender |
int | 发件者:玩家 guid 或生物 entry(视 type) |
receiver |
int | 收件人 → characters.guid |
subject |
longtext | 标题 |
body |
longtext | 正文 |
has_items |
tinyint | 是否有附件 |
expire_time |
int | 过期 Unix 时间 |
deliver_time |
int | 送达 Unix 时间 |
money |
int | 附带铜币 |
cod |
int | 到付铜币 |
checked |
tinyint | MailCheckMask |
MailMessageType:0 NORMAL,2 AUCTION,3 CREATURE,4 GAMEOBJECT,5 CALENDAR。MailCheckMask:1 READ,2 RETURNED,4 COPIED,8 COD_PAYMENT,16 HAS_BODY。
样本:NPC 模板信 mailTemplateId=232,送达时间 = Level 20 成就同一秒,30 天过期,已读。
18. 表关系总览
18.1 总图
erDiagram
characters ||--o{ character_account_data : guid
characters ||--o{ character_achievement : guid
characters ||--o{ character_achievement_progress : guid
characters ||--o{ character_action : guid
characters ||--o{ character_aura : guid
characters ||--o{ character_glyphs : guid
characters ||--|| character_homebind : guid
characters ||--o{ character_inventory : guid
characters ||--o{ character_queststatus : guid
characters ||--o{ character_queststatus_rewarded : guid
characters ||--o{ character_queststatus_seasonal : guid
characters ||--o{ character_reputation : guid
characters ||--o{ character_skills : guid
characters ||--o{ character_spell : guid
characters ||--o{ character_talent : guid
characters ||--o{ mail : "receiver"
characters ||--o{ item_instance : "owner_guid"
character_inventory }o--|| item_instance : "item"
character_inventory }o--o| item_instance : "bag"
18.2 按子系统
flowchart TB
chars[characters]
subgraph progress[进度]
ach[achievement]
achp[achievement_progress]
qr[quest rewarded]
qs[quest status]
qss[quest seasonal]
rep[reputation]
end
subgraph power[能力]
sp[spell]
tal[talent]
sk[skills]
gl[glyphs]
act[action]
end
subgraph assets[资产]
inv[inventory]
ii[item_instance]
mail[mail]
end
subgraph client[客户端与现场]
ad[account_data]
au[aura]
hb[homebind]
end
chars --> progress
chars --> power
chars --> assets
chars --> client
inv --> ii
18.3 引用规则
- 扩展表
guid→characters.guid character_inventory.item→item_instance.guidcharacter_inventory.bag→item_instance.guid(0=身体)item_instance.owner_guid/creatorGuid→characters.guidmail.receiver→characters.guidequipmentCache/taximask/exploredZones是主表冗余,无外键
pdump load 按 DTT_CHARACTER / DTT_INVENTORY / DTT_ITEM / DTT_MAIL 等类型级联改 GUID。
19. 交叉分析:角色故事
19.1 身份与时间
血精灵女法师「大法师」,guid 1002,账号 101;29 级,休息态,藏头盔披风;建号约 25 天、在线 34.2 小时。
19.2 练级路线
flowchart LR
A[永歌/幽魂] --> B[卡利姆多任务]
B --> C[RFC]
C --> D[WC]
D --> E[SFK]
E --> F[Deadmines]
F --> G[BFD]
G --> H[Stockades]
H --> I[贫瘠/千针]
I --> J[炉石: 乱风岗]
19.3 战斗 / 专业 / 经济
- 天赋冰系为主;动作条冰火混用练级键位
- Engineering 225 + Tailoring 220 + Alchemy 210 + First Aid 225
- 现金 209 金,自产统计约 62 金 → 外部供血
- 悬空物品 2、自定义任务 90000、四只大包 23162:私服痕迹
19.4 数据质量
| 现象 | 说明 |
|---|---|
| 悬空 item 2 件 | 有实体无槽位 |
| 三主要专业 | 超官方默认 2 门 |
power4=100 |
法师无意义残留 |
watchedFaction=-1 |
未追踪声望 |
| quest 90000 | 世界库无模板 |
20. 实操:怎么自己拆 pdump
- 统计表行数:提取每条
INSERT INTO的表名后计数 - 按表过滤主表 / 天赋 / 物品
- 时间戳:
date -r 1784122746(macOS)或date -d @1784122746(Linux) - 铜币:
g=money//10000, s=money%10000//100, c=money%100→2096484 = 209g 64s 84c
推荐 Python 解析:
- 正则抓
INSERT INTO table (cols) VALUES (vals) - 手写抗引号/换行的值解析器
item_instance建字典,扫character_inventory还原栏位item_template/ DBC 翻译名字
注意:不要直接灌库;大文本字段边界要小心;enchantments 36 token 按 3 一组;任务 status 勿记反。
21. 源码与库表索引
| 主题 | 位置 |
|---|---|
| pdump 导出/导入 | src/server/game/Tools/PlayerDump.cpp |
| 命令注册 | src/server/scripts/Commands/cs_character.cpp |
| 角色保存 | src/server/game/Entities/Player/PlayerStorage.cpp |
| 装备槽 / 动作条 | src/server/game/Entities/Player/Player.h |
| 物品附魔槽 | src/server/game/Entities/Item/Item.h |
| 任务状态 | src/server/game/Quests/QuestDef.h |
| 邮件 | src/server/game/Mails/Mail.h |
| AccountData | src/server/game/Server/WorldSession.h |
| 声望 flags | src/server/shared/DataStores/DBCEnums.h |
| 建表 | data/sql/base/db_characters/*.sql |
| 物品模板 | data/sql/base/db_world/item_template.sql |
22. 小结
pdump 表面上是一堆 INSERT,实际是一张以 characters.guid 为根的对象图:
- 进度:成就、任务、声望、探索、飞行点
- 能力:法术、天赋、技能、雕文、动作条
- 资产:钱、物品实体、容器嵌套、邮件
- 客户端:CVar 与聊天布局
- 现场:光环、位置、炉石、休息值
把「大法师」这份 29 级样本走通后,再拆其它号通常只差:有无宠物/邮件附件/装备方案、专业与任务段、物品规模、是否双天赋。理解这 18 张表后,角色迁移、坏号修复、刷物品排查都会从「猜字段」变成「按图索骥」。