achievement_criteria_data 表
achievement_criteria_data表是成就系统的核心扩展表,为成就条件提供额外的上下文数据,如指定需要击杀的具体生物、收集的物品、完成的任务等。
表概述
achievement_criteria_data表配合 achievement_criteria_dbc 使用,为成就条件提供额外的数据类型和数值约束。当成就条件的Type无法直接确定具体目标时(如"击杀某生物"需要指定具体生物ID),此表提供精确的补充数据。
主键为 (criteria_id, type) 的组合索引,同一条件条目可以有多个不同类型的补充数据。
表结构
| 字段名 | 数据类型 | 默认值 | 说明 |
|---|---|---|---|
| criteria_id | INT | NOT NULL | 条件条目ID,对应achievement_criteria_dbc.ID |
| type | TINYINT UNSIGNED | 0 | 数据类型,定义value1/value2的含义 |
| value1 | INT UNSIGNED | 0 | 根据type变化的数据值1 |
| value2 | INT UNSIGNED | 0 | 根据type变化的数据值2 |
| ScriptName | CHAR(64) | '' | C++脚本名称,用于自定义条件逻辑 |
重要字段详解
criteria_id (条件条目ID)
对应achievement_criteria_dbc表中的ID值。每个criteria_id代表一个具体的成就条件(如"获得某物品100个"、"击杀某BOSS"等)。
该字段与type共同组成主键,允许同一条件有多条不同类型的补充数据。
type (数据类型)
定义value1和value2的具体含义。常见的type值包括:
- 0 - ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE
- 1 - ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE (value1=生物ID)
- 2 - ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS (value1=职业)
- 3 - ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_RACE (value1=种族)
- 5 - ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH (value1=血量百分比)
- 6 - ACHIEVEMENT_CRITERIA_DATA_TYPE_DEAD (value1=是否死亡)
- 7 - ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_DIFFICULTY (value1=地图难度)
- 8 - ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT (value1=玩家人数)
- 9 - ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM (value1=队伍类型)
- 12 - ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EXPLORE_MAP (value1=areaID)
- 16 - ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL (value1=等级)
- 17 - ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER (value1=性别)
ScriptName (自定义脚本)
当默认条件类型无法满足需求时,通过ScriptName引用C++脚本实现自定义条件逻辑。
常见脚本名如:
achievement_criteria_failed_kill- 失败击杀条件achievement_criteria_no_spell_hit- 未被法术命中条件achievement_criteria_no_player_death- 无玩家死亡条件
实战案例
查询"冰冻废土的勇士"成就所需击杀的BOSS:
SELECT acd.criteria_id, acd.type, acd.value1 AS creature_entry, ct.name
FROM achievement_criteria_data acd
JOIN creature_template ct ON acd.value1 = ct.entry
WHERE acd.type = 1
AND acd.criteria_id IN (
SELECT ID FROM achievement_criteria_dbc
WHERE Achievement_Id IN (
SELECT ID FROM achievement_dbc WHERE Title_Lang_zhCN LIKE '%冰冻废土%'
)
);
查询所有需要特定玩家数量的成就条件:
SELECT criteria_id, type, value1 AS player_count
FROM achievement_criteria_data
WHERE type = 8
ORDER BY value1;
添加自定义击杀条件(击杀特定生物ID=12345):
INSERT INTO achievement_criteria_data (criteria_id, type, value1, value2, ScriptName)
VALUES (10001, 1, 12345, 0, '');
常见问题
Q: type字段的值分别代表什么含义?
type字段定义了value1和value2的数据类型含义。完整列表可以参考AzerothCore源码中的 AchievementCriteriaDataType 枚举。常用的type值包括生物击杀(type=1)、职业(type=2)、种族(type=3)、地图探索(type=12)等。
Q: 如何查找某个成就的所有条件数据?
可以通过JOIN achievement_criteria_dbc表来查询:
SELECT acd.*
FROM achievement_criteria_data acd
JOIN achievement_criteria_dbc ac ON acd.criteria_id = ac.ID
WHERE ac.Achievement_Id = [成就ID];