From 3b44a21d76c349175e6c0cc59c9b904c03ef0c24 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Fri, 22 May 2020 14:11:32 -0400 Subject: [PATCH] Core/Achievements: Minor fixes Port From (https://github.com/TrinityCore/TrinityCore/commit/3e833739071a689dc34e33f7a511d8cc50e00b94) --- .../Game/Achievements/AchievementManager.cs | 60 +++++++++++++++---- Source/Game/Achievements/CriteriaHandler.cs | 45 ++++---------- .../Network/Packets/AchievementPackets.cs | 32 ++++++++++ 3 files changed, 91 insertions(+), 46 deletions(-) diff --git a/Source/Game/Achievements/AchievementManager.cs b/Source/Game/Achievements/AchievementManager.cs index 226c8d58f..192415e1f 100644 --- a/Source/Game/Achievements/AchievementManager.cs +++ b/Source/Game/Achievements/AchievementManager.cs @@ -296,6 +296,7 @@ namespace Game.Achievements CriteriaProgress progress = new CriteriaProgress(); progress.Counter = counter; progress.Date = date; + progress.PlayerGUID = _owner.GetGUID(); progress.Changed = false; _criteriaProgress[id] = progress; @@ -391,6 +392,7 @@ namespace Game.Achievements public override void SendAllData(Player receiver) { + AllAccountCriteria allAccountCriteria = new AllAccountCriteria(); AllAchievementData achievementData = new AllAchievementData(); foreach (var pair in _completedAchievements) @@ -412,6 +414,8 @@ namespace Game.Achievements foreach (var pair in _criteriaProgress) { + Criteria criteria = Global.CriteriaMgr.GetCriteria(pair.Key); + CriteriaProgressPkt progress = new CriteriaProgressPkt(); progress.Id = pair.Key; progress.Quantity = pair.Value.Counter; @@ -421,8 +425,24 @@ namespace Game.Achievements progress.TimeFromStart = 0; progress.TimeFromCreate = 0; achievementData.Data.Progress.Add(progress); + + if (criteria.FlagsCu.HasAnyFlag(CriteriaFlagsCu.Account)) + { + CriteriaProgressPkt accountProgress = new CriteriaProgressPkt(); + accountProgress.Id = pair.Key; + accountProgress.Quantity = pair.Value.Counter; + accountProgress.Player = _owner.GetSession().GetBattlenetAccountGUID(); + accountProgress.Flags = 0; + accountProgress.Date = pair.Value.Date; + accountProgress.TimeFromStart = 0; + accountProgress.TimeFromCreate = 0; + allAccountCriteria.Progress.Add(accountProgress); + } } + if (!allAccountCriteria.Progress.Empty()) + SendPacket(allAccountCriteria); + SendPacket(achievementData); } @@ -576,20 +596,38 @@ namespace Game.Achievements public override void SendCriteriaUpdate(Criteria criteria, CriteriaProgress progress, uint timeElapsed, bool timedCompleted) { - CriteriaUpdate criteriaUpdate = new CriteriaUpdate(); + if (criteria.FlagsCu.HasAnyFlag(CriteriaFlagsCu.Account)) + { + AccountCriteriaUpdate criteriaUpdate = new AccountCriteriaUpdate(); + criteriaUpdate.Progress.Id = criteria.Id; + criteriaUpdate.Progress.Quantity = progress.Counter; + criteriaUpdate.Progress.Player = _owner.GetSession().GetBattlenetAccountGUID(); + criteriaUpdate.Progress.Flags = 0; + if (criteria.Entry.StartTimer != 0) + criteriaUpdate.Progress.Flags = timedCompleted ? 1 : 0u; // 1 is for keeping the counter at 0 in client - criteriaUpdate.CriteriaID = criteria.Id; - criteriaUpdate.Quantity = progress.Counter; - criteriaUpdate.PlayerGUID = _owner.GetGUID(); - criteriaUpdate.Flags = 0; - if (criteria.Entry.StartTimer != 0) - criteriaUpdate.Flags = timedCompleted ? 1 : 0u; // 1 is for keeping the counter at 0 in client + criteriaUpdate.Progress.Date = progress.Date; + criteriaUpdate.Progress.TimeFromStart = timeElapsed; + criteriaUpdate.Progress.TimeFromCreate = 0; + SendPacket(criteriaUpdate); + } + else + { + CriteriaUpdate criteriaUpdate = new CriteriaUpdate(); - criteriaUpdate.CurrentTime = progress.Date; - criteriaUpdate.ElapsedTime = timeElapsed; - criteriaUpdate.CreationTime = 0; + criteriaUpdate.CriteriaID = criteria.Id; + criteriaUpdate.Quantity = progress.Counter; + criteriaUpdate.PlayerGUID = _owner.GetGUID(); + criteriaUpdate.Flags = 0; + if (criteria.Entry.StartTimer != 0) + criteriaUpdate.Flags = timedCompleted ? 1 : 0u; // 1 is for keeping the counter at 0 in client - SendPacket(criteriaUpdate); + criteriaUpdate.CurrentTime = progress.Date; + criteriaUpdate.ElapsedTime = timeElapsed; + criteriaUpdate.CreationTime = 0; + + SendPacket(criteriaUpdate); + } } public override void SendCriteriaProgressRemoved(uint criteriaId) diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index f224fd594..af0591aa6 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -1596,6 +1596,7 @@ namespace Game.Achievements return false; break; case CriteriaAdditionalCondition.HasAchievement: // 86 + case CriteriaAdditionalCondition.HasAchievementOnCharacter: // 87 if (!referencePlayer.HasAchieved(reqValue)) return false; break; @@ -2498,12 +2499,9 @@ namespace Game.Achievements // Build tree foreach (var treeNode in _criteriaModifiers.Values) { - if (treeNode.Entry.Parent == 0) - continue; - - var parent = _criteriaModifiers.LookupByKey(treeNode.Entry.Parent); - if (parent != null) - parent.Children.Add(treeNode); + ModifierTreeNode parentNode = _criteriaModifiers.LookupByKey(treeNode.Entry.Parent); + if (parentNode != null) + parentNode.Children.Add(treeNode); } Log.outInfo(LogFilter.ServerLoading, "Loaded {0} criteria modifiers in {1} ms", _criteriaModifiers.Count, Time.GetMSTimeDiffToNow(oldMSTime)); @@ -2535,12 +2533,6 @@ namespace Game.Achievements { uint oldMSTime = Time.GetMSTime(); - if (CliDB.CriteriaTreeStorage.Empty()) - { - Log.outError(LogFilter.ServerLoading, "Loaded 0 criteria."); - return; - } - Dictionary achievementCriteriaTreeIds = new Dictionary(); foreach (AchievementRecord achievement in CliDB.AchievementStorage.Values) if (achievement.CriteriaTree != 0) @@ -2589,25 +2581,11 @@ namespace Game.Achievements // Build tree foreach (var pair in _criteriaTrees) { - if (pair.Value.Entry.Parent == 0) - continue; - - var parent = _criteriaTrees.LookupByKey(pair.Value.Entry.Parent); + CriteriaTree parent = _criteriaTrees.LookupByKey(pair.Value.Entry.Parent); if (parent != null) - { parent.Children.Add(pair.Value); - while (parent != null) - { - var cur = parent; - parent = _criteriaTrees.LookupByKey(parent.Entry.Parent); - if (parent == null) - { - if (CliDB.CriteriaStorage.ContainsKey(pair.Value.Entry.CriteriaID)) - _criteriaTreeByCriteria.Add(pair.Value.Entry.CriteriaID, cur); - } - } - } - else if (CliDB.CriteriaStorage.ContainsKey(pair.Value.Entry.CriteriaID)) + + if (CliDB.CriteriaStorage.HasRecord(pair.Value.Entry.CriteriaID)) _criteriaTreeByCriteria.Add(pair.Value.Entry.CriteriaID, pair.Value); } @@ -2633,14 +2611,14 @@ namespace Game.Achievements Criteria criteria = new Criteria(); criteria.Id = criteriaEntry.Id; criteria.Entry = criteriaEntry; - var mod = _criteriaModifiers.LookupByKey(criteriaEntry.ModifierTreeId); - if (mod != null) - criteria.Modifier = mod; + criteria.Modifier = _criteriaModifiers.LookupByKey(criteriaEntry.ModifierTreeId); _criteria[criteria.Id] = criteria; foreach (CriteriaTree tree in treeList) { + tree.Criteria = criteria; + AchievementRecord achievement = tree.Achievement; if (achievement != null) { @@ -2688,9 +2666,6 @@ namespace Game.Achievements _criteriasByFailEvent[criteriaEntry.FailEvent].Add((int)criteriaEntry.FailAsset, criteria); } - foreach (var p in _criteriaTrees) - p.Value.Criteria = GetCriteria(p.Value.Entry.CriteriaID); - Log.outInfo(LogFilter.ServerLoading, $"Loaded {criterias} criteria, {guildCriterias} guild criteria, {scenarioCriterias} scenario criteria and {questObjectiveCriterias} quest objective criteria in {Time.GetMSTimeDiffToNow(oldMSTime)} ms."); } diff --git a/Source/Game/Network/Packets/AchievementPackets.cs b/Source/Game/Network/Packets/AchievementPackets.cs index 75aaafd5c..dfbbfdec0 100644 --- a/Source/Game/Network/Packets/AchievementPackets.cs +++ b/Source/Game/Network/Packets/AchievementPackets.cs @@ -35,6 +35,20 @@ namespace Game.Network.Packets public AllAchievements Data = new AllAchievements(); } + class AllAccountCriteria : ServerPacket + { + public AllAccountCriteria() : base(ServerOpcodes.AllAccountCriteria, ConnectionType.Instance) { } + + public override void Write() + { + _worldPacket.WriteInt32(Progress.Count); + foreach (var progress in Progress) + progress.Write(_worldPacket); + } + + public List Progress = new List(); + } + public class RespondInspectAchievements : ServerPacket { public RespondInspectAchievements() : base(ServerOpcodes.RespondInspectAchievements, ConnectionType.Instance) { } @@ -62,6 +76,11 @@ namespace Game.Network.Packets _worldPacket.WritePackedTime(CurrentTime); _worldPacket.WriteUInt32(ElapsedTime); _worldPacket.WriteUInt32(CreationTime); + _worldPacket.WriteBit(RafAcceptanceID.HasValue); + _worldPacket.FlushBits(); + + if (RafAcceptanceID.HasValue) + _worldPacket.WriteUInt64(RafAcceptanceID.Value); } public uint CriteriaID; @@ -71,8 +90,21 @@ namespace Game.Network.Packets public long CurrentTime; public uint ElapsedTime; public uint CreationTime; + public Optional RafAcceptanceID; } + class AccountCriteriaUpdate : ServerPacket + { + public AccountCriteriaUpdate() : base(ServerOpcodes.AccountCriteriaUpdate) { } + + public override void Write() + { + Progress.Write(_worldPacket); + } + + public CriteriaProgressPkt Progress; + } + public class CriteriaDeleted : ServerPacket { public CriteriaDeleted() : base(ServerOpcodes.CriteriaDeleted, ConnectionType.Instance) { }