private void _checkTimer_Tick(object sender, EventArgs e) { Dota2Classes.PlayerResources playerResourceObject; try { if (_processMemory.ReadInt32Ptr(_dotaPlayerAddress) == IntPtr.Zero) { return; } var playerResourcePtr = _processMemory.ReadInt32Ptr(_playerResourceAddress); if (playerResourcePtr == IntPtr.Zero) { return; } playerResourceObject = new Dota2Classes.PlayerResources(_processMemory, playerResourcePtr); } catch (ApplicationException) { _checkTimer.Stop(); _searchTimer.Start(); return; } var numHeroes = 0; var container = new StackPanel { Margin = new Thickness(0) }; var playerList = new Dota2Classes.PlayerList(_processMemory, _playersListAddress); var entityList = new Dota2Classes.EntityList(_processMemory, _engineAddress); for (var i = 0; i < 32; i++) { var dotaPlayer = playerList.GetPlayerById(i); if (dotaPlayer == null) { continue; } var playerId = dotaPlayer.PlayerId; var hero = entityList.GetHeroById(dotaPlayer.EntityId); float mana = hero.Mana; float health = hero.Health; int level = hero.Level; int gold = playerResourceObject.GetGold(playerId); if (playerResourceObject.IsValidPlayer(playerId) == false) { continue; } Dota2Classes.Inventory inventory = hero.Inventory; var items = new List <Dota2Classes.Item>(); for (var j = 0; j < 6; j++) { var itemEntityId = inventory.GetItemIdByIndex(j); if (itemEntityId <= 0) { continue; } var item = entityList.GetItemById(itemEntityId); if (item == null) { continue; } items.Add(item); } var semiTransparentControl = new Grid { Margin = new Thickness(0, 5, 0, 0), Height = 60, Width = 130, Background = new SolidColorBrush(Color.FromArgb(100, 0, 0, 0)) }; semiTransparentControl.Children.Add(new Label { Content = string.Format("{0}", level), Margin = new Thickness(0, 0, 0, 0), Foreground = Brushes.White, }); semiTransparentControl.Children.Add(new Label { Content = string.Format("{0}", playerResourceObject.GetPlayerName(playerId)), Margin = new Thickness(25, 0, 0, 0), Foreground = Brushes.White, }); var stackImage = new StackPanel { Margin = new Thickness(0, 30, 0, 0), Orientation = Orientation.Horizontal, }; foreach (Dota2Classes.Items itemType in Enum.GetValues(typeof(Dota2Classes.Items))) { var item = items.Find(x => x.ItemId == itemType); if (item != null) { stackImage.Children.Add(GetItemControl(item)); } } semiTransparentControl.Children.Add(stackImage); semiTransparentControl.Children.Add(new Label { Content = string.Format("{0:0}", mana), Margin = new Thickness(30, 15, 0, 0), Foreground = Brushes.LightBlue }); semiTransparentControl.Children.Add(new Label { Content = string.Format("{0}", health), Margin = new Thickness(0, 15, 0, 0), Foreground = health < 500 ? Brushes.OrangeRed : Brushes.GreenYellow }); semiTransparentControl.Children.Add(new Label { Content = string.Format("{0}", gold), Margin = new Thickness(60, 15, 0, 0), Foreground = Brushes.Gold }); container.Children.Add(semiTransparentControl); numHeroes++; } _playersOverlay.Content = container; _playersOverlay.Height = 100 + numHeroes * 70; _playersOverlay.Width = 120; int index = _processMemory.ReadInt16(_processMemory.ReadInt32Ptr(_dotaPlayerAddress) + 0x19A4); _heroAddress = _processMemory.ReadInt32Ptr(_engineAddress + index * 16); _isVisibleOverlay.Background = _processMemory.ReadBytes(_heroAddress + 0x12E0, 1)[0] == 30 ? Brushes.Red : Brushes.Green; distanceUpDown.Value = _processMemory.ReadInt32(_distanceAddress); fovUpDown.Value = (int?)_processMemory.ReadFloat(_fovAddress); rangeCheckbox.IsChecked = _processMemory.ReadInt32(_rangeAddress) == 816; }
/// <summary> /// ログ情報を探索する /// </summary> /// <returns></returns> public bool SearchLogMemoryInfo() { //プログレス Progress = 0; //debug DateTime st = DateTime.Now; List <Memory.MEMORY_BASIC_INFORMATION> WRMemoryInfoList = new List <Memory.MEMORY_BASIC_INFORMATION>(); Memory memory = new Memory(); foreach (Memory.MEMORY_BASIC_INFORMATION m in ffxiv.GetMemoryBasicInfos()) { if (m.Type != (uint)Memory.MEMORY_TYPE.MEM_PRIVATE || m.Protect != Memory.MEMORY_ALLOCATION_PROTECT.PAGE_READWRITE) { continue; } //Write Read属性のメモリinfoをリスト化 WRMemoryInfoList.Add(m); } WRMemoryInfoList.Sort((a, b) => (int)a.BaseAddress - (int)b.BaseAddress); Regex logRegex = new Regex("[0-9A-F]{12}:[^\x00]{0,36}:[^\x00]*?[0-9A-F]{12}:[^\x00]{0,36}"); int prog = 0; foreach (Memory.MEMORY_BASIC_INFORMATION m in WRMemoryInfoList) { //プログレス Progress = 100 * prog++ / WRMemoryInfoList.Count; //キャンセル可能 if (IsCancelPending) { IsCancelPending = false; return(false); } // 1 "::Welcome to Masamune ! 「等」を探す byte[] buffer = ffxiv.ReadBytes((int)m.BaseAddress, (int)m.RegionSize); string str = ASCIIEncoding.ASCII.GetString(buffer); if (!str.Contains(":")) { continue; } //Welcome to を取得 //if (Encoding.ASCII.GetString(buffer).Contains("::Welcome to")) MatchCollection matches = logRegex.Matches(str); foreach (Match match in matches) { //キャンセル可能 if (IsCancelPending) { IsCancelPending = false; return(false); } string TimstampHexString = match.Value.Substring(0, 8); DateTime datetime = FFXIVLog.StartDateTime.AddSeconds(Convert.ToInt32(TimstampHexString, 16)); if (datetime < new DateTime(2013, 8, 29) || datetime > DateTime.Now.ToUniversalTime()) { continue; } //"::Welcome to"のアドレス int offset = match.Index; if (offset < 12) { continue; } //ログの開始アドレス int ptr_logStart = (int)m.BaseAddress + offset;// //ログを取得して正規表現でチェック byte[] data = ffxiv.ReadBytes(ptr_logStart, 100); //ptr_LogStartRegexが格納されているアドレスをサーチする foreach (Memory.MEMORY_BASIC_INFORMATION _m in WRMemoryInfoList) { byte[] _buffer = ffxiv.ReadBytes((int)_m.BaseAddress, (int)_m.RegionSize); MemoryStream ms = new MemoryStream(_buffer); BinaryReader br = new BinaryReader(ms); while (ms.Position < _buffer.Length - 4) { if (ptr_logStart == br.ReadInt32())//アドレス格納先? { int c_ptr_LogEnd = br.ReadInt32(); if (c_ptr_LogEnd >= ptr_logStart && c_ptr_LogEnd <= (int)m.BaseAddress + (int)m.RegionSize) { //見つけた! LogEntPtr = (int)_m.BaseAddress + (int)ms.Position - 8; LogCurrentPtr = LogEntPtr + 4; LogIndexPtr = LogEntPtr - 0x10; LogCountPtr = LogEntPtr - 0x30; try { GetLogsData(); DateTime fini = DateTime.Now; System.Diagnostics.Debug.WriteLine((fini - st).TotalSeconds); return(true); } catch { } } } } } } } //みつからなかった return(false); }