From 8ba8f0fe9e275dbc7c4a5f63b46d6749b532ec52 Mon Sep 17 00:00:00 2001 From: Ludwig Date: Thu, 14 Sep 2023 22:27:39 +0200 Subject: [PATCH] fix(Core/Achievement): Implement ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK (#17180) * fix(Core): Implement ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK * fix(Core): LoadAchievementCriteriaData(): Add ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK - fixes minor oversight of ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK implementation - this enables DB achievement_criteria_data check for ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK --- .../rev_1693745806698601000.sql | 31 +++++++++++++++++++ .../game/Achievements/AchievementMgr.cpp | 15 ++++++++- src/server/game/Entities/Player/Player.cpp | 2 ++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 data/sql/updates/pending_db_world/rev_1693745806698601000.sql diff --git a/data/sql/updates/pending_db_world/rev_1693745806698601000.sql b/data/sql/updates/pending_db_world/rev_1693745806698601000.sql new file mode 100644 index 000000000..c05d4273f --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1693745806698601000.sql @@ -0,0 +1,31 @@ +-- ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK +DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (707, 708, 709, 710, 711, 712, 713, 714, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740); +INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`, `ScriptName`) VALUES +(707, 23, 14, 0, ''), +(708, 23, 13, 0, ''), +(709, 23, 12, 0, ''), +(710, 23, 11, 0, ''), +(711, 23, 10, 0, ''), +(712, 23, 9, 0, ''), +(713, 23, 8, 0, ''), +(714, 23, 7, 0, ''), +(721, 23, 6, 0, ''), +(722, 23, 5, 0, ''), +(723, 23, 4, 0, ''), +(724, 23, 3, 0, ''), +(725, 23, 2, 0, ''), +(726, 23, 1, 0, ''), +(727, 23, 28, 0, ''), +(728, 23, 27, 0, ''), +(729, 23, 26, 0, ''), +(730, 23, 25, 0, ''), +(731, 23, 24, 0, ''), +(732, 23, 23, 0, ''), +(733, 23, 22, 0, ''), +(734, 23, 21, 0, ''), +(735, 23, 20, 0, ''), +(736, 23, 19, 0, ''), +(737, 23, 18, 0, ''), +(738, 23, 17, 0, ''), +(739, 23, 16, 0, ''), +(740, 23, 15, 0, ''); diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 1e86f067c..4b1c92e72 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -82,6 +82,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN: case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM: + case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK: break; default: if (dataType != ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT) @@ -1732,6 +1733,16 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); break; } + case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK: + { + // those requirements couldn't be found in the dbc + AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria); + if (!data || !data->Meets(GetPlayer(), nullptr)) + continue; + + SetCriteriaProgress(achievementCriteria, 1); + break; + } // std case: not exist in DBC, not triggered in code as result case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER: @@ -1742,7 +1753,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui break; // FIXME: not triggered in code as result, need to implement case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID: - case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK: case ACHIEVEMENT_CRITERIA_TYPE_TOTAL: break; // Not implemented yet :( } @@ -1907,6 +1917,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve return true; case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: return achievementCriteria->win_arena.count && progress->counter >= achievementCriteria->win_arena.count; + case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK: + return true; // handle all statistic-only criteria here case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND: case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP: @@ -2724,6 +2736,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL: case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL: + case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK: case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT: diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1f0d9e314..ae39a51a1 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -13272,6 +13272,8 @@ void Player::SetTitle(CharTitlesEntry const* title, bool lost) data << uint32(title->bit_index); data << uint32(lost ? 0 : 1); // 1 - earned, 0 - lost GetSession()->SendPacket(&data); + + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK); } uint32 Player::GetRuneBaseCooldown(uint8 index, bool skipGrace)