aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Achievements
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-12-07 21:49:32 +0100
committerShauren <shauren.trinity@gmail.com>2024-12-07 21:49:32 +0100
commit6da1679cbfdc56cd5f1cab7148f645916bccecc1 (patch)
treec02ff993732bf62c24b8a64f3ac5afbe53329e10 /src/server/game/Achievements
parent316ce0d73a139a7ffa0f7a4d301ca47ff2b896d6 (diff)
Core/Achievements: Reduce the list of criteria types updated on login
* Implemented CriteriaType::ReachMaxLevel * Corrected implementations for CriteriaType::ReachRenownLevel and CriteriaType::LearnTaxiNode
Diffstat (limited to 'src/server/game/Achievements')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp4
-rw-r--r--src/server/game/Achievements/AchievementMgr.h2
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp82
-rw-r--r--src/server/game/Achievements/CriteriaHandler.h2
4 files changed, 86 insertions, 4 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 406483da438..e626df0e749 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -61,8 +61,8 @@ AchievementMgr::~AchievementMgr() { }
void AchievementMgr::CheckAllAchievementCriteria(Player* referencePlayer)
{
// suppress sending packets
- for (uint32 i = 0; i < uint32(CriteriaType::Count); ++i)
- UpdateCriteria(CriteriaType(i), 0, 0, 0, nullptr, referencePlayer);
+ for (CriteriaType criteriaType : CriteriaMgr::GetRetroactivelyUpdateableCriteriaTypes())
+ UpdateCriteria(criteriaType, 0, 0, 0, nullptr, referencePlayer);
}
bool AchievementMgr::HasAchieved(uint32 achievementId) const
diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h
index 1d1090128a4..f322e9cec83 100644
--- a/src/server/game/Achievements/AchievementMgr.h
+++ b/src/server/game/Achievements/AchievementMgr.h
@@ -139,8 +139,6 @@ protected:
private:
Guild* _owner;
-
- friend class UnitTestDataLoader;
};
class TC_GAME_API AchievementGlobalMgr
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp
index a58b918aba3..783eb38daad 100644
--- a/src/server/game/Achievements/CriteriaHandler.cpp
+++ b/src/server/game/Achievements/CriteriaHandler.cpp
@@ -562,6 +562,8 @@ void CriteriaHandler::UpdateCriteria(CriteriaType type, uint64 miscValue1 /*= 0*
case CriteriaType::CompleteAnyReplayQuest:
case CriteriaType::BuyItemsFromVendors:
case CriteriaType::SellItemsToVendors:
+ case CriteriaType::ReachMaxLevel:
+ case CriteriaType::LearnTaxiNode:
SetCriteriaProgress(criteria, 1, referencePlayer, PROGRESS_ACCUMULATE);
break;
// std case: increment at miscValue1
@@ -1229,6 +1231,8 @@ bool CriteriaHandler::IsCompletedCriteria(Criteria const* criteria, uint64 requi
case CriteriaType::BuyItemsFromVendors:
case CriteriaType::SellItemsToVendors:
case CriteriaType::GainLevels:
+ case CriteriaType::ReachRenownLevel:
+ case CriteriaType::LearnTaxiNode:
return progress->Counter >= requiredAmount;
case CriteriaType::EarnAchievement:
case CriteriaType::CompleteQuest:
@@ -1247,6 +1251,7 @@ bool CriteriaHandler::IsCompletedCriteria(Criteria const* criteria, uint64 requi
case CriteriaType::PrestigeLevelIncrease:
case CriteriaType::ActivelyReachLevel:
case CriteriaType::CollectTransmogSetFromGroup:
+ case CriteriaType::ReachMaxLevel:
case CriteriaType::EnterTopLevelArea:
case CriteriaType::LeaveTopLevelArea:
return progress->Counter >= 1;
@@ -1619,6 +1624,7 @@ bool CriteriaHandler::RequirementsSatisfied(Criteria const* criteria, uint64 mis
return false;
break;
case CriteriaType::CurrencyGained:
+ case CriteriaType::ReachRenownLevel:
if (!miscValue1 || !miscValue2 || int64(miscValue2) < 0
|| miscValue1 != uint32(criteria->Entry->Asset.CurrencyID))
return false;
@@ -1676,6 +1682,10 @@ bool CriteriaHandler::RequirementsSatisfied(Criteria const* criteria, uint64 mis
if (!miscValue1 || miscValue1 != uint32(criteria->Entry->Asset.AreaTriggerActionSetID))
return false;
break;
+ case CriteriaType::LearnTaxiNode:
+ if (miscValue1 != uint32(criteria->Entry->Asset.TaxiNodesID))
+ return false;
+ break;
default:
break;
}
@@ -4504,6 +4514,14 @@ char const* CriteriaMgr::GetCriteriaTypeString(CriteriaType type)
return "CompleteTrackingQuest";
case CriteriaType::GainLevels:
return "GainLevels";
+ case CriteriaType::CompleteQuestsCountOnAccount:
+ return "CompleteQuestsCountOnAccount";
+ case CriteriaType::WarbandBankTabPurchased:
+ return "WarbandBankTabPurchased";
+ case CriteriaType::ReachRenownLevel:
+ return "ReachRenownLevel";
+ case CriteriaType::LearnTaxiNode:
+ return "LearnTaxiNode";
default:
return "MissingType";
}
@@ -4554,6 +4572,8 @@ inline bool IsCriteriaTypeStoredByAsset(CriteriaType type)
case CriteriaType::LandTargetedSpellOnTarget:
case CriteriaType::LearnTradeskillSkillLine:
case CriteriaType::DefeatDungeonEncounter:
+ case CriteriaType::LearnToy:
+ case CriteriaType::LearnAnyTransmog:
return true;
default:
break;
@@ -4924,3 +4944,65 @@ ModifierTreeNode const* CriteriaMgr::GetModifierTree(uint32 modifierTreeId) cons
return nullptr;
}
+
+std::span<CriteriaType const> CriteriaMgr::GetRetroactivelyUpdateableCriteriaTypes()
+{
+ static constexpr CriteriaType Types[] =
+ {
+ CriteriaType::CompleteResearchProject,
+ CriteriaType::CompleteAnyResearchProject,
+ CriteriaType::ReachLevel,
+ CriteriaType::SkillRaised,
+ CriteriaType::CompleteQuestsCount,
+ CriteriaType::CompleteAnyDailyQuestPerDay,
+ CriteriaType::CompleteQuestsInZone,
+ CriteriaType::CompleteQuest,
+ CriteriaType::LearnOrKnowSpell,
+ CriteriaType::AcquireItem,
+ CriteriaType::EarnPersonalArenaRating,
+ CriteriaType::AchieveSkillStep,
+ CriteriaType::RevealWorldMapOverlay,
+ //CriteriaType::EarnTitle, /*NYI*/
+ CriteriaType::BankSlotsPurchased,
+ CriteriaType::ReputationGained,
+ CriteriaType::TotalExaltedFactions,
+ //CriteriaType::CompleteQuestsInSort, /*NYI*/
+ CriteriaType::LearnSpellFromSkillLine,
+ CriteriaType::MostMoneyOwned,
+ CriteriaType::TotalReveredFactions,
+ CriteriaType::TotalHonoredFactions,
+ CriteriaType::TotalFactionsEncountered,
+ //CriteriaType::AccountKnownPet, /*NYI*/
+ CriteriaType::LearnTradeskillSkillLine,
+ CriteriaType::HonorableKills,
+ //CriteriaType::GuildBankTabsPurchased, /*NYI*/
+ //CriteriaType::EarnGuildAchievementPoints, /*NYI*/
+ //CriteriaType::EarnBattlegroundRating, /*NYI*/
+ //CriteriaType::GuildTabardCreated, /*NYI*/
+ CriteriaType::LearnedNewPet,
+ CriteriaType::UniquePetsOwned,
+ //CriteriaType::UpgradeGarrison, /*NYI*/
+ //CriteriaType::AcquireGarrison, /*NYI*/
+ //CriteriaType::LearnGarrisonBlueprint, /*NYI*/
+ //CriteriaType::LearnGarrisonSpecialization, /*NYI*/
+ //CriteriaType::LearnToy, /*NYI*/ // Learn Toy "{Item}"
+ //CriteriaType::LearnAnyToy, /*NYI*/ // Learn Any Toy
+ //CriteriaType::LearnTransmog, /*NYI*/
+ CriteriaType::HonorLevelIncrease,
+ //CriteriaType::AccountHonorLevelReached, /*NYI*/
+ CriteriaType::ReachMaxLevel,
+ //CriteriaType::MemorizeSpell, /*NYI*/
+ //CriteriaType::LearnTransmogIllusion, /*NYI*/
+ //CriteriaType::MythicPlusRatingAttained, /*NYI*/
+ //CriteriaType::MythicPlusDisplaySeasonEnded, /*NYI*/
+ //CriteriaType::CompleteTrackingQuest, /*NYI*/
+ //CriteriaType::WarbandBankTabPurchased, /*NYI*/
+ CriteriaType::LearnTaxiNode,
+
+ CriteriaType::EarnAchievementPoints,
+ CriteriaType::BattlePetAchievementPointsEarned,
+ CriteriaType::EarnAchievement // criteria possibly completed by retroactive scan, must be last
+ };
+
+ return Types;
+}
diff --git a/src/server/game/Achievements/CriteriaHandler.h b/src/server/game/Achievements/CriteriaHandler.h
index cfcf8a614c1..82c8f2ac7d1 100644
--- a/src/server/game/Achievements/CriteriaHandler.h
+++ b/src/server/game/Achievements/CriteriaHandler.h
@@ -395,6 +395,8 @@ public:
Criteria const* GetCriteria(uint32 criteriaId) const;
ModifierTreeNode const* GetModifierTree(uint32 modifierTreeId) const;
+ static std::span<CriteriaType const> GetRetroactivelyUpdateableCriteriaTypes();
+
private:
std::unordered_map<uint32, CriteriaDataSet> _criteriaDataMap;