diff options
| -rw-r--r-- | sql/updates/world/4.x/2011_12_26_00_world_achievement_criteria_data.sql | 3 | ||||
| -rwxr-xr-x | src/server/game/Achievements/AchievementMgr.cpp | 111 | ||||
| -rwxr-xr-x | src/server/game/Achievements/AchievementMgr.h | 31 | ||||
| -rwxr-xr-x | src/server/game/DataStores/DBCEnums.h | 99 | ||||
| -rwxr-xr-x | src/server/game/DataStores/DBCStructure.h | 4 | 
5 files changed, 136 insertions, 112 deletions
diff --git a/sql/updates/world/4.x/2011_12_26_00_world_achievement_criteria_data.sql b/sql/updates/world/4.x/2011_12_26_00_world_achievement_criteria_data.sql new file mode 100644 index 00000000000..0f2936634fb --- /dev/null +++ b/sql/updates/world/4.x/2011_12_26_00_world_achievement_criteria_data.sql @@ -0,0 +1,3 @@ +-- Remove unneeded achievement criteria datas for implemented DBC conditions: +-- TYPE_T_PLAYER_DEAD 4, TYPE_S_AREA 6, TYPE_MAP_DIFFICULTY 12, TYPE_MAP_ID 20 +DELETE FROM achievement_criteria_data WHERE `type` IN (4, 6, 12, 20); diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index abbf36f0c3d..8cf4d4efb59 100755 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -155,14 +155,6 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)                  return false;              }              return true; -        case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD: -            if (player_dead.own_team_flag > 1) -            { -                sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD (%u) has wrong boolean value1 (%u).", -                    criteria->ID, criteria->requiredType, dataType, player_dead.own_team_flag); -                return false; -            } -            return true;          case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA:          case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA:          { @@ -187,14 +179,6 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)              }              return true;          } -        case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA: -            if (!GetAreaEntryByAreaID(area.id)) -            { -                sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA (%u) has wrong area id in value1 (%u), ignored.", -                    criteria->ID, criteria->requiredType, dataType, area.id); -                return false; -            } -            return true;          case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL:              if (level.minlevel > STRONG_MAX_LEVEL)              { @@ -219,14 +203,6 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)                  return false;              }              return true; -        case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_DIFFICULTY: -            if (difficulty.difficulty >= MAX_DIFFICULTY) -            { -                sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_DIFFICULTY (%u) has wrong difficulty in value1 (%u), ignored.", -                    criteria->ID, criteria->requiredType, dataType, difficulty.difficulty); -                return false; -            } -            return true;          case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT:              if (map_players.maxcount <= 0)              { @@ -269,14 +245,6 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)                  return false;              }              return true; -        case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID: -            if (!sMapStore.LookupEntry(map_id.mapId)) -            { -                sLog->outErrorDb("Table `achievement_criteria_requirement` (Entry: %u Type: %u) for requirement ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID (%u) has unknown map id in value1 (%u), ignored.", -                    criteria->ID, criteria->requiredType, dataType, map_id.mapId); -                return false; -            } -            return true;          default:              sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) has data for non-supported data type (%u), ignored.", criteria->ID, criteria->requiredType, dataType);              return false; @@ -305,21 +273,8 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un              if (!target || target->GetTypeId() != TYPEID_PLAYER)                  return false;              return !target->HealthAbovePct(health.percent); -        case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD: -            if (target && !target->isAlive()) -                if (const Player* player = target->ToPlayer()) -                    if (player->GetDeathTimer() != 0) -                        // flag set == must be same team, not set == different team -                        return (player->GetTeam() == source->GetTeam()) == (player_dead.own_team_flag != 0); -            return false;          case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA:              return source->HasAuraEffect(aura.spell_id, aura.effect_idx); -        case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA: -        { -            uint32 zone_id, area_id; -            source->GetZoneAndAreaId(zone_id, area_id); -            return area.id == zone_id || area.id == area_id; -        }          case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA:              return target && target->HasAuraEffect(aura.spell_id, aura.effect_idx);          case ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE: @@ -334,11 +289,6 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un              return target->getGender() == gender.gender;          case ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT:              return sScriptMgr->OnCriteriaCheck(this, const_cast<Player*>(source), const_cast<Unit*>(target)); -        case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_DIFFICULTY: -            if (source->GetMap()->IsRaid()) -                if (source->GetMap()->Is25ManRaid() != (difficulty.difficulty & RAID_DIFFICULTY_MASK_25MAN)) -                    return false; -            return source->GetMap()->GetSpawnMode() >= difficulty.difficulty;          case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT:              return source->GetMap()->GetPlayersCountExceptGMs() <= map_players.maxcount;          case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM: @@ -383,8 +333,6 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un                  return false;              return pProto->ItemLevel >= equipped_item.item_level && pProto->Quality >= equipped_item.item_quality;          } -        case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID: -            return source->GetMapId() == map_id.mapId;          default:              break;      } @@ -747,7 +695,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui          if (!achievement)              continue; -        if (!CanUpdateCriteria(achievementCriteria, achievement)) +        if (!CanUpdateCriteria(achievementCriteria, achievement, miscValue1, miscValue2, unit))              continue;          switch (type) @@ -2131,7 +2079,7 @@ bool AchievementMgr::HasAchieved(uint32 achievementId) const      return m_completedAchievements.find(achievementId) != m_completedAchievements.end();  } -bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement) +bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint64 miscValue1, uint64 miscValue2, Unit* unit)  {      if (DisableMgr::IsDisabledFor(DISABLE_TYPE_ACHIEVEMENT_CRITERIA, criteria->ID, NULL))          return false; @@ -2139,6 +2087,10 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria,      if (achievement->mapID != -1 && GetPlayer()->GetMapId() != uint32(achievement->mapID))          return false; +    // don't update already completed criteria +    if (IsCompletedCriteria(criteria, achievement)) +        return false; +      if ((achievement->requiredFaction == ACHIEVEMENT_FACTION_HORDE    && GetPlayer()->GetTeam() != HORDE) ||          (achievement->requiredFaction == ACHIEVEMENT_FACTION_ALLIANCE && GetPlayer()->GetTeam() != ALLIANCE))          return false; @@ -2162,10 +2114,55 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria,                  break;          }      } +     +    // additional conditions +    for (int8 i = 0; i < MAX_ADDITIONAL_CRITERIA_CONDITIONS; ++i) +    { +        if (!criteria->additionalConditionType[i]) +            continue; -    // don't update already completed criteria -    if (IsCompletedCriteria(criteria, achievement)) -        return false; +        uint32 value = criteria->additionalConditionValue[i]; +        switch (criteria->additionalConditionType[i]) +        { +            case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_PLAYER: +                if (!unit || !unit->ToPlayer()) +                    return false; +                break; +            case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_DEAD: +                if (!unit || unit->isAlive()) +                    return false; +                break; +            case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_MOUNTED: +                if (!unit || !unit->IsMounted()) +                    return false; +                break; +            case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_MAP_DIFFICULTY: +                if (GetPlayer()->GetDifficulty(GetPlayer()->GetMap()->IsRaid()) != value) +                    return false; +                break; +            case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_MAP: +                if (GetPlayer()->GetMapId() != value) +                    return false; +                break; +            case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_ZONE: +                if (GetPlayer()->GetZoneId() != value) +                    return false; +                break; +            case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_AREA: +                if (GetPlayer()->GetAreaId() != value) +                    return false; +                break; +            case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_ENEMY: +                if (!unit) +                    return false; +                if (const Player* player = unit->ToPlayer()) +                    if (player->GetDeathTimer() != 0 && player->GetTeam() == GetPlayer()->GetTeam()) +                        return false; +                break; +            default: +                break; +        } +    }      return true;  } diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index f88be974c9d..8d78eb9f113 100755 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -46,15 +46,12 @@ enum AchievementCriteriaDataType      ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE          = 1, // creature_id    0      ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE = 2, // class_id       race_id      ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH= 3, // health_percent 0 -    ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD       = 4, // own_team       0             not corpse (not released body), own_team == false if enemy team expected      ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA              = 5, // spell_id       effect_idx -    ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA              = 6, // area id        0      ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA              = 7, // spell_id       effect_idx      ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE               = 8, // minvalue                     value provided with achievement update must be not less that limit      ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL             = 9, // minlevel                     minlevel of target      ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER            = 10, // gender                       0=male; 1=female      ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT              = 11, // scripted requirement -    ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_DIFFICULTY      = 12, // difficulty                   normal/heroic difficulty for current event map      ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT    = 13, // count                        "with less than %u people in the zone"      ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM              = 14, // team                         HORDE(67), ALLIANCE(469)      ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK             = 15, // drunken_state  0             (enum DrunkenState) of player @@ -62,11 +59,9 @@ enum AchievementCriteriaDataType      ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE  = 17, // min_score      max_score     player's team win bg and opposition team have team score in range      ACHIEVEMENT_CRITERIA_DATA_INSTANCE_SCRIPT          = 18, // 0              0             maker instance script call for check current criteria requirements fit      ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM      = 19, // item_level     item_quality  for equipped item in slot to check item level and quality -    ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID              = 20, // map_id         0             player must be on map with id in map_id +    MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE,  }; -#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE               21 // maximum value in AchievementCriteriaDataType enum -  class Player;  class Unit; @@ -92,11 +87,6 @@ struct AchievementCriteriaData          {              uint32 percent;          } health; -        // ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD     = 4 -        struct -        { -            uint32 own_team_flag; -        } player_dead;          // ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA            = 5          // ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA            = 7          struct @@ -104,11 +94,6 @@ struct AchievementCriteriaData              uint32 spell_id;              uint32 effect_idx;          } aura; -        // ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA            = 6 -        struct -        { -            uint32 id; -        } area;          // ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE             = 8          struct          { @@ -125,11 +110,6 @@ struct AchievementCriteriaData              uint32 gender;          } gender;          // ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT            = 11 (no data) -        // ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_DIFFICULTY    = 12 -        struct -        { -            uint32 difficulty; -        } difficulty;          // ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT  = 13          struct          { @@ -163,12 +143,7 @@ struct AchievementCriteriaData              uint32 item_level;              uint32 item_quality;          } equipped_item; -        // ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID            = 20 -        struct -        { -            uint32 mapId; -        } map_id; -        // ... +        // raw          struct          {              uint32 value1; @@ -273,7 +248,7 @@ class AchievementMgr          void CompletedCriteriaFor(AchievementEntry const* achievement);          bool IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement);          bool IsCompletedAchievement(AchievementEntry const* entry); -        bool CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement); +        bool CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint64 miscValue1, uint64 miscValue2, Unit* unit);          void BuildAllDataPacket(WorldPacket* data) const;          Player* m_player; diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 2cfcc2117e2..a5253b15cf0 100755 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -92,6 +92,80 @@ enum AchievementCriteriaCondition      ACHIEVEMENT_CRITERIA_CONDITION_UNK3         = 13,   // unk  }; +#define MAX_ADDITIONAL_CRITERIA_CONDITIONS 3 + +enum AchievementCriteriaAdditionalCondition +{ +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_DRUNK_VALUE                = 1,    // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK2                              = 2, +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_LEVEL                        = 3,    // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_ENTRY             = 4,    // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_PLAYER             = 5, +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_DEAD               = 6, +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_ENEMY              = 7, +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_HAS_AURA                   = 8,    // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK9                              = 9,    // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_HAS_AURA                   = 10,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_MOUNTED            = 11, +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK12                             = 12,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK13                             = 13,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_QUALITY_MIN                  = 14,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_QUALITY_EQUALS               = 15,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK16                             = 16, +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_AREA                       = 17, +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_ZONE                       = 18, +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK19                             = 19,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_MAP_DIFFICULTY                    = 20, +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_YIELDS_XP         = 21,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK22                             = 22,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK23                             = 23,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_ARENA_TEAM_SIZE            = 24,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_RACE                       = 25,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_CLASS                      = 26,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_RACE                       = 27,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_CLASS                      = 28,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_MAX_GROUP_MEMBERS                 = 29,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_TYPE              = 30,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK31                             = 31,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_MAP                        = 32, +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_CLASS                        = 33,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_SUBCLASS                     = 34,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK35                             = 35,   // related to timed completing-quests achievements +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK36                             = 36,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_MIN_PERSONAL_RATING               = 37,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TITLE_BIT_INDEX                   = 38,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL                      = 39,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_LEVEL                      = 40,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_ZONE                       = 41,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK42                             = 42,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK43                             = 43,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK44                             = 44,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK45                             = 45,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_HEALTH_PERCENT_BELOW       = 46,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK47                             = 47,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK48                             = 48,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK49                             = 49,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK50                             = 50,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK51                             = 51,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK52                             = 52,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK53                             = 53,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK54                             = 54,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK55                             = 55, +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_MIN_ACHIEVEMENT_POINTS            = 56,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK57                             = 57,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_REQUIRES_LFG_GROUP                = 58,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK59                             = 59,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK60                             = 60, +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_REQUIRES_GUILD_GROUP              = 61,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_GUILD_REPUTATION                  = 62,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_RATED_BATTLEGROUND                = 63,   // NYI +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK64                             = 64,   // unused in 4.0.6a +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK65                             = 65,   // Archaeology, item quality related +    ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK66                             = 66,   // Archaeology, race related +}; + +#define MAX_ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TYPE 66 +  enum AchievementCriteriaFlags  {      ACHIEVEMENT_CRITERIA_FLAG_SHOW_PROGRESS_BAR = 0x00000001,         // Show progress as bar @@ -248,31 +322,6 @@ enum AchievementCriteriaTypes      ACHIEVEMENT_CRITERIA_TYPE_TOTAL = 137,  }; -enum AchievementCriteriaMoreReqType -{ -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_ITEM_LEVEL             = 3, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_CREATURE_ID            = 4, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_SPELL                  = 8, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_SPELL_ON_TARGET        = 10, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_ITEM_QUALITY_EQUIPPED  = 14, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_ITEM_QUALITY_LOOTED    = 15, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_AREA_ID                = 17, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_AREA_ID2               = 18, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_RAID_DIFFICULTY        = 20, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_ARENA_TYPE             = 24, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_PLAYER_CLASS           = 26, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_PLAYER_RACE            = 27, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_PLAYER_CLASS2          = 28, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_CREATURE_TYPE          = 30, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_MAP_ID                 = 32, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_TIMED_QUEST            = 35, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_PLAYER_TITLE           = 38, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_PLAYER_LEVEL           = 39, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_PLAYER_LEVEL2          = 40, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_AREA_ID3               = 41, -    ACHIEVEMENT_CRITERIA_MORE_REQ_TYPE_GUILD_REP              = 62, -}; -  enum AchievementCategory  {      CATEGORY_CHILDRENS_WEEK     = 163, diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 744e5a1c048..87a20633d8d 100755 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -526,8 +526,8 @@ struct AchievementCriteriaEntry      uint32  showOrder;                                      // 14       m_ui_order  also used in achievement shift-links as index in state bitmask      //uint32 unk1;                                          // 15 only one value, still unknown      //uint32 unk2;                                          // 16 all zeros -    uint32 moreRequirement[3];                              // 17-19 -    uint32 moreRequirementValue[3];                         // 20-22 +    uint32 additionalConditionType[MAX_ADDITIONAL_CRITERIA_CONDITIONS];     // 17-19 +    uint32 additionalConditionValue[MAX_ADDITIONAL_CRITERIA_CONDITIONS];    // 20-22  };  struct AreaTableEntry  | 
