public static Boolean GetCoord(IntPtr oph, float x1, float y1, float z1)
        {
            //Расчитываем нынешние коорды персонажа
            float x2 = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsX);
            float y2 = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsY);
            float z2 = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsZ);

            //Сравниваем, достиг ли персонаж цели
            return(Math.Round(x1) == Math.Round(x2) && Math.Round(y1) == Math.Round(y2) && Math.Round(z1) == Math.Round(z2));
        }
        //конструктор
        public My_Windows(IntPtr handle)
        {
            this.handle = handle;
            //получаем id процесса по хендлу
            WinApi.GetWindowThreadProcessId(handle, out processID);
            //запускаем процесс и получаем его дескриптор
            oph = WinApi.OpenProcess(WinApi.ProcessAccessFlags.All, false, ProcessID);
            //создаем класс для отправки пакетов
            packetSend = new Packets(oph);
            //получаем имя персонажа для данного клиента
            name = CalcMethods.ReadString(oph, Offsets.BaseAdress, Offsets.OffsetsName);
            //узнаем wid
            wid = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsWid);
            //узнаем класс нашего персонажа
            classID = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsClassId);
            //читаем доступные скиллы-бафы
            int skillCount = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsSkillsCount);

            for (int s = 0; s < skillCount; s++)
            {
                int id = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsToIdSkill(s));
                if (skills_for_buf.Contains(id))
                {
                    if (id == 112 || id == 518 || id == 519 || id == 1980 || id == 1981 ||  //танк
                        id == 312 || id == 656 || id == 657 || id == 1984 || id == 1985 ||  //друид
                        id == 1811 || id == 1869)                                           //прист
                    {
                        changeForm = new Skill(id, s);
                        continue;
                    }
                    if (id == 1824)
                    {
                        shamansCall = new Skill(id, s);
                        continue;
                    }
                    my_skills_for_buf.Add(new Skill(id, s));
                }
            }
            //узнаем координаты
            x = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsX) / 10 + 400;
            y = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsY) / 10 + 550;
            z = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsZ) / 10;
            //выбираем картинку для нашего персонажа
            Select_Image(classID);
            //указываем состояние
            stateThread = StateEnum.stop;
            //создаем поток для окна
            this.BackgroundWorker5 = new BackgroundWorker();
            this.BackgroundWorker5.WorkerSupportsCancellation = true;
            this.BackgroundWorker5.DoWork += new DoWorkEventHandler(this.backgroundWorker5_DoWork);
        }
 /// <summary>
 /// Остановиться
 /// </summary>
 /// <param name="processID"></param>
 public static void Stop(IntPtr oph)
 {
     try
     {
         //Расчитываем нынешние коорды персонажа
         float x = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsX);
         float y = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsY);
         float z = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsZ);
         //узнаем состояние: 0 - земля, 1 - вода, 2 - воздух
         int walk_mode = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsWalkMode);
         //юзаем инжект
         Injects.WalkTo(oph, x, y, z, walk_mode);
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
 /// <summary>
 /// Бот движется по указанному адресу, но не более 60 секунд.
 /// </summary>
 /// <param name="oph"></param>
 /// <param name="x"></param>
 /// <param name="y"></param>
 /// <param name="z"></param>
 public static void MoveTo(IntPtr oph, float x, float y, float z)
 {
     try
     {
         //узнаем состояние: 0 - земля, 1 - вода, 2 - воздух
         Int32 walk_mode = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsWalkMode);
         //юзаем инжект движения
         Injects.WalkTo(oph, x, y, z, walk_mode);
         //Расчитываем нынешние коорды персонажа
         float x_temp = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsX);
         float y_temp = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsY);
         float z_temp = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsZ);
         //в цикле проверяем, достиг ли персонаж цели и не застрял ли он
         Int32 iter = 0;
         while (!CalcMethods.GetCoord(oph, x, y, z))
         {
             Thread.Sleep(1000);
             //если персонаж встал на месте, то подтолкнем его еще раз
             if (CalcMethods.GetCoord(oph, x_temp, y_temp, z_temp))
             {
                 Injects.WalkTo(oph, x, y, z, walk_mode);
             }
             //если персонаж двигается, то перезаписываем его координаты
             else
             {
                 x_temp = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsX);
                 y_temp = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsY);
                 z_temp = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsZ);
             }
             iter++;
             //если бот бежит дольше минуты, то прекращаем бежать
             if (iter > 60)
             {
                 break;
             }
         }
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }