diff options
author | Xinef <none@empty.com> | 2017-01-21 18:40:35 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2020-05-01 16:31:01 +0200 |
commit | 38d3c5ed16dd502471d810638fe21d90f8e0c7a6 (patch) | |
tree | 8442dba33b58ee80cb30f0fb920599d4e549957b | |
parent | 57a5969c2672b36160fea1b7c38c424de562a57b (diff) |
Core/Achievements: Greatly optimize achievement system by splitting large types by miscvalue
Closes #18633
(cherry picked from commit 9b44ed9cda347bfda1078666b3779d985fc37b2b)
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.h | 4 | ||||
-rw-r--r-- | src/server/game/Achievements/CriteriaHandler.cpp | 91 | ||||
-rw-r--r-- | src/server/game/Achievements/CriteriaHandler.h | 9 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Battleground.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Quests/QuestObjectiveCriteriaMgr.h | 2 | ||||
-rw-r--r-- | src/server/game/Scenarios/Scenario.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Scenarios/Scenario.h | 2 |
10 files changed, 107 insertions, 27 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 0f33174f40c..ce2494c350a 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -486,7 +486,7 @@ void PlayerAchievementMgr::CompletedAchievement(AchievementEntry const* achievem if (!(achievement->Flags & ACHIEVEMENT_FLAG_TRACKING_FLAG)) _achievementPoints += achievement->Points; - UpdateCriteria(CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, 0, 0, 0, NULL, referencePlayer); + UpdateCriteria(CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, achievement->ID, 0, 0, NULL, referencePlayer); UpdateCriteria(CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, achievement->Points, 0, 0, NULL, referencePlayer); // reward items and titles if any @@ -632,9 +632,9 @@ void PlayerAchievementMgr::SendPacket(WorldPacket const* data) const _owner->SendDirectMessage(data); } -CriteriaList const& PlayerAchievementMgr::GetCriteriaByType(CriteriaTypes type) const +CriteriaList const& PlayerAchievementMgr::GetCriteriaByType(CriteriaTypes type, uint32 asset) const { - return sCriteriaMgr->GetPlayerCriteriaByType(type); + return sCriteriaMgr->GetPlayerCriteriaByType(type, asset); } GuildAchievementMgr::GuildAchievementMgr(Guild* owner) : _owner(owner) @@ -913,7 +913,7 @@ void GuildAchievementMgr::CompletedAchievement(AchievementEntry const* achieveme if (!(achievement->Flags & ACHIEVEMENT_FLAG_TRACKING_FLAG)) _achievementPoints += achievement->Points; - UpdateCriteria(CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, 0, 0, 0, NULL, referencePlayer); + UpdateCriteria(CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, achievement->ID, 0, 0, NULL, referencePlayer); UpdateCriteria(CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, achievement->Points, 0, 0, NULL, referencePlayer); } @@ -967,7 +967,7 @@ void GuildAchievementMgr::SendPacket(WorldPacket const* data) const _owner->BroadcastPacket(data); } -CriteriaList const& GuildAchievementMgr::GetCriteriaByType(CriteriaTypes type) const +CriteriaList const& GuildAchievementMgr::GetCriteriaByType(CriteriaTypes type, uint32 /*asset*/) const { return sCriteriaMgr->GetGuildCriteriaByType(type); } diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index 966b990ce3e..8e7a172721d 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -102,7 +102,7 @@ protected: void SendPacket(WorldPacket const* data) const override; std::string GetOwnerInfo() const override; - CriteriaList const& GetCriteriaByType(CriteriaTypes type) const override; + CriteriaList const& GetCriteriaByType(CriteriaTypes type, uint32 asset) const override; private: Player* _owner; @@ -135,7 +135,7 @@ protected: void SendPacket(WorldPacket const* data) const override; std::string GetOwnerInfo() const override; - CriteriaList const& GetCriteriaByType(CriteriaTypes type) const override; + CriteriaList const& GetCriteriaByType(CriteriaTypes type, uint32 asset) const override; private: Guild* _owner; diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index 92b5c88d291..e2df88e5ada 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -457,7 +457,7 @@ void CriteriaHandler::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0 TC_LOG_DEBUG("criteria", "CriteriaHandler::UpdateCriteria(%s, %u, " UI64FMTD ", " UI64FMTD ", " UI64FMTD ") %s", CriteriaMgr::GetCriteriaTypeString(type), type, miscValue1, miscValue2, miscValue3, GetOwnerInfo().c_str()); - CriteriaList const& criteriaList = GetCriteriaByType(type); + CriteriaList const& criteriaList = GetCriteriaByType(type, uint32(miscValue1)); for (Criteria const* criteria : criteriaList) { CriteriaTreeList const* trees = sCriteriaMgr->GetCriteriaTreesByCriteria(criteria->ID); @@ -472,6 +472,7 @@ void CriteriaHandler::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0 switch (type) { // std. case: increment at 1 + case CRITERIA_TYPE_WIN_BG: case CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS: case CRITERIA_TYPE_LOSE_DUEL: case CRITERIA_TYPE_CREATE_AUCTION: @@ -485,6 +486,7 @@ void CriteriaHandler::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0 case CRITERIA_TYPE_RECEIVE_EPIC_ITEM: case CRITERIA_TYPE_DEATH: case CRITERIA_TYPE_COMPLETE_DAILY_QUEST: + case CRITERIA_TYPE_COMPLETE_BATTLEGROUND: case CRITERIA_TYPE_DEATH_AT_MAP: case CRITERIA_TYPE_DEATH_IN_DUNGEON: case CRITERIA_TYPE_KILLED_BY_CREATURE: @@ -531,8 +533,6 @@ void CriteriaHandler::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0 case CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED: case CRITERIA_TYPE_TOTAL_HEALING_RECEIVED: case CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS: - case CRITERIA_TYPE_WIN_BG: - case CRITERIA_TYPE_COMPLETE_BATTLEGROUND: case CRITERIA_TYPE_DAMAGE_DONE: case CRITERIA_TYPE_HEALING_DONE: case CRITERIA_TYPE_HEART_OF_AZEROTH_ARTIFACT_POWER_EARNED: @@ -1492,8 +1492,8 @@ bool CriteriaHandler::RequirementsSatisfied(Criteria const* criteria, uint64 mis return false; break; case CRITERIA_TYPE_EQUIP_EPIC_ITEM: - // miscValue1 = itemid miscValue2 = itemSlot - if (!miscValue1 || miscValue2 != uint32(criteria->Entry->Asset.ItemSlot)) + // miscValue1 = itemSlot miscValue2 = itemid + if (!miscValue2 || miscValue1 != uint32(criteria->Entry->Asset.ItemSlot)) return false; break; case CRITERIA_TYPE_ROLL_NEED_ON_LOOT: @@ -3111,6 +3111,63 @@ CriteriaMgr* CriteriaMgr::Instance() return &instance; } +namespace +{ +inline bool IsCriteriaTypeStoredByAsset(CriteriaTypes type) +{ + switch (type) + { + case CRITERIA_TYPE_KILL_CREATURE: + case CRITERIA_TYPE_WIN_BG: + case CRITERIA_TYPE_REACH_SKILL_LEVEL: + case CRITERIA_TYPE_COMPLETE_ACHIEVEMENT: + case CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE: + case CRITERIA_TYPE_COMPLETE_BATTLEGROUND: + case CRITERIA_TYPE_KILLED_BY_CREATURE: + case CRITERIA_TYPE_COMPLETE_QUEST: + case CRITERIA_TYPE_BE_SPELL_TARGET: + case CRITERIA_TYPE_CAST_SPELL: + case CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: + case CRITERIA_TYPE_HONORABLE_KILL_AT_AREA: + case CRITERIA_TYPE_LEARN_SPELL: + case CRITERIA_TYPE_OWN_ITEM: + case CRITERIA_TYPE_LEARN_SKILL_LEVEL: + case CRITERIA_TYPE_USE_ITEM: + case CRITERIA_TYPE_LOOT_ITEM: + case CRITERIA_TYPE_EXPLORE_AREA: + case CRITERIA_TYPE_GAIN_REPUTATION: + case CRITERIA_TYPE_EQUIP_EPIC_ITEM: + case CRITERIA_TYPE_HK_CLASS: + case CRITERIA_TYPE_HK_RACE: + case CRITERIA_TYPE_DO_EMOTE: + case CRITERIA_TYPE_EQUIP_ITEM: + case CRITERIA_TYPE_USE_GAMEOBJECT: + case CRITERIA_TYPE_BE_SPELL_TARGET2: + case CRITERIA_TYPE_FISH_IN_GAMEOBJECT: + case CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS: + case CRITERIA_TYPE_LOOT_TYPE: + case CRITERIA_TYPE_CAST_SPELL2: + case CRITERIA_TYPE_LEARN_SKILL_LINE: + return true; + default: + break; + } + return false; +} +} + +CriteriaList const& CriteriaMgr::GetPlayerCriteriaByType(CriteriaTypes type, uint32 asset) const +{ + if (asset && IsCriteriaTypeStoredByAsset(type)) + { + auto itr = _criteriasByAsset[type].find(asset); + if (itr != _criteriasByAsset[type].end()) + return itr->second; + } + + return _criteriasByType[type]; +} + //========================================================== CriteriaMgr::~CriteriaMgr() { @@ -3309,6 +3366,30 @@ void CriteriaMgr::LoadCriteriaList() { ++criterias; _criteriasByType[criteriaEntry->Type].push_back(criteria); + if (IsCriteriaTypeStoredByAsset(CriteriaTypes(criteriaEntry->Type))) + { + if (criteriaEntry->Type != CRITERIA_TYPE_EXPLORE_AREA) + _criteriasByAsset[criteriaEntry->Type][criteriaEntry->Asset.ID].push_back(criteria); + else + { + WorldMapOverlayEntry const* worldOverlayEntry = sWorldMapOverlayStore.LookupEntry(criteriaEntry->Asset.WorldMapOverlayID); + if (!worldOverlayEntry) + break; + + for (uint8 j = 0; j < MAX_WORLD_MAP_OVERLAY_AREA_IDX; ++j) + { + if (worldOverlayEntry->AreaID[j]) + { + bool valid = true; + for (uint8 i = 0; i < j; ++i) + if (worldOverlayEntry->AreaID[j] == worldOverlayEntry->AreaID[i]) + valid = false; + if (valid) + _criteriasByAsset[criteriaEntry->Type][worldOverlayEntry->AreaID[j]].push_back(criteria); + } + } + } + } } if (criteria->FlagsCu & CRITERIA_FLAG_CU_GUILD) diff --git a/src/server/game/Achievements/CriteriaHandler.h b/src/server/game/Achievements/CriteriaHandler.h index 56b8b977a03..b2b9570f61c 100644 --- a/src/server/game/Achievements/CriteriaHandler.h +++ b/src/server/game/Achievements/CriteriaHandler.h @@ -61,6 +61,7 @@ struct Criteria }; typedef std::vector<Criteria const*> CriteriaList; +typedef std::unordered_map<uint32, CriteriaList> CriteriaListByAsset; struct CriteriaTree { @@ -303,7 +304,7 @@ protected: bool ModifierSatisfied(ModifierTreeEntry const* modifier, uint64 miscValue1, uint64 miscValue2, Unit const* unit, Player* referencePlayer) const; virtual std::string GetOwnerInfo() const = 0; - virtual CriteriaList const& GetCriteriaByType(CriteriaTypes type) const = 0; + virtual CriteriaList const& GetCriteriaByType(CriteriaTypes type, uint32 asset) const = 0; CriteriaProgressMap _criteriaProgress; std::map<uint32, uint32 /*ms time left*/> _timeCriteriaTrees; @@ -320,10 +321,7 @@ public: static CriteriaMgr* Instance(); - CriteriaList const& GetPlayerCriteriaByType(CriteriaTypes type) const - { - return _criteriasByType[type]; - } + CriteriaList const& GetPlayerCriteriaByType(CriteriaTypes type, uint32 asset) const; CriteriaList const& GetGuildCriteriaByType(CriteriaTypes type) const { @@ -408,6 +406,7 @@ private: // store criterias by type to speed up lookup CriteriaList _criteriasByType[CRITERIA_TYPE_TOTAL]; + CriteriaListByAsset _criteriasByAsset[CRITERIA_TYPE_TOTAL]; CriteriaList _guildCriteriasByType[CRITERIA_TYPE_TOTAL]; CriteriaList _scenarioCriteriasByType[CRITERIA_TYPE_TOTAL]; CriteriaList _questObjectiveCriteriasByType[CRITERIA_TYPE_TOTAL]; diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 1b26f339c5e..dd330ba325b 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -824,14 +824,14 @@ void Battleground::EndBattleground(uint32 winner) // TODO: loss honor xp } - player->UpdateCriteria(CRITERIA_TYPE_WIN_BG, 1); + player->UpdateCriteria(CRITERIA_TYPE_WIN_BG, player->GetMapId()); if (!guildAwarded) { guildAwarded = true; if (ObjectGuid::LowType guildId = GetBgMap()->GetOwnerGuildId(player->GetBGTeam())) { if (Guild* guild = sGuildMgr->GetGuildById(guildId)) - guild->UpdateCriteria(CRITERIA_TYPE_WIN_BG, 1, 0, 0, NULL, player); + guild->UpdateCriteria(CRITERIA_TYPE_WIN_BG, player->GetMapId(), 0, 0, NULL, player); } } } @@ -852,7 +852,7 @@ void Battleground::EndBattleground(uint32 winner) sBattlegroundMgr->BuildBattlegroundStatusActive(&battlefieldStatus, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), player->GetBattlegroundQueueJoinTime(bgQueueTypeId), GetArenaType()); player->SendDirectMessage(battlefieldStatus.Write()); - player->UpdateCriteria(CRITERIA_TYPE_COMPLETE_BATTLEGROUND, 1); + player->UpdateCriteria(CRITERIA_TYPE_COMPLETE_BATTLEGROUND, player->GetMapId()); } } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3dd310f4b52..99835ca5060 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6230,7 +6230,7 @@ void Player::CheckAreaExploreAndOutdoor() { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ExploredZones, offset), val); - UpdateCriteria(CRITERIA_TYPE_EXPLORE_AREA); + UpdateCriteria(CRITERIA_TYPE_EXPLORE_AREA, GetAreaId()); if (areaEntry->ExplorationLevel > 0) { @@ -12475,7 +12475,7 @@ Item* Player::EquipItem(uint16 pos, Item* pItem, bool update) // only for full equip instead adding to stack UpdateCriteria(CRITERIA_TYPE_EQUIP_ITEM, pItem->GetEntry()); - UpdateCriteria(CRITERIA_TYPE_EQUIP_EPIC_ITEM, pItem->GetEntry(), slot); + UpdateCriteria(CRITERIA_TYPE_EQUIP_EPIC_ITEM, slot, pItem->GetEntry()); return pItem; } @@ -12601,7 +12601,7 @@ void Player::QuickEquipItem(uint16 pos, Item* pItem) CheckTitanGripPenalty(); UpdateCriteria(CRITERIA_TYPE_EQUIP_ITEM, pItem->GetEntry()); - UpdateCriteria(CRITERIA_TYPE_EQUIP_EPIC_ITEM, pItem->GetEntry(), slot); + UpdateCriteria(CRITERIA_TYPE_EQUIP_EPIC_ITEM, slot, pItem->GetEntry()); } } diff --git a/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp b/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp index 8486db1c166..7a9cb99ba4c 100644 --- a/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp +++ b/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp @@ -313,7 +313,7 @@ std::string QuestObjectiveCriteriaMgr::GetOwnerInfo() const return Trinity::StringFormat("%s %s", _owner->GetGUID().ToString().c_str(), _owner->GetName().c_str()); } -CriteriaList const& QuestObjectiveCriteriaMgr::GetCriteriaByType(CriteriaTypes type) const +CriteriaList const& QuestObjectiveCriteriaMgr::GetCriteriaByType(CriteriaTypes type, uint32 /*asset*/) const { return sCriteriaMgr->GetQuestObjectiveCriteriaByType(type); } diff --git a/src/server/game/Quests/QuestObjectiveCriteriaMgr.h b/src/server/game/Quests/QuestObjectiveCriteriaMgr.h index 44748b27ba2..280ae5336db 100644 --- a/src/server/game/Quests/QuestObjectiveCriteriaMgr.h +++ b/src/server/game/Quests/QuestObjectiveCriteriaMgr.h @@ -54,7 +54,7 @@ protected: void SendPacket(WorldPacket const* data) const override; std::string GetOwnerInfo() const override; - CriteriaList const& GetCriteriaByType(CriteriaTypes type) const override; + CriteriaList const& GetCriteriaByType(CriteriaTypes type, uint32 asset) const override; private: Player* _owner; diff --git a/src/server/game/Scenarios/Scenario.cpp b/src/server/game/Scenarios/Scenario.cpp index 5d9febd7ab5..48890b40cbe 100644 --- a/src/server/game/Scenarios/Scenario.cpp +++ b/src/server/game/Scenarios/Scenario.cpp @@ -305,7 +305,7 @@ std::vector<WorldPackets::Achievement::CriteriaProgress> Scenario::GetCriteriasP return criteriasProgress; } -CriteriaList const& Scenario::GetCriteriaByType(CriteriaTypes type) const +CriteriaList const& Scenario::GetCriteriaByType(CriteriaTypes type, uint32 /*asset*/) const { return sCriteriaMgr->GetScenarioCriteriaByType(type); } diff --git a/src/server/game/Scenarios/Scenario.h b/src/server/game/Scenarios/Scenario.h index 121073441b4..ee8d34a92e0 100644 --- a/src/server/game/Scenarios/Scenario.h +++ b/src/server/game/Scenarios/Scenario.h @@ -93,7 +93,7 @@ class TC_GAME_API Scenario : public CriteriaHandler std::vector<WorldPackets::Scenario::BonusObjectiveData> GetBonusObjectivesData(); std::vector<WorldPackets::Achievement::CriteriaProgress> GetCriteriasProgress(); - CriteriaList const& GetCriteriaByType(CriteriaTypes type) const override; + CriteriaList const& GetCriteriaByType(CriteriaTypes type, uint32 asset) const override; ScenarioData const* _data; private: |