📖 character_spell_cooldown 表
角色技能冷却记录表,存储角色在下线时尚未完成冷却的技能和物品冷却数据。
📋 表概述
character_spell_cooldown 表用于保存角色技能和物品的冷却状态。当角色下线时,尚在冷却中的技能/物品时间会被保存到此表,下次登录时恢复冷却状态,确保冷却时间跨会话一致。
- 主键:(guid, spell)
- 引擎:InnoDB
- 关联表:characters(guid)、character_spell
📊 表结构
| 字段名 | 数据类型 | 默认值 | 说明 |
|---|---|---|---|
guid | int UNSIGNED | 0 | 角色GUID(低位) |
spell | int UNSIGNED | 0 | 技能ID |
category | int UNSIGNED | 0 | 技能冷却类别ID(共享冷却组) |
item | int UNSIGNED | 0 | 物品ID(如果是物品技能冷却) |
time | int UNSIGNED | 0 | 技能冷却结束的 Unix 时间戳 |
needSend | tinyint UNSIGNED | 1 | 是否需要向客户端发送冷却数据 |
🔍 重要字段详解
time — 冷却结束时间
Unix 时间戳,表示技能冷却何时结束。玩家登录时系统读取该值,如果大于当前时间则在客户端显示剩余冷却时间。冷却过的记录会被自动清除。
category — 冷却类别
共享冷却组标识。同一类别的多个技能共享冷却时间(例如战士的所有攻击技能可能共享同一类别的冷却)。0 表示独立冷却。
item — 物品标识
当冷却来源于物品使用时(如药水、饰品),该字段存储物品的 entry ID。0 表示该冷却来自职业技能而非物品。
💡 SQL查询示例
查询某个角色当前仍在冷却中的所有技能
SELECT guid, spell, category, item,
FROM_UNIXTIME(time) AS 冷却结束时间,
CASE WHEN time > UNIX_TIMESTAMP() THEN '冷却中' ELSE '已就绪' END AS 状态
FROM character_spell_cooldown
WHERE guid = 12345
ORDER BY time;
清除某个角色的所有技能冷却(暴力重置)
DELETE FROM character_spell_cooldown WHERE guid = 12345;
❓ 常见问题
Q: 为什么我下线后再上线,有些技能冷却被重置了?
如果 time 字段对应的冷却时间在上线时已经过期,系统会自动清理这些记录。这是正常的,已过期的冷却不会在登录时恢复。
Q: needSend 字段有什么作用?
该字段控制是否需要将冷却数据同步到客户端。某些冷却(如服务端侧的 DB 记录)可能不需要通知客户端,此时 needSend=0 可以避免不必要的网络开销。