diff --git a/data/sql/updates/pending_db_world/rev_1656608960155325800.sql b/data/sql/updates/pending_db_world/rev_1656608960155325800.sql new file mode 100644 index 000000000..8a030d1eb --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1656608960155325800.sql @@ -0,0 +1,25 @@ +-- +DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (6140, 6141, 6142, 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, 4783, 4784, 4785, 4786); +INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`) VALUES +(6140, 25, 4, 0), +(6141, 25, 5, 0), +(6142, 25, 4, 0), +(4768, 25, 4, 0), +(4769, 25, 4, 0), +(4770, 25, 4, 0), +(4771, 25, 4, 0), +(4772, 25, 4, 0), +(4773, 25, 4, 0), +(4774, 25, 4, 0), +(4775, 25, 4, 0), +(4776, 25, 4, 0), +(4777, 25, 4, 0), +(4778, 25, 4, 0), +(4779, 25, 4, 0), +(4780, 25, 4, 0), +(4781, 25, 4, 0), +(4782, 25, 4, 0), +(4783, 25, 4, 0), +(4784, 25, 4, 0), +(4785, 25, 4, 0), +(4786, 25, 4, 0); diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index e930244a2..f470a132e 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -80,6 +80,8 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS: case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL: case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN: + case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM: + case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM: break; default: if (dataType != ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT) @@ -242,6 +244,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_TEAMS_SCORES: return true; // not check correctness node indexes case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM: + case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_ITEM_QUALITY: if (equipped_item.item_quality >= MAX_ITEM_QUALITY) { LOG_ERROR("sql.sql", "Table `achievement_criteria_requirement` (Entry: {} Type: {}) for requirement ACHIEVEMENT_CRITERIA_REQUIRE_S_EQUIPED_ITEM ({}) has unknown quality state in value1 ({}), ignored.", @@ -434,6 +437,13 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un return false; } + case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_ITEM_QUALITY: + { + ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(miscvalue1); + if (!pProto) + return false; + return pProto->Quality == item.item_quality; + } case ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_TEAMS_SCORES: { Battleground* bg = source->GetBattleground(); @@ -1534,6 +1544,9 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui ItemTemplate const* proto = sObjectMgr->GetItemTemplate(miscValue1); if (!proto || proto->Quality < ITEM_QUALITY_EPIC) continue; + AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria); + if (!data || !data->Meets(GetPlayer(), unit, miscValue1)) + continue; SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); break; } diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index f385078a9..3ebe5698a 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -68,8 +68,9 @@ enum AchievementCriteriaDataType ACHIEVEMENT_CRITERIA_DATA_TYPE_NTH_BIRTHDAY = 22, // N login on day of N-th Birthday ACHIEVEMENT_CRITERIA_DATA_TYPE_S_KNOWN_TITLE = 23, // title_id known (pvp) title, values from dbc ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_TEAMS_SCORES = 24, // winner_score loser score player's team win bg and their teams have exact scores + ACHIEVEMENT_CRITERIA_DATA_TYPE_S_ITEM_QUALITY = 25 // item_quality }; -#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE 25 // maximum value in AchievementCriteriaDataType enum +#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE 26 // maximum value in AchievementCriteriaDataType enum enum AchievementCommonCategories { @@ -196,6 +197,11 @@ struct AchievementCriteriaData uint32 winner_score; uint32 loser_score; } teams_scores; + // ACHIEVEMENT_CRITERIA_DATA_TYPE_S_ITEM_QUALITY = 25 + struct + { + uint32 item_quality; + } item; // ... struct {