Hello World

吞风吻雨葬落日 欺山赶海踏雪径

0%

AzerothCore pdump 文件分析

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
2
IMPORTANT NOTE: THIS DUMPFILE IS MADE FOR USE WITH THE 'PDUMP' COMMAND ONLY
DO NOT apply it directly - it will irreversibly DAMAGE and CORRUPT your database!

必须通过 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
2
3
.character pdump write <file> <player>
.character pdump load <file> <account> [new_name] [new_guid]
.character pdump copy <player> <account> [new_name] [new_guid]

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
2
3
race=10  → RACE_BLOODELF  血精灵
class=8 → CLASS_MAGE 法师
gender=1 → GENDER_FEMALE 女性

种族与职业并非任意组合。服务端创建角色时会查 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
2
3
4
PlayerFlags:     HIDE_HELM=0x400, HIDE_CLOAK=0x800, RESTING=0x20, GM=0x8 ...
PlayerExtraFlags: GM_ON=0x1, ACCEPT_WHISPERS=0x4, TAXICHEAT=0x8, GM_INVISIBLE=0x10 ...
AtLoginFlags: RENAME=0x1, RESET_SPELLS=0x2, RESET_TALENTS=0x4, CUSTOMIZE=0x8 ...
RestState: RESTED=1, NOT_RAF_LINKED=2, TIRED=3, EXHAUSTED=5 ...

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
2
3
4
5
6
7
equipmentManager=1
nameplateShowEnemies=1
showKeyring=1
playerStatLeftDropdown=PLAYERSTAT_BASE_STATS
playerStatRightDropdown=PLAYERSTAT_SPELL_COMBAT
lfgSelectedRoles=9
minimapTrackedInfo=MINIMAP_TRACKING_VENDOR_FOOD

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
2
3
4
caster=505       spell=1245 +20耐力  30min  NPC 耐力
caster=1002 spell=1461 +15智力 30min Arcane Intellect
caster=1002 spell=7301 +200护甲 30min Frost Armor
caster=1002+item spell=3166 +7精神 ~16min 物品触发

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
2
36538 Clarice's Pendant (6145)
36539 Samophlange (5054)

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
2
11859 Honor the Flame   event=1
11915 Playing with Fire 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
2
3
Hated < -6000 ≤ Hostile < -3000 ≤ Unfriendly < 0
≤ Neutral < 3000 ≤ Friendly < 9000 ≤ Honored
< 21000 ≤ Revered < 42000 ≤ Exalted

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 引用规则

  1. 扩展表 guid → characters.guid
  2. character_inventory.item → item_instance.guid
  3. character_inventory.bag → item_instance.guid(0=身体)
  4. item_instance.owner_guid / creatorGuid → characters.guid
  5. mail.receiver → characters.guid
  6. equipmentCache / 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

  1. 统计表行数:提取每条 INSERT INTO 的表名后计数
  2. 按表过滤主表 / 天赋 / 物品
  3. 时间戳:date -r 1784122746(macOS)或 date -d @1784122746(Linux)
  4. 铜币:g=money//10000, s=money%10000//100, c=money%100 → 2096484 = 209g 64s 84c

推荐 Python 解析:

  1. 正则抓 INSERT INTO table (cols) VALUES (vals)
  2. 手写抗引号/换行的值解析器
  3. item_instance 建字典,扫 character_inventory 还原栏位
  4. 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 张表后,角色迁移、坏号修复、刷物品排查都会从「猜字段」变成「按图索骥」。