表概述
character_talent 表记录了每个角色已学习的所有天赋技能。在魔兽世界3.3.5版本中,每个职业有三个天赋专精树,角色通过升级获得天赋点数,添加到天赋树中即可学习对应的天赋技能。
- 天赋点分配记录
- 双天赋管理
- 天赋洗点追踪
- 天赋技能验证
复合主键为 (guid, spell)。specMask 字段用于区分双天赋(主天赋和副天赋)。
表结构
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| guid | int UNSIGNED | NOT NULL | 角色GUID(复合主键) |
| spell | int UNSIGNED | NOT NULL | 天赋技能ID(复合主键,关联Spell.dbc) |
| specMask | tinyint UNSIGNED | 0 | 天赋专精掩码(1=主天赋,2=副天赋) |
实际案例
案例1:查询指定角色的所有天赋
SELECT
ct.spell, ct.specMask,
CASE ct.specMask
WHEN 1 THEN '主天赋'
WHEN 2 THEN '副天赋'
ELSE '未分类'
END AS spec_name
FROM character_talent ct
WHERE ct.guid = 100
ORDER BY ct.specMask, ct.spell;案例2:统计使用双天赋的角色数量
SELECT
SUM(CASE WHEN spec_mask & 1 > 0 THEN 1 ELSE 0 END) AS has_primary,
SUM(CASE WHEN spec_mask & 2 > 0 THEN 1 ELSE 0 END) AS has_secondary,
SUM(CASE WHEN spec_mask = 3 THEN 1 ELSE 0 END) AS has_dual_spec
FROM (
SELECT guid, BIT_OR(specMask) AS spec_mask
FROM character_talent
GROUP BY guid
) t;案例3:查询某职业角色的天赋选择热门排名
SELECT
ct.spell,
COUNT(*) AS learner_count,
ROUND(COUNT(*) * 100.0 / (
SELECT COUNT(DISTINCT guid) FROM characters WHERE class = 1
), 1) AS popularity_pct
FROM character_talent ct
JOIN characters c ON c.guid = ct.guid
WHERE c.class = 1
GROUP BY ct.spell
ORDER BY learner_count DESC
LIMIT 10;常见问题
Q1: specMask 字段如何使用?
specMask 使用位掩码标识天赋所属:
1=主天赋(第一套),2=副天赋(第二套,需要双天赋专精)。当角色开启双天赋后,天赋点会分别记录到不同的specMask中。Q2: character_talent 和 character_spell 有什么区别?
character_talent 只存储天赋树中的技能(通过天赋点加出来的技能),character_spell 存储角色已学的所有技能(包括训练师学习的技能、被动技能等)。部分天赋技能会同时出现在两个表中。
Q3: 如何重置一个角色的天赋?
最简单的方式:
DELETE FROM character_talent WHERE guid = 角色GUID AND specMask = 要重置的天赋掩码;。注意还需要清除相关的技能和光环记录以确保一致性。