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; } }