From 6b67079dd1c3a25efc2be198988cf891df1c5e7b Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 19 May 2020 15:07:49 -0400 Subject: [PATCH] Core/Achievements: Greatly optimize achievement system by splitting large types by miscvalue Port From (https://github.com/TrinityCore/TrinityCore/commit/38d3c5ed16dd502471d810638fe21d90f8e0c7a6) --- .../Game/Achievements/AchievementManager.cs | 10 +-- Source/Game/Achievements/CriteriaHandler.cs | 62 ++++++++++++++++--- Source/Game/BattleGrounds/BattleGround.cs | 6 +- Source/Game/Entities/Player/Player.Items.cs | 4 +- Source/Game/Entities/Player/Player.cs | 2 +- .../Quest/QuestObjectiveCriteriaManager.cs | 2 +- Source/Game/Scenarios/Scenario.cs | 2 +- 7 files changed, 68 insertions(+), 20 deletions(-) diff --git a/Source/Game/Achievements/AchievementManager.cs b/Source/Game/Achievements/AchievementManager.cs index a7f964ab9..226c8d58f 100644 --- a/Source/Game/Achievements/AchievementManager.cs +++ b/Source/Game/Achievements/AchievementManager.cs @@ -500,7 +500,7 @@ namespace Game.Achievements if (!achievement.Flags.HasAnyFlag(AchievementFlags.TrackingFlag)) _achievementPoints += achievement.Points; - UpdateCriteria(CriteriaTypes.CompleteAchievement, 0, 0, 0, null, referencePlayer); + UpdateCriteria(CriteriaTypes.CompleteAchievement, achievement.Id, 0, 0, null, referencePlayer); UpdateCriteria(CriteriaTypes.EarnAchievementPoints, achievement.Points, 0, 0, null, referencePlayer); // reward items and titles if any @@ -654,9 +654,9 @@ namespace Game.Achievements _owner.SendPacket(data); } - public override List GetCriteriaByType(CriteriaTypes type) + public override List GetCriteriaByType(CriteriaTypes type, uint asset) { - return Global.CriteriaMgr.GetPlayerCriteriaByType(type); + return Global.CriteriaMgr.GetPlayerCriteriaByType(type, asset); } public override string GetOwnerInfo() @@ -963,7 +963,7 @@ namespace Game.Achievements if (!achievement.Flags.HasAnyFlag(AchievementFlags.TrackingFlag)) _achievementPoints += achievement.Points; - UpdateCriteria(CriteriaTypes.CompleteAchievement, 0, 0, 0, null, referencePlayer); + UpdateCriteria(CriteriaTypes.CompleteAchievement, achievement.Id, 0, 0, null, referencePlayer); UpdateCriteria(CriteriaTypes.EarnAchievementPoints, achievement.Points, 0, 0, null, referencePlayer); } @@ -1018,7 +1018,7 @@ namespace Game.Achievements _owner.BroadcastPacket(data); } - public override List GetCriteriaByType(CriteriaTypes type) + public override List GetCriteriaByType(CriteriaTypes type, uint asset) { return Global.CriteriaMgr.GetGuildCriteriaByType(type); } diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index 872948e2c..55c6ebc2a 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -77,7 +77,7 @@ namespace Game.Achievements Log.outDebug(LogFilter.Achievement, "UpdateCriteria({0}, {1}, {2}, {3}) {4}", type, type, miscValue1, miscValue2, miscValue3, GetOwnerInfo()); - List criteriaList = GetCriteriaByType(type); + List criteriaList = GetCriteriaByType(type, (uint)miscValue1); foreach (Criteria criteria in criteriaList) { List trees = Global.CriteriaMgr.GetCriteriaTreesByCriteria(criteria.Id); @@ -93,6 +93,7 @@ namespace Game.Achievements switch (type) { // std. case: increment at 1 + case CriteriaTypes.WinBg: case CriteriaTypes.NumberOfTalentResets: case CriteriaTypes.LoseDuel: case CriteriaTypes.CreateAuction: @@ -106,6 +107,7 @@ namespace Game.Achievements case CriteriaTypes.ReceiveEpicItem: case CriteriaTypes.Death: case CriteriaTypes.CompleteDailyQuest: + case CriteriaTypes.CompleteBattleground: case CriteriaTypes.DeathAtMap: case CriteriaTypes.DeathInDungeon: case CriteriaTypes.KilledByCreature: @@ -150,8 +152,6 @@ namespace Game.Achievements case CriteriaTypes.TotalDamageReceived: case CriteriaTypes.TotalHealingReceived: case CriteriaTypes.UseLfdToGroupWithPlayers: - case CriteriaTypes.WinBg: - case CriteriaTypes.CompleteBattleground: case CriteriaTypes.DamageDone: case CriteriaTypes.HealingDone: case CriteriaTypes.HeartOfAzerothArtifactPowerEarned: @@ -1102,8 +1102,8 @@ namespace Game.Achievements return false; break; case CriteriaTypes.EquipEpicItem: - // miscValue1 = itemid miscValue2 = itemSlot - if (miscValue1 == 0 || miscValue2 != criteria.Entry.Asset) + // miscValue1 = itemSlot miscValue2 = itemid + if (miscValue2 == 0 || miscValue1 != criteria.Entry.Asset) return false; break; case CriteriaTypes.RollNeedOnLoot: @@ -2467,7 +2467,7 @@ namespace Game.Achievements public virtual bool RequiredAchievementSatisfied(uint achievementId) { return false; } public virtual string GetOwnerInfo() { return ""; } - public virtual List GetCriteriaByType(CriteriaTypes type) { return null; } + public virtual List GetCriteriaByType(CriteriaTypes type, uint asset) { return null; } protected Dictionary _criteriaProgress = new Dictionary(); Dictionary _timeCriteriaTrees = new Dictionary(); @@ -2767,8 +2767,55 @@ namespace Game.Achievements return _criteriaModifiers.LookupByKey(modifierTreeId); } - public List GetPlayerCriteriaByType(CriteriaTypes type) + bool IsCriteriaTypeStoredByAsset(CriteriaTypes type) { + switch (type) + { + case CriteriaTypes.KillCreature: + case CriteriaTypes.WinBg: + case CriteriaTypes.ReachSkillLevel: + case CriteriaTypes.CompleteAchievement: + case CriteriaTypes.CompleteQuestsInZone: + case CriteriaTypes.CompleteBattleground: + case CriteriaTypes.KilledByCreature: + case CriteriaTypes.CompleteQuest: + case CriteriaTypes.BeSpellTarget: + case CriteriaTypes.CastSpell: + case CriteriaTypes.BgObjectiveCapture: + case CriteriaTypes.HonorableKillAtArea: + case CriteriaTypes.LearnSpell: + case CriteriaTypes.OwnItem: + case CriteriaTypes.LearnSkillLevel: + case CriteriaTypes.UseItem: + case CriteriaTypes.LootItem: + case CriteriaTypes.ExploreArea: + case CriteriaTypes.GainReputation: + case CriteriaTypes.EquipEpicItem: + case CriteriaTypes.HkClass: + case CriteriaTypes.HkRace: + case CriteriaTypes.DoEmote: + case CriteriaTypes.EquipItem: + case CriteriaTypes.UseGameobject: + case CriteriaTypes.BeSpellTarget2: + case CriteriaTypes.FishInGameobject: + case CriteriaTypes.LearnSkilllineSpells: + case CriteriaTypes.LootType: + case CriteriaTypes.CastSpell2: + case CriteriaTypes.LearnSkillLine: + return true; + default: + return false; + } + } + + public List GetPlayerCriteriaByType(CriteriaTypes type, uint asset) + { + if (asset != 0 && IsCriteriaTypeStoredByAsset(type)) + { + if (_criteriasByAsset[(int)type].ContainsKey(asset)) + return _criteriasByAsset[(int)type][asset]; + } + return _criteriasByType.LookupByKey(type); } @@ -2843,6 +2890,7 @@ namespace Game.Achievements // store criterias by type to speed up lookup MultiMap _criteriasByType = new MultiMap(); + MultiMap[] _criteriasByAsset = new MultiMap[(int)CriteriaTypes.TotalTypes]; MultiMap _guildCriteriasByType = new MultiMap(); MultiMap _scenarioCriteriasByType = new MultiMap(); MultiMap _questObjectiveCriteriasByType = new MultiMap(); diff --git a/Source/Game/BattleGrounds/BattleGround.cs b/Source/Game/BattleGrounds/BattleGround.cs index 643d165aa..650f85446 100644 --- a/Source/Game/BattleGrounds/BattleGround.cs +++ b/Source/Game/BattleGrounds/BattleGround.cs @@ -772,7 +772,7 @@ namespace Game.BattleGrounds // TODO: lose honor xp } - player.UpdateCriteria(CriteriaTypes.WinBg, 1); + player.UpdateCriteria(CriteriaTypes.WinBg, player.GetMapId()); if (!guildAwarded) { guildAwarded = true; @@ -781,7 +781,7 @@ namespace Game.BattleGrounds { Guild guild = Global.GuildMgr.GetGuildById(guildId); if (guild) - guild.UpdateCriteria(CriteriaTypes.WinBg, 1, 0, 0, null, player); + guild.UpdateCriteria(CriteriaTypes.WinBg, player.GetMapId(), 0, 0, null, player); } } } @@ -802,7 +802,7 @@ namespace Game.BattleGrounds Global.BattlegroundMgr.BuildBattlegroundStatusActive(out battlefieldStatus, this, player, player.GetBattlegroundQueueIndex(bgQueueTypeId), player.GetBattlegroundQueueJoinTime(bgQueueTypeId), GetArenaType()); player.SendPacket(battlefieldStatus); - player.UpdateCriteria(CriteriaTypes.CompleteBattleground, 1); + player.UpdateCriteria(CriteriaTypes.CompleteBattleground, player.GetMapId()); } } diff --git a/Source/Game/Entities/Player/Player.Items.cs b/Source/Game/Entities/Player/Player.Items.cs index 1bf112c56..f6f640ea2 100644 --- a/Source/Game/Entities/Player/Player.Items.cs +++ b/Source/Game/Entities/Player/Player.Items.cs @@ -1710,7 +1710,7 @@ namespace Game.Entities // only for full equip instead adding to stack UpdateCriteria(CriteriaTypes.EquipItem, pItem.GetEntry()); - UpdateCriteria(CriteriaTypes.EquipEpicItem, pItem.GetEntry(), slot); + UpdateCriteria(CriteriaTypes.EquipEpicItem, slot, pItem.GetEntry()); return pItem; } @@ -1836,7 +1836,7 @@ namespace Game.Entities CheckTitanGripPenalty(); UpdateCriteria(CriteriaTypes.EquipItem, pItem.GetEntry()); - UpdateCriteria(CriteriaTypes.EquipEpicItem, pItem.GetEntry(), slot); + UpdateCriteria(CriteriaTypes.EquipEpicItem, slot, pItem.GetEntry()); } } public void SendEquipError(InventoryResult msg, Item item1 = null, Item item2 = null, uint itemId = 0) diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index b55f1819c..a65fa9e13 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -6330,7 +6330,7 @@ namespace Game.Entities { SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ExploredZones, (int)offset), val); - UpdateCriteria(CriteriaTypes.ExploreArea); + UpdateCriteria(CriteriaTypes.ExploreArea, GetAreaId()); if (areaEntry.ExplorationLevel > 0) { diff --git a/Source/Game/Quest/QuestObjectiveCriteriaManager.cs b/Source/Game/Quest/QuestObjectiveCriteriaManager.cs index 9fd382852..49074f77c 100644 --- a/Source/Game/Quest/QuestObjectiveCriteriaManager.cs +++ b/Source/Game/Quest/QuestObjectiveCriteriaManager.cs @@ -312,7 +312,7 @@ namespace Game return $"{_owner.GetGUID()} {_owner.GetName()}"; } - public override List GetCriteriaByType(CriteriaTypes type) + public override List GetCriteriaByType(CriteriaTypes type, uint asset) { return Global.CriteriaMgr.GetQuestObjectiveCriteriaByType(type); } diff --git a/Source/Game/Scenarios/Scenario.cs b/Source/Game/Scenarios/Scenario.cs index 47dbd4647..61dfbccc5 100644 --- a/Source/Game/Scenarios/Scenario.cs +++ b/Source/Game/Scenarios/Scenario.cs @@ -324,7 +324,7 @@ namespace Game.Scenarios return criteriasProgress; } - public override List GetCriteriaByType(CriteriaTypes type) + public override List GetCriteriaByType(CriteriaTypes type, uint asset) { return Global.CriteriaMgr.GetScenarioCriteriaByType(type); }