예제 #1
0
 /// <summary>
 /// </summary>
 /// <param name="sender"> </param>
 /// <param name="e"> </param>
 private void ScanTimerElapsed(object sender, ElapsedEventArgs e)
 {
     if (_isScanning)
     {
         return;
     }
     _isScanning = true;
     double refresh = 250;
     if (Double.TryParse(Settings.Default.ChatLogWorkerRefresh.ToString(CultureInfo.InvariantCulture), out refresh))
     {
         _scanTimer.Interval = refresh;
     }
     Func<bool> scannerWorker = delegate
     {
         if (MemoryHandler.Instance.SigScanner.Locations.ContainsKey("GAMEMAIN"))
         {
             if (MemoryHandler.Instance.SigScanner.Locations.ContainsKey("CHATLOG"))
             {
                 ChatPointerMap = MemoryHandler.Instance.SigScanner.Locations["CHATLOG"];
                 if (ChatPointerMap <= 20)
                 {
                     return false;
                 }
                 var buffered = new List<List<byte>>();
                 try
                 {
                     _indexes.Clear();
                     _chatLogPointers = MemoryHandler.Instance.GetStructure<Structures.ChatLog>(ChatPointerMap);
                     EnsureArrayIndexes();
                     var currentArrayIndex = (_chatLogPointers.OffsetArrayPos - _chatLogPointers.OffsetArrayStart) / 4;
                     if (FirstRun)
                     {
                         FirstRun = false;
                         _previousOffset = _indexes[(int) currentArrayIndex - 1];
                         _previousArrayIndex = (int) currentArrayIndex - 1;
                     }
                     else
                     {
                         if (currentArrayIndex < _previousArrayIndex)
                         {
                             buffered.AddRange(ResolveEntries(_previousArrayIndex, _chatLimit));
                             _previousOffset = 0;
                             _previousArrayIndex = 0;
                         }
                         if (_previousArrayIndex < currentArrayIndex)
                         {
                             buffered.AddRange(ResolveEntries(_previousArrayIndex, (int) currentArrayIndex));
                         }
                         _previousArrayIndex = (int) currentArrayIndex;
                     }
                 }
                 catch (Exception ex)
                 {
                 }
                 foreach (var bytes in buffered)
                 {
                     try
                     {
                         var chatLogEntry = ChatEntry.Process(bytes.ToArray());
                         if (Regex.IsMatch(chatLogEntry.Combined, @"[\w\d]{4}::?.+"))
                         {
                             AppContextHelper.Instance.RaiseNewChatLogEntry(chatLogEntry);
                         }
                     }
                     catch (Exception ex)
                     {
                     }
                 }
             }
             else
             {
                 try
                 {
                     ChatPointerMap = MemoryHandler.Instance.GetUInt32(MemoryHandler.Instance.SigScanner.Locations["GAMEMAIN"]) + 20;
                     MemoryHandler.Instance.SigScanner.Locations.Add("CHATLOG", ChatPointerMap);
                 }
                 catch (Exception ex)
                 {
                 }
             }
         }
         _isScanning = false;
         return true;
     };
     scannerWorker.BeginInvoke(delegate { }, scannerWorker);
 }
예제 #2
0
        /// <summary>
        /// </summary>
        /// <param name="sender"> </param>
        /// <param name="e"> </param>
        private void ScanTimerElapsed(object sender, ElapsedEventArgs e)
        {
            if (_isScanning)
            {
                return;
            }
            _isScanning = true;
            double refresh = 250;

            if (Double.TryParse(Settings.Default.ChatLogWorkerRefresh.ToString(CultureInfo.InvariantCulture), out refresh))
            {
                _scanTimer.Interval = refresh;
            }
            Func <bool> scannerWorker = delegate
            {
                if (MemoryHandler.Instance.SigScanner.Locations.ContainsKey("GAMEMAIN"))
                {
                    if (MemoryHandler.Instance.SigScanner.Locations.ContainsKey("CHATLOG"))
                    {
                        ChatPointerMap = MemoryHandler.Instance.SigScanner.Locations["CHATLOG"];
                        if (ChatPointerMap <= 20)
                        {
                            return(false);
                        }
                        var buffered = new List <List <byte> >();
                        try
                        {
                            _indexes.Clear();
                            _chatLogPointers = MemoryHandler.Instance.GetStructure <Structures.ChatLog>(ChatPointerMap);
                            EnsureArrayIndexes();
                            var currentArrayIndex = (_chatLogPointers.OffsetArrayPos - _chatLogPointers.OffsetArrayStart) / 4;
                            if (FirstRun)
                            {
                                FirstRun            = false;
                                _previousOffset     = _indexes[(int)currentArrayIndex - 1];
                                _previousArrayIndex = (int)currentArrayIndex - 1;
                            }
                            else
                            {
                                if (currentArrayIndex < _previousArrayIndex)
                                {
                                    buffered.AddRange(ResolveEntries(_previousArrayIndex, _chatLimit));
                                    _previousOffset     = 0;
                                    _previousArrayIndex = 0;
                                }
                                if (_previousArrayIndex < currentArrayIndex)
                                {
                                    buffered.AddRange(ResolveEntries(_previousArrayIndex, (int)currentArrayIndex));
                                }
                                _previousArrayIndex = (int)currentArrayIndex;
                            }
                        }
                        catch (Exception ex)
                        {
                        }
                        foreach (var bytes in buffered)
                        {
                            try
                            {
                                var chatLogEntry = ChatEntry.Process(bytes.ToArray());
                                if (Regex.IsMatch(chatLogEntry.Combined, @"[\w\d]{4}::?.+"))
                                {
                                    AppContextHelper.Instance.RaiseNewChatLogEntry(chatLogEntry);
                                }
                            }
                            catch (Exception ex)
                            {
                            }
                        }
                    }
                    else
                    {
                        try
                        {
                            ChatPointerMap = MemoryHandler.Instance.GetUInt32(MemoryHandler.Instance.SigScanner.Locations["GAMEMAIN"]) + 20;
                            MemoryHandler.Instance.SigScanner.Locations.Add("CHATLOG", ChatPointerMap);
                        }
                        catch (Exception ex)
                        {
                        }
                    }
                }
                _isScanning = false;
                return(true);
            };

            scannerWorker.BeginInvoke(delegate { }, scannerWorker);
        }