character_aura 光环效果表
存储角色身上所有光环效果的详细信息
官方文档来源表概述
character_aura 表是 Characters 数据库中最复杂也是最重要的表之一,用于持久化存储角色离线后需要保留的所有光环(Aura)效果数据。
当角色登录时,服务器会从该表读取所有光环并重新应用到角色身上;当角色下线时,所有需要持久化的光环数据会写入此表。光环来源包括:装备效果、天赋、附魔、Buff、Debuff、物品使用效果等。
通过 casterGuid 字段可以区分光环的来源——是角色自身施加的、来自队友的还是来自怪物的。该表的复合主键为 (guid, casterGuid, itemGuid, spell, effectMask),同一个角色从不同施法者获得的同一个法术光环会存储为不同记录。
表结构
| 字段名 | 类型 | 说明 |
|---|---|---|
| guid | INT UNSIGNED | 角色GUID(光环承载者,联合主键) |
| casterGuid | BIGINT UNSIGNED | 施法者完整GUID(用于区分光环来源,联合主键) |
| itemGuid | BIGINT UNSIGNED | 物品GUID(如果光环来自物品,联合主键) |
| spell | INT UNSIGNED | 法术ID(光环对应的法术,联合主键) |
| effectMask | TINYINT UNSIGNED | 效果掩码(标记启用了法术的哪些effect索引,联合主键) |
| recalculateMask | TINYINT UNSIGNED | 重算掩码(标记哪些effect需要重新计算) |
| stackCount | TINYINT UNSIGNED | 光环堆叠层数 |
| amount0 | INT | 效果0的当前数值 |
| amount1 | INT | 效果1的当前数值 |
| amount2 | INT | 效果2的当前数值 |
| base_amount0 | INT | 效果0的基础数值(未经修正) |
| base_amount1 | INT | 效果1的基础数值(未经修正) |
| base_amount2 | INT | 效果2的基础数值(未经修正) |
| maxDuration | INT | 最大持续时间(毫秒) |
| remainTime | INT | 剩余时间(毫秒) |
| remainCharges | TINYINT UNSIGNED | 剩余充能次数 |
核心字段说明
casterGuid 施法者来源鉴别
| casterGuid 值 | 来源 | 典型场景 |
|---|---|---|
| 等于 guid | 角色自身 | 天赋/被动技能、自身Buff |
| 0 或 其他角色GUID | 其他玩家 | 队友Buff(耐力、智力等) |
| 宠物/NPC GUID | 怪物或宠物 | 怪物Debuff、猎人宠物Buff |
| 对应 itemGuid | 装备物品 | 饰品触发效果、武器附魔触发 |
effectMask 和 recalculateMask
effectMask 使用位标志表示法术的哪些效果(Effect 0/1/2)处于激活状态。如值 7 (0b111) 表示三个效果全部激活,值 1 (0b001) 表示只有效果0激活。recalculateMask 标记哪些 effect 需要在下次重新计算。
amount 和 base_amount 的区别
base_amount 是光环的原始基础值,amount 是经过角色属性、天赋加成、法伤系数等修正后的实际值。每个法术最多有3个效果(effect 0/1/2),分别对应 amount0/base_amount0、amount1/base_amount1、amount2/base_amount2。
实际案例
查看角色身上的所有光环
-- 查询指定角色所有光环,含来源和剩余时间
SELECT spell, stackCount, remainTime, maxDuration,
CASE
WHEN casterGuid = guid THEN '自身'
WHEN casterGuid = itemGuid THEN '物品'
ELSE '其他来源'
END AS 来源类型
FROM character_aura
WHERE guid = 1
ORDER BY remainTime DESC;查看光环的具体效果数值
-- 查看某个法术光环的详细效果,区分基础值和实际值
SELECT spell, stackCount,
base_amount0 AS 基础值0, amount0 AS 实际值0,
base_amount1 AS 基础值1, amount1 AS 实际值1,
effectMask, remainTime
FROM character_aura
WHERE guid = 1 AND spell = 61316;清除角色的特定光环(修复异常状态)
-- 先查看角色身上由NPC施加的异常Debuff光环
SELECT spell, remainTime, stackCount
FROM character_aura
WHERE guid = 1
AND casterGuid != guid
AND maxDuration > 0;
-- 确认后执行删除(角色需离线)
DELETE FROM character_aura
WHERE guid = 1 AND spell = 12345;常见问题
Q1: 为什么某些光环在线时有效,但重启服务器后消失?
这是因为光环的持久化属性未设置。只有在 Spell.dbc 中设置了相关持久化标志的光环,才会在角色下线时写入 character_aura 表。如果光环没有持久化属性,重启后不会自动恢复。
Q2: casterGuid 和 guid 相同时代表什么?
表示光环是由角色自身施放的,包括被动天赋光环(如武器专精)、主动自身Buff(如法师的冰甲术)等。如果 casterGuid=0,通常表示该光环不需要关联特定施法者。
Q3: effectMask 字段为什么需要作为主键?
因为同一个法术可以有多个 effect 索引激活,并且不同 effect 组合可能需要独立存储。例如某个光环先激活 effect 0 和 1(effectMask=3),后来又激活了 effect 2(effectMask=7),两者可能被存储为不同的记录。