Core/Achievements: Greatly optimize achievement system by splitting large types by miscvalue

Port From (https://github.com/TrinityCore/TrinityCore/commit/38d3c5ed16dd502471d810638fe21d90f8e0c7a6)
This commit is contained in:
hondacrx
2020-05-19 15:07:49 -04:00
parent 2fc4e3e71f
commit 6b67079dd1
7 changed files with 68 additions and 20 deletions
@@ -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<Criteria> GetCriteriaByType(CriteriaTypes type)
public override List<Criteria> 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<Criteria> GetCriteriaByType(CriteriaTypes type)
public override List<Criteria> GetCriteriaByType(CriteriaTypes type, uint asset)
{
return Global.CriteriaMgr.GetGuildCriteriaByType(type);
}
+55 -7
View File
@@ -77,7 +77,7 @@ namespace Game.Achievements
Log.outDebug(LogFilter.Achievement, "UpdateCriteria({0}, {1}, {2}, {3}) {4}", type, type, miscValue1, miscValue2, miscValue3, GetOwnerInfo());
List<Criteria> criteriaList = GetCriteriaByType(type);
List<Criteria> criteriaList = GetCriteriaByType(type, (uint)miscValue1);
foreach (Criteria criteria in criteriaList)
{
List<CriteriaTree> 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<Criteria> GetCriteriaByType(CriteriaTypes type) { return null; }
public virtual List<Criteria> GetCriteriaByType(CriteriaTypes type, uint asset) { return null; }
protected Dictionary<uint, CriteriaProgress> _criteriaProgress = new Dictionary<uint, CriteriaProgress>();
Dictionary<uint, uint /*ms time left*/> _timeCriteriaTrees = new Dictionary<uint, uint>();
@@ -2767,8 +2767,55 @@ namespace Game.Achievements
return _criteriaModifiers.LookupByKey(modifierTreeId);
}
public List<Criteria> 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<Criteria> 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<CriteriaTypes, Criteria> _criteriasByType = new MultiMap<CriteriaTypes, Criteria>();
MultiMap<uint, Criteria>[] _criteriasByAsset = new MultiMap<uint, Criteria>[(int)CriteriaTypes.TotalTypes];
MultiMap<CriteriaTypes, Criteria> _guildCriteriasByType = new MultiMap<CriteriaTypes, Criteria>();
MultiMap<CriteriaTypes, Criteria> _scenarioCriteriasByType = new MultiMap<CriteriaTypes, Criteria>();
MultiMap<CriteriaTypes, Criteria> _questObjectiveCriteriasByType = new MultiMap<CriteriaTypes, Criteria>();
+3 -3
View File
@@ -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());
}
}
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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)
{
@@ -312,7 +312,7 @@ namespace Game
return $"{_owner.GetGUID()} {_owner.GetName()}";
}
public override List<Criteria> GetCriteriaByType(CriteriaTypes type)
public override List<Criteria> GetCriteriaByType(CriteriaTypes type, uint asset)
{
return Global.CriteriaMgr.GetQuestObjectiveCriteriaByType(type);
}
+1 -1
View File
@@ -324,7 +324,7 @@ namespace Game.Scenarios
return criteriasProgress;
}
public override List<Criteria> GetCriteriaByType(CriteriaTypes type)
public override List<Criteria> GetCriteriaByType(CriteriaTypes type, uint asset)
{
return Global.CriteriaMgr.GetScenarioCriteriaByType(type);
}