character_achievement 角色成就表

记录角色已获得的所有成就及完成时间

官方文档来源

表概述

character_achievement 表记录每个角色已获得的成就。当玩家完成某个成就条件后,服务器会在此表中插入一条记录,标记成就ID和完成时间。这是魔兽世界成就系统的核心数据表。

通过 achievement 字段关联 Achievement.dbc 获取成就的详细信息。date 字段使用 Unix 时间戳格式记录成就获得的具体时间。

与该表配合的还有 character_achievement_progress(进度型成就的当前进度)和 character_achievement_offline_updates(离线成就更新队列)。character_achievement 使用联合主键 (guid, achievement),一旦插入表示该成就已永久获得。

表结构

字段名类型说明
guidINT UNSIGNED角色全局唯一标识符(联合主键)
achievementSMALLINT UNSIGNED成就ID(联合主键,对应 Achievement.dbc)
dateINT UNSIGNED成就获得时间(Unix时间戳)

核心字段说明

achievement 成就ID

成就ID范围类别示例
1~499普通/总览6: 等级10, 7: 等级20, 8: 等级30
500~999任务相关503: 完成50个任务, 978: 完成3000个任务
1000~1499探索/PvP1005: 卡利姆多博学者
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 表中是否存在该成就的任何记录——如果没有,第一个完成的玩家获得"服务器首次"标记。