表概述

achievement_criteria_data表配合 achievement_criteria_dbc 使用,为成就条件提供额外的数据类型和数值约束。当成就条件的Type无法直接确定具体目标时(如"击杀某生物"需要指定具体生物ID),此表提供精确的补充数据。

主键为 (criteria_id, type) 的组合索引,同一条件条目可以有多个不同类型的补充数据。

表结构

字段名数据类型默认值说明
criteria_idINTNOT NULL条件条目ID,对应achievement_criteria_dbc.ID
typeTINYINT UNSIGNED0数据类型,定义value1/value2的含义
value1INT UNSIGNED0根据type变化的数据值1
value2INT UNSIGNED0根据type变化的数据值2
ScriptNameCHAR(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];