From 29d3a0f77af446b648f51a021d1c920c74477bd9 Mon Sep 17 00:00:00 2001 From: Foglio Date: Thu, 26 Oct 2023 21:12:45 +0200 Subject: [PATCH] fixed achievement chat parsing (close #281) --- TCC.Core/Data/Chat/MessagePieceBuilder.cs | 10 ++-- TCC.Core/Data/Chat/SystemMessage.cs | 36 ++++++------- TCC.Core/Data/Chat/SystemMessagesProcessor.cs | 30 +++++------ .../Data/Databases/AchievementDatabase.cs | 52 ++++++++++++++++--- 4 files changed, 84 insertions(+), 44 deletions(-) diff --git a/TCC.Core/Data/Chat/MessagePieceBuilder.cs b/TCC.Core/Data/Chat/MessagePieceBuilder.cs index 6624f1a4..2f273423 100644 --- a/TCC.Core/Data/Chat/MessagePieceBuilder.cs +++ b/TCC.Core/Data/Chat/MessagePieceBuilder.cs @@ -49,7 +49,7 @@ public static string ParseSysMsgAchi(string msgText) var id = ChatUtils.GetId(dictionary, "achievement"); var achiName = id.ToString(); - if (Game.DB!.AchievementDatabase.Achievements.TryGetValue(id * 1000 + 1, out var g2)) + if (Game.DB!.AchievementDatabase.TryGetAchievementName(id, out var g2)) { achiName = $"[{g2}]"; } @@ -67,7 +67,7 @@ public static string ParseSysMsgQuest(string msgText) public static string ParseSysMsgAchiGrade(string msgText) { var dictionary = ChatUtils.BuildParametersDictionary(msgText); - var id = ChatUtils.GetId(dictionary, "AchievementGradeInfo"); + var id = ChatUtils.GetId(dictionary, "achievementgradeinfo"); var txt = id.ToString(); if (Game.DB!.AchievementGradeDatabase.Grades.TryGetValue(id, out var g)) txt = g; return txt; @@ -83,7 +83,7 @@ public static string ParseSysMsgDungeon(string msgText) public static string ParseSysMsgAccBenefit(string msgText) { var dictionary = ChatUtils.BuildParametersDictionary(msgText); - var id = ChatUtils.GetId(dictionary, "accountBenefit"); + var id = ChatUtils.GetId(dictionary, "accountbenefit"); var txt = id.ToString(); if (Game.DB!.AccountBenefitDatabase.Benefits.TryGetValue(id, out var ab)) txt = ab; return txt; @@ -92,7 +92,7 @@ public static string ParseSysMsgGuildQuest(string msgText) { var dictionary = ChatUtils.BuildParametersDictionary(msgText); - var id = ChatUtils.GetId(dictionary, "GuildQuest"); + var id = ChatUtils.GetId(dictionary, "guildquest"); var questName = id.ToString(); if (Game.DB!.GuildQuestDatabase.GuildQuests.TryGetValue(id, out var q)) { @@ -164,7 +164,7 @@ public static SimpleMessagePiece BuildSysMsgAchiGrade(string msgText) { var dictionary = ChatUtils.BuildParametersDictionary(msgText); - var id = ChatUtils.GetId(dictionary, "AchievementGradeInfo"); + var id = ChatUtils.GetId(dictionary, "achievementgradeinfo"); var txt = id.ToString(); var col = "fcb06f"; diff --git a/TCC.Core/Data/Chat/SystemMessage.cs b/TCC.Core/Data/Chat/SystemMessage.cs index 45aa492a..f494f191 100644 --- a/TCC.Core/Data/Chat/SystemMessage.cs +++ b/TCC.Core/Data/Chat/SystemMessage.cs @@ -95,69 +95,69 @@ void ParseSysHtmlPiece(HtmlNode piece, Dictionary prm) } MessagePieceBase mp; - if (inPiece.StartsWith("@select")) + if (inPiece.StartsWith("@select", StringComparison.InvariantCultureIgnoreCase)) { selectionStep++; continue; } - if (inPiece.StartsWith("@item")) + if (inPiece.Contains("@item", StringComparison.InvariantCultureIgnoreCase)) { mp = MessagePieceBuilder.BuildSysMsgItem(inPiece); } - else if (inPiece.StartsWith("@abnormal")) + else if (inPiece.Contains("@abnormal", StringComparison.InvariantCultureIgnoreCase)) { var abName = "Unknown"; if (Game.DB!.AbnormalityDatabase.Abnormalities.TryGetValue( uint.Parse(inPiece.Split(':')[1]), out var ab)) abName = ab.Name; mp = new SimpleMessagePiece(abName, App.Settings.FontSize, false) { Color = col }; } - else if (inPiece.StartsWith("@achievement")) - { - mp = MessagePieceBuilder.BuildSysMsgAchi(inPiece); - mp.Color = col; - } - else if (inPiece.StartsWith("@GuildQuest")) + else if (inPiece.Contains("@guildquest", StringComparison.InvariantCultureIgnoreCase)) { mp = MessagePieceBuilder.BuildSysMsgGuildQuest(inPiece); mp.Color = col; } - else if (inPiece.StartsWith("@dungeon")) + else if (inPiece.Contains("@dungeon", StringComparison.InvariantCultureIgnoreCase)) { mp = MessagePieceBuilder.BuildSysMsgDungeon(inPiece); mp.Color = col; } - else if (inPiece.StartsWith("@accountBenefit")) + else if (inPiece.Contains("@accountbenefit", StringComparison.InvariantCultureIgnoreCase)) { mp = MessagePieceBuilder.BuildSysMsgAccBenefit(inPiece); mp.Color = col; } - else if (inPiece.StartsWith("@AchievementGradeInfo")) + else if (inPiece.Contains("@achievementgradeinfo", StringComparison.InvariantCultureIgnoreCase)) { mp = MessagePieceBuilder.BuildSysMsgAchiGrade(inPiece); } - else if (inPiece.StartsWith("@quest")) + else if (inPiece.Contains("@achievement", StringComparison.InvariantCultureIgnoreCase)) // this has to be here, find a better way pls + { + mp = MessagePieceBuilder.BuildSysMsgAchi(inPiece); + mp.Color = col; + } + else if (inPiece.Contains("@quest", StringComparison.InvariantCultureIgnoreCase)) { mp = MessagePieceBuilder.BuildSysMsgQuest(inPiece); mp.Color = col; } - else if (inPiece.StartsWith("@creature")) + else if (inPiece.Contains("@creature", StringComparison.InvariantCultureIgnoreCase)) { mp = MessagePieceBuilder.BuildSysMsgCreature(inPiece); mp.Color = col; } - else if (inPiece.StartsWith("@rgn")) + else if (inPiece.Contains("@rgn", StringComparison.InvariantCultureIgnoreCase)) { mp = MessagePieceBuilder.BuildSysMsgRegion(inPiece); mp.Color = col; } - else if (inPiece.StartsWith("@zoneName")) + else if (inPiece.Contains("@zonename", StringComparison.InvariantCultureIgnoreCase)) { mp = MessagePieceBuilder.BuildSysMsgZone(inPiece); mp.Color = col; } - else if (inPiece.Contains("@money")) + else if (inPiece.Contains("@money", StringComparison.InvariantCultureIgnoreCase)) { - var t = inPiece.Replace("@money", ""); + var t = inPiece.Replace("@money", "", StringComparison.InvariantCultureIgnoreCase); mp = new MoneyMessagePiece(new Money(t)); Channel = ChatChannel.Money; } diff --git a/TCC.Core/Data/Chat/SystemMessagesProcessor.cs b/TCC.Core/Data/Chat/SystemMessagesProcessor.cs index ea761da9..186071a2 100644 --- a/TCC.Core/Data/Chat/SystemMessagesProcessor.cs +++ b/TCC.Core/Data/Chat/SystemMessagesProcessor.cs @@ -60,56 +60,56 @@ static string Build(SystemMessageData template, params string[] parameters) } string mp; - if (inPiece.StartsWith("@select")) + if (inPiece.StartsWith("@select", StringComparison.InvariantCultureIgnoreCase)) { selectionStep++; continue; } - if (inPiece.StartsWith("@item")) + if (inPiece.StartsWith("@item", StringComparison.InvariantCultureIgnoreCase)) { mp = SystemMessageParser.ParseSysMsgItem(inPiece); } - else if (inPiece.StartsWith("@abnormal")) + else if (inPiece.StartsWith("@abnormal", StringComparison.InvariantCultureIgnoreCase)) { var abName = "Unknown"; if (Game.DB!.AbnormalityDatabase.Abnormalities.TryGetValue(uint.Parse(inPiece.Split(':')[1]), out var ab)) abName = ab.Name; mp = abName; } - else if (inPiece.StartsWith("@achievement")) - { - mp = SystemMessageParser.ParseSysMsgAchi(inPiece); - } - else if (inPiece.StartsWith("@GuildQuest")) + else if (inPiece.StartsWith("@GuildQuest", StringComparison.InvariantCultureIgnoreCase)) { mp = SystemMessageParser.ParseSysMsgGuildQuest(inPiece); } - else if (inPiece.StartsWith("@dungeon")) + else if (inPiece.StartsWith("@dungeon", StringComparison.InvariantCultureIgnoreCase)) { mp = SystemMessageParser.ParseSysMsgDungeon(inPiece); } - else if (inPiece.StartsWith("@accountBenefit")) + else if (inPiece.StartsWith("@accountBenefit", StringComparison.InvariantCultureIgnoreCase)) { mp = SystemMessageParser.ParseSysMsgAccBenefit(inPiece); } - else if (inPiece.StartsWith("@AchievementGradeInfo")) + else if (inPiece.StartsWith("@AchievementGradeInfo", StringComparison.InvariantCultureIgnoreCase)) { mp = SystemMessageParser.ParseSysMsgAchiGrade(inPiece); } - else if (inPiece.StartsWith("@quest")) + else if (inPiece.StartsWith("@achievement", StringComparison.InvariantCultureIgnoreCase)) + { + mp = SystemMessageParser.ParseSysMsgAchi(inPiece); + } + else if (inPiece.StartsWith("@quest", StringComparison.InvariantCultureIgnoreCase)) { mp = SystemMessageParser.ParseSysMsgQuest(inPiece); } - else if (inPiece.StartsWith("@creature")) + else if (inPiece.StartsWith("@creature", StringComparison.InvariantCultureIgnoreCase)) { mp = SystemMessageParser.ParseSysMsgCreature(inPiece); } - else if (inPiece.StartsWith("@rgn")) + else if (inPiece.StartsWith("@rgn", StringComparison.InvariantCultureIgnoreCase)) { mp = SystemMessageParser.ParseSysMsgRegion(inPiece); } - else if (inPiece.StartsWith("@zoneName")) + else if (inPiece.StartsWith("@zoneName", StringComparison.InvariantCultureIgnoreCase)) { mp = SystemMessageParser.ParseSysMsgZone(inPiece); } diff --git a/TCC.Core/Data/Databases/AchievementDatabase.cs b/TCC.Core/Data/Databases/AchievementDatabase.cs index 98eeed11..421847f2 100644 --- a/TCC.Core/Data/Databases/AchievementDatabase.cs +++ b/TCC.Core/Data/Databases/AchievementDatabase.cs @@ -1,14 +1,21 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.IO; +using System.Runtime.InteropServices.ComTypes; namespace TCC.Data.Databases; +public readonly record struct Achievement(uint Id, uint NameId, string Name); + public class AchievementDatabase : DatabaseBase { - public readonly Dictionary Achievements; + readonly Dictionary _achievements; + readonly Dictionary _achievementsByName; public AchievementDatabase(string lang) : base(lang) { - Achievements = new Dictionary(); + _achievements = new Dictionary(); + _achievementsByName = new Dictionary(); } protected override string FolderName => "achievements"; @@ -17,7 +24,8 @@ public AchievementDatabase(string lang) : base(lang) public override void Load() { - Achievements.Clear(); + _achievements.Clear(); + _achievementsByName.Clear(); //var f = File.OpenText(FullPath); var lines = File.ReadAllLines(FullPath); foreach (var line in lines) @@ -26,9 +34,41 @@ public override void Load() if (string.IsNullOrWhiteSpace(line)) break; var s = line.Split('\t'); if (!uint.TryParse(s[0], out var id)) continue; - var name = s[1]; + if (!uint.TryParse(s[1], out var nameid)) continue; + var name = s[2]; + + var achi = new Achievement(id, nameid, name); + _achievements[id] = achi; + _achievementsByName[nameid] = achi; + } + } + + public bool TryGetAchievementNameById(uint id, [NotNullWhen(true)] out string? name) + { + var ret = _achievements.TryGetValue(id, out var achi); + if (!ret) + { + name = null; + return false; + } + name = achi.Name; + return true; + } - Achievements.Add(id, name); + public bool TryGetAchievementNameByNameId(uint nameId, [NotNullWhen(true)] out string? name) + { + var ret = _achievementsByName.TryGetValue(nameId, out var achi); + if (!ret) + { + name = null; + return false; } + name = achi.Name; + return true; + } + + public bool TryGetAchievementName(uint id, [NotNullWhen(true)] out string? o) + { + return TryGetAchievementNameById(id, out o) || TryGetAchievementNameByNameId(id ,out o); } } \ No newline at end of file