fix(Core): Implement ACHIEVEMENT_CRITERIA_DATA_TYPE_S_ITEM_QUALITY (#12246)

* fix(Core): Implement ACHIEVEMENT_CRITERIA_DATA_TYPE_S_ITEM_QUALITY

* Missing DB values from TrinityCore

* Fix DELETE to include all added entries

* Fix AchievementCriteriaData validation

* Correctly check criteria data for receive item achievements
This commit is contained in:
ZhengPeiRu21
2022-07-07 10:45:50 -06:00
committed by GitHub
parent 2b6284d1c9
commit e21011c223
3 changed files with 45 additions and 1 deletions

View File

@@ -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;
}

View File

@@ -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
{