Core/Achievements: Reduce the list of criteria types updated on login

* Implemented CriteriaType::ReachMaxLevel
* Corrected implementations for CriteriaType::ReachRenownLevel and CriteriaType::LearnTaxiNode
This commit is contained in:
Shauren
2024-12-07 21:49:32 +01:00
parent 316ce0d73a
commit 6da1679cbf
8 changed files with 96 additions and 8 deletions

View File

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

View File

@@ -139,8 +139,6 @@ protected:
private:
Guild* _owner;
friend class UnitTestDataLoader;
};
class TC_GAME_API AchievementGlobalMgr

View File

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

View File

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

View File

@@ -1176,6 +1176,7 @@ struct CriteriaEntry
// CriteriaType::CurrencyGained = 12
// CriteriaType::ObtainAnyItemWithCurrencyValue = 229
// CriteriaType::ReachRenownLevel = 261
int32 CurrencyID;
// CriteriaType::DieInInstance = 18
@@ -1332,6 +1333,9 @@ struct CriteriaEntry
// CriteriaType::MythicPlusRatingAttained = 230
int32 DungeonScore;
// CriteriaType::LearnTaxiNode = 262
int32 TaxiNodesID;
} Asset;
uint32 ModifierTreeId;
int32 StartEvent;

View File

@@ -627,7 +627,7 @@ enum class CriteriaType : int16
TotalFactionsEncountered = 89, // Total factions encountered
LootAnyItem = 90, // Loot any item
ObtainAnyItem = 91, // Obtain any item
AnyoneTriggerGameEventScenario = 92, /*NYI*/ // Anyone will Trigger game event "{GameEvents}" (Scenario Only)
AnyoneTriggerGameEventScenario = 92, // Anyone will Trigger game event "{GameEvents}" (Scenario Only)
RollAnyNeed = 93, // Roll any number on need
RollAnyGreed = 94, // Roll any number on greed
ReleasedSpirit = 95, /*NYI*/ // Released Spirit
@@ -756,7 +756,7 @@ enum class CriteriaType : int16
CompleteAnyReplayQuest = 218, // Complete Any Replay Quest
BuyItemsFromVendors = 219, // Buy items from vendors
SellItemsToVendors = 220, // Sell items to vendors
ReachMaxLevel = 221, /*NYI*/ // Reach Max Level
ReachMaxLevel = 221, // Reach Max Level
MemorizeSpell = 222, /*NYI*/ // Memorize Spell "{Spell}"
LearnTransmogIllusion = 223, /*NYI*/ // Learn Transmog Illusion
LearnAnyTransmogIllusion = 224, /*NYI*/ // Learn Any Transmog Illusion

View File

@@ -2351,6 +2351,8 @@ void Player::GiveLevel(uint8 level)
UpdateCriteria(CriteriaType::ActivelyReachLevel, level);
if (level > oldLevel)
UpdateCriteria(CriteriaType::GainLevels, level - oldLevel);
if (IsMaxLevel())
UpdateCriteria(CriteriaType::ReachMaxLevel);
PushQuests();

View File

@@ -38,8 +38,8 @@ QuestObjectiveCriteriaMgr::~QuestObjectiveCriteriaMgr()
void QuestObjectiveCriteriaMgr::CheckAllQuestObjectiveCriteria(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);
}
void QuestObjectiveCriteriaMgr::Reset()