character_achievement 角色成就表
记录角色已获得的所有成就及完成时间
官方文档来源表概述
character_achievement 表记录每个角色已获得的成就。当玩家完成某个成就条件后,服务器会在此表中插入一条记录,标记成就ID和完成时间。这是魔兽世界成就系统的核心数据表。
通过 achievement 字段关联 Achievement.dbc 获取成就的详细信息。date 字段使用 Unix 时间戳格式记录成就获得的具体时间。
与该表配合的还有 character_achievement_progress(进度型成就的当前进度)和 character_achievement_offline_updates(离线成就更新队列)。character_achievement 使用联合主键 (guid, achievement),一旦插入表示该成就已永久获得。
表结构
| 字段名 | 类型 | 说明 |
|---|---|---|
| guid | INT UNSIGNED | 角色全局唯一标识符(联合主键) |
| achievement | SMALLINT UNSIGNED | 成就ID(联合主键,对应 Achievement.dbc) |
| date | INT UNSIGNED | 成就获得时间(Unix时间戳) |
核心字段说明
achievement 成就ID
| 成就ID范围 | 类别 | 示例 |
|---|---|---|
| 1~499 | 普通/总览 | 6: 等级10, 7: 等级20, 8: 等级30 |
| 500~999 | 任务相关 | 503: 完成50个任务, 978: 完成3000个任务 |
| 1000~1499 | 探索/PvP | 1005: 卡利姆多博学者 |
| 1500~2499 | 地下城与团队 | 2136: 英雄的荣耀 |
| 2500~2999 | 专业技能 | 2556: 锻造450 |
| 3000~3499 | 世界事件 | 3456: 爱情冲撞 |
date 时间戳
date 为整数型的 Unix 时间戳,可以使用 FROM_UNIXTIME(date) 转换为可读的日期时间格式。通过 date 字段可以分析成就获取的时间分布。
与 character_achievement_progress 的区别
character_achievement 只记录已完成的成就。对于有进度的成就(如"收集XX种宠物"),当前进度存储在 character_achievement_progress 表中。只有当进度达到目标值后,才会在 character_achievement 表中插入完成记录。
实际案例
查看角色获得的所有成就
-- 查询指定角色的所有成就及获取时间
SELECT achievement AS 成就ID,
FROM_UNIXTIME(date) AS 获得时间
FROM character_achievement
WHERE guid = 1
ORDER BY date DESC
LIMIT 20;统计角色的成就数量
-- 统计成就数量最多的前10名角色
SELECT c.name, c.level, COUNT(ca.achievement) AS 成就数量
FROM character_achievement ca
JOIN characters c ON c.guid = ca.guid
GROUP BY ca.guid
ORDER BY 成就数量 DESC
LIMIT 10;查找特定成就的首批获得者
-- 查找"英雄的荣耀"成就的最早获得者
SELECT c.name, achievement,
FROM_UNIXTIME(date) AS 获得时间
FROM character_achievement ca
JOIN characters c ON c.guid = ca.guid
WHERE achievement = 2136
ORDER BY date ASC
LIMIT 5;常见问题
Q1: 能否给角色手动添加/删除成就?
可以。添加:INSERT INTO character_achievement (guid, achievement, date) VALUES (GUID, 成就ID, UNIX_TIMESTAMP())。建议使用 GM命令 .achievement add 成就ID 更安全。删除需角色离线。
Q2: date 字段值为 0 代表什么?
date=0 通常表示该成就的获取时间未被正确记录。可能是通过数据库手动插入时未指定 date 值,或早期的服务器版本未正确记录时间。这不影响成就的有效性。
Q3: 如何实现"服务器首次"成就?
AzerothCore 支持服务器首次成就。实现机制:在 achievement_reward 表中配置对应的奖励。游戏逻辑会检查 achievement 表中是否存在该成就的任何记录——如果没有,第一个完成的玩家获得"服务器首次"标记。