From a8d7cd1455321e2418d955c20710fde101823d4b Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Fri, 6 Feb 2015 08:30:49 -0800 Subject: [PATCH] 3.0.5515.15265 code cleanup and fix item parsing in chatcleaner --- FFXIVAPP.Client/Delegates/PCWorkerDelegate.cs | 3 +-- FFXIVAPP.Client/Helpers/ActorEntityHelper.cs | 2 +- FFXIVAPP.Client/Memory/ChatCleaner.cs | 25 +++++++++++++----- FFXIVAPP.Client/Memory/MonsterWorker.cs | 3 +-- FFXIVAPP.Client/Memory/PlayerInfoWorker.cs | 2 +- FFXIVAPP.Client/Memory/TargetWorker.cs | 2 +- distribution/FFXIVAPP.Client.exe | Bin 1783296 -> 1783296 bytes distribution/FFXIVAPP.Updater.exe | Bin 489472 -> 489472 bytes 8 files changed, 23 insertions(+), 14 deletions(-) diff --git a/FFXIVAPP.Client/Delegates/PCWorkerDelegate.cs b/FFXIVAPP.Client/Delegates/PCWorkerDelegate.cs index dcdd6b52..de992177 100644 --- a/FFXIVAPP.Client/Delegates/PCWorkerDelegate.cs +++ b/FFXIVAPP.Client/Delegates/PCWorkerDelegate.cs @@ -98,11 +98,10 @@ public static IList GetUniqueNPCEntities() #region Declarations - public static ActorEntity CurrentUser { get; set; } - private static IList _npcEntities = new List(); private static IList _uniqueNPCEntities = new List(); + public static ActorEntity CurrentUser { get; set; } #endregion } diff --git a/FFXIVAPP.Client/Helpers/ActorEntityHelper.cs b/FFXIVAPP.Client/Helpers/ActorEntityHelper.cs index 73bb84ee..4bde91fa 100644 --- a/FFXIVAPP.Client/Helpers/ActorEntityHelper.cs +++ b/FFXIVAPP.Client/Helpers/ActorEntityHelper.cs @@ -29,12 +29,12 @@ using System; using System.Collections.Generic; +using FFXIVAPP.Client.Delegates; using FFXIVAPP.Client.Memory; using FFXIVAPP.Client.Properties; using FFXIVAPP.Common.Core.Memory; using FFXIVAPP.Common.Core.Memory.Enums; using FFXIVAPP.Common.Helpers; -using FFXIVAPP.Client.Delegates; namespace FFXIVAPP.Client.Helpers { diff --git a/FFXIVAPP.Client/Memory/ChatCleaner.cs b/FFXIVAPP.Client/Memory/ChatCleaner.cs index 879e20ae..38efa0d0 100644 --- a/FFXIVAPP.Client/Memory/ChatCleaner.cs +++ b/FFXIVAPP.Client/Memory/ChatCleaner.cs @@ -111,8 +111,6 @@ private string ProcessFullLine(byte[] bytes) { var autoTranslateList = new List(); var newList = new List(); - //var check = Encoding.UTF8.GetString(bytes.Take(4) - // .ToArray()); for (var x = 0; x < bytes.Count(); x++) { if (bytes[x] == 2) @@ -133,14 +131,16 @@ private string ProcessFullLine(byte[] bytes) //2 46 5 7 242 2 210 3 //2 29 1 3 var length = bytes[x + 2]; + var limit = length - 1; if (length > 1) { x = x + 3; autoTranslateList.Add(Convert.ToByte('[')); - while (bytes[x] != 3) + var translated = new byte[limit]; + Buffer.BlockCopy(bytes, x, translated, 0, limit); + foreach (var b in translated) { - autoTranslateList.AddRange(Encoding.UTF8.GetBytes(bytes[x].ToString("X2"))); - x++; + autoTranslateList.AddRange(Encoding.UTF8.GetBytes(b.ToString("X2"))); } autoTranslateList.Add(Convert.ToByte(']')); string aCheckStr; @@ -150,9 +150,16 @@ private string ProcessFullLine(byte[] bytes) { aCheckStr = ""; } - var atbyte = (!String.IsNullOrWhiteSpace(aCheckStr)) ? Encoding.UTF8.GetBytes(aCheckStr) : autoTranslateList.ToArray(); - newList.AddRange(atbyte); + if (String.IsNullOrWhiteSpace(aCheckStr)) + { + // TODO: implement showing or using in the chatlog + } + else + { + newList.AddRange(Encoding.UTF8.GetBytes(aCheckStr)); + } autoTranslateList.Clear(); + x += limit; } else { @@ -166,15 +173,19 @@ private string ProcessFullLine(byte[] bytes) break; } } + //var cleanedList = newList.Where(v => (v >= 0x0020 && v <= 0xD7FF) || (v >= 0xE000 && v <= 0xFFFD) || v == 0x0009 || v == 0x000A || v == 0x000D); var cleaned = HttpUtility.HtmlDecode(Encoding.UTF8.GetString(newList.ToArray())) .Replace(" ", " "); autoTranslateList.Clear(); newList.Clear(); cleaned = Regex.Replace(cleaned, @"", "⇒"); cleaned = Regex.Replace(cleaned, @"", "[HQ]"); + cleaned = Regex.Replace(cleaned, @"", ""); + cleaned = Regex.Replace(cleaned, @"�", ""); cleaned = Regex.Replace(cleaned, @"\[+0([12])010101([\w]+)?\]+", ""); cleaned = Regex.Replace(cleaned, @"\[+CF010101([\w]+)?\]+", ""); cleaned = Regex.Replace(cleaned, @"\[+..FF\w{6}\]+|\[+EC\]+", ""); + cleaned = Regex.Replace(cleaned, @"\[\]+", ""); line = cleaned; } catch (Exception ex) diff --git a/FFXIVAPP.Client/Memory/MonsterWorker.cs b/FFXIVAPP.Client/Memory/MonsterWorker.cs index 57d19b8a..d96f92be 100644 --- a/FFXIVAPP.Client/Memory/MonsterWorker.cs +++ b/FFXIVAPP.Client/Memory/MonsterWorker.cs @@ -40,7 +40,6 @@ using FFXIVAPP.Common.Core.Memory; using FFXIVAPP.Common.Core.Memory.Enums; using NLog; -using FFXIVAPP.Client.Delegates; namespace FFXIVAPP.Client.Memory { @@ -156,7 +155,7 @@ private void ScanTimerElapsed(object sender, ElapsedEventArgs e) #region ActorEntity Handlers - bool firstTime = true; + var firstTime = true; var monsterEntries = new List(); var pcEntries = new List(); diff --git a/FFXIVAPP.Client/Memory/PlayerInfoWorker.cs b/FFXIVAPP.Client/Memory/PlayerInfoWorker.cs index 3e2a1014..7ea8472c 100644 --- a/FFXIVAPP.Client/Memory/PlayerInfoWorker.cs +++ b/FFXIVAPP.Client/Memory/PlayerInfoWorker.cs @@ -131,7 +131,7 @@ private void ScanTimerElapsed(object sender, ElapsedEventArgs e) { ID = (uint) MemoryHandler.Instance.GetInt32(address), Name = MemoryHandler.Instance.GetString(address + 4), - Enmity = (uint)MemoryHandler.Instance.GetInt16(address + 72) + Enmity = (uint) MemoryHandler.Instance.GetInt16(address + 72) }; if (enmityEntry.ID > 0) { diff --git a/FFXIVAPP.Client/Memory/TargetWorker.cs b/FFXIVAPP.Client/Memory/TargetWorker.cs index 1214084b..eadf8f78 100644 --- a/FFXIVAPP.Client/Memory/TargetWorker.cs +++ b/FFXIVAPP.Client/Memory/TargetWorker.cs @@ -113,7 +113,7 @@ private void ScanTimerElapsed(object sender, ElapsedEventArgs e) { try { - var targetHateStructure = MemoryHandler.Instance.SigScanner.Locations["CHARMAP"] - 120584;// + 1136; + var targetHateStructure = MemoryHandler.Instance.SigScanner.Locations["CHARMAP"] - 120584; // + 1136; var enmityEntries = new List(); var targetEntity = new TargetEntity(); if (MemoryHandler.Instance.SigScanner.Locations.ContainsKey("TARGET")) diff --git a/distribution/FFXIVAPP.Client.exe b/distribution/FFXIVAPP.Client.exe index 89fa53a0b7fa5e92c36c6b06972801831b322a3f..4967eb5115e69ca5c386c15eed659541f4c950fd 100644 GIT binary patch delta 13451 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 delta 205 zcmZqpAlvXkc0vd9jFyXy-L2h>t=&vpyP1;@uyly}G;RNMfLTdQz)z{pPp-JvyZLBs zlwet}*mjlc%zs#Pfm%WsfPe{zWf&P4EPgRFSlnS|2nu!yZab>^EAZ?$?;V%!noIPs zTxH(wdxyE6h1;j8LzIDmkpW0=zy5%EGb67NgC2u17@9JeZJ+*#xgAYxy7m)hYe5uc ZAX_*8QOViR{&)%t5VLN7JcUj6F#rcBLi7Lt