表概述

character_talent 表记录了每个角色已学习的所有天赋技能。在魔兽世界3.3.5版本中,每个职业有三个天赋专精树,角色通过升级获得天赋点数,添加到天赋树中即可学习对应的天赋技能。

复合主键为 (guid, spell)。specMask 字段用于区分双天赋(主天赋和副天赋)。

表结构

字段名类型默认值说明
guidint UNSIGNEDNOT NULL角色GUID(复合主键)
spellint UNSIGNEDNOT NULL天赋技能ID(复合主键,关联Spell.dbc)
specMasktinyint UNSIGNED0天赋专精掩码(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 = 要重置的天赋掩码;。注意还需要清除相关的技能和光环记录以确保一致性。