Core/Achievements: Minor fixes

Port From (https://github.com/TrinityCore/TrinityCore/commit/3e833739071a689dc34e33f7a511d8cc50e00b94)
This commit is contained in:
hondacrx
2020-05-22 14:11:32 -04:00
parent 13cb4fb0ee
commit 3b44a21d76
3 changed files with 91 additions and 46 deletions
+49 -11
View File
@@ -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)
+10 -35
View File
@@ -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<uint /*criteriaTreeID*/, AchievementRecord> achievementCriteriaTreeIds = new Dictionary<uint, AchievementRecord>();
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.");
}
@@ -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<CriteriaProgressPkt> Progress = new List<CriteriaProgressPkt>();
}
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<ulong> 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) { }