character_spell 角色法术表

存储角色已学会的所有法术/技能记录

官方文档来源

表概述

character_spell 表是管理角色全部已知法术的核心数据表。每一行代表角色学会了某个法术(或技能),包括职业技能、天赋技能、专业技能、物品附带的技能等。

通过 specMask 字段支持双天赋系统中的天赋专属法术标记,这是 WotLK 3.3.5 的重要特性。角色切换天赋后,服务器会根据 specMask 判断哪些法术在当前天赋下可见/可用。

法术的 active/enabled 状态由 SpellSystem 运行时管理(冷却时间在 character_spell_cooldown 表中),而不是由本表直接控制。character_spell 使用联合主键 (guid, spell),每个角色的每个法术只有一条记录。

表结构

字段名类型说明
guidINT UNSIGNED角色全局唯一标识符(联合主键)
spellINT UNSIGNED法术ID(联合主键,对应 Spell.dbc 中的 ID)
specMaskTINYINT 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,请确保角色处于离线状态。