Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        /// <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);
        }