character_spell 角色法术表
存储角色已学会的所有法术/技能记录
官方文档来源表概述
character_spell 表是管理角色全部已知法术的核心数据表。每一行代表角色学会了某个法术(或技能),包括职业技能、天赋技能、专业技能、物品附带的技能等。
通过 specMask 字段支持双天赋系统中的天赋专属法术标记,这是 WotLK 3.3.5 的重要特性。角色切换天赋后,服务器会根据 specMask 判断哪些法术在当前天赋下可见/可用。
法术的 active/enabled 状态由 SpellSystem 运行时管理(冷却时间在 character_spell_cooldown 表中),而不是由本表直接控制。character_spell 使用联合主键 (guid, spell),每个角色的每个法术只有一条记录。
表结构
| 字段名 | 类型 | 说明 |
|---|---|---|
| guid | INT UNSIGNED | 角色全局唯一标识符(联合主键) |
| spell | INT UNSIGNED | 法术ID(联合主键,对应 Spell.dbc 中的 ID) |
| specMask | TINYINT UNSIGNED | 天赋掩码(标记该法术属于哪个天赋专精) |
核心字段说明
specMask 天赋掩码详解
| specMask 值 | 含义 | 说明 |
|---|---|---|
| 0 | 无天赋限制 | 所有天赋下均不可用(通常是被禁用的法术) |
| 1 | 天赋1专有 | 仅在第一天赋(主天赋)下可见 |
| 2 | 天赋2专有 | 仅在第二天赋(副天赋)下可见 |
| 3 | 两个天赋共用 | 在两个天赋下都可见(默认值,大部分通用技能) |
specMask 默认值为 1。在角色重置天赋或学习新天赋时会更新对应的 specMask,大多数通用技能最终会被设为 3。
法术 active/enabled 状态管理
character_spell 表只记录角色是否学会了某个法术。法术的 active 和 enabled 状态由以下机制管理:SpellBook 系统管理技能书显示、character_spell_cooldown 表记录冷却、天赋系统根据 specMask 判断可用性、Spell.dbc 的 RequiredLevel 和 ClassMask 控制等级/职业限制。
与 character_talent 的区别
character_spell 存储所有已学法术(包括职业基础技能),而 character_talent 仅存储天赋系统中的法术。天赋法术会同时出现在两个表中。查询角色真正能使用的所有法术应使用 character_spell 表并根据 specMask 过滤。
实际案例
查看角色已学的所有法术
-- 查询指定角色学会的所有法术,包含天赋归属标记
SELECT spell, specMask,
CASE specMask
WHEN 0 THEN '禁用'
WHEN 1 THEN '天赋1'
WHEN 2 THEN '天赋2'
WHEN 3 THEN '双天赋通用'
END AS 天赋归属
FROM character_spell
WHERE guid = 1
ORDER BY spell;给角色添加/移除法术
-- 手动给角色添加一个法术(通常使用 .learn GM命令更安全)
INSERT INTO character_spell (guid, spell, specMask)
VALUES (1, 33388, 3);
-- 移除某个法术(角色需离线)
DELETE FROM character_spell
WHERE guid = 1 AND spell = 33388;统计每个角色学会的法术数量
-- 统计所有角色学会的法术数量
SELECT c.name, c.level, COUNT(cs.spell) AS 法术数量
FROM character_spell cs
JOIN characters c ON c.guid = cs.guid
GROUP BY cs.guid
ORDER BY 法术数量 DESC
LIMIT 20;常见问题
Q1: character_spell 表中没有 active/enabled 字段,如何判断法术是否可用?
法术的可用性由运行时系统综合判断。需检查:等级/职业要求、冷却状态、天赋专精(specMask与当前天赋匹配)、资源/条件是否满足。直接查询 character_spell 只能确认角色已学会该法术。
Q2: specMask 值为 0 的法术会怎样?
specMask=0 的法术在任何天赋下都无法使用。这通常发生在角色重置天赋后,之前天赋树中的法术被标记为不可用。建议通过正常游戏机制(重新点天赋)来处理。
Q3: 手动 INSERT 法术到 character_spell 表是否安全?
不推荐直接 INSERT,可能导致数据不一致。建议使用 GM命令 .learn 来添加法术,该命令会处理所有必要的辅助操作。如果必须使用 SQL,请确保角色处于离线状态。